scorm-again 3.0.1 → 3.0.2
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/dist/aicc.js.map +1 -0
- package/dist/aicc.min.js.map +1 -0
- package/dist/cross-frame-api.js +26 -11
- package/dist/cross-frame-api.js.map +1 -0
- package/dist/cross-frame-api.min.js +1 -1
- package/dist/cross-frame-api.min.js.map +1 -0
- package/dist/cross-frame-lms.js +16 -4
- package/dist/cross-frame-lms.js.map +1 -0
- package/dist/cross-frame-lms.min.js +1 -1
- package/dist/cross-frame-lms.min.js.map +1 -0
- package/dist/esm/aicc.js.map +1 -0
- package/dist/esm/aicc.min.js.map +1 -0
- package/dist/esm/cross-frame-api.js +115 -108
- package/dist/esm/cross-frame-api.js.map +1 -0
- package/dist/esm/cross-frame-api.min.js +1 -1
- package/dist/esm/cross-frame-api.min.js.map +1 -0
- package/dist/esm/cross-frame-lms.js +32 -30
- package/dist/esm/cross-frame-lms.js.map +1 -0
- package/dist/esm/cross-frame-lms.min.js +1 -1
- package/dist/esm/cross-frame-lms.min.js.map +1 -0
- package/dist/esm/scorm-again.js +761 -500
- package/dist/esm/scorm-again.js.map +1 -0
- package/dist/esm/scorm-again.min.js +1 -1
- package/dist/esm/scorm-again.min.js.map +1 -0
- package/dist/esm/scorm12.js +152 -373
- package/dist/esm/scorm12.js.map +1 -0
- package/dist/esm/scorm12.min.js +1 -1
- package/dist/esm/scorm12.min.js.map +1 -0
- package/dist/esm/scorm2004.js +539 -306
- package/dist/esm/scorm2004.js.map +1 -0
- package/dist/esm/scorm2004.min.js +1 -1
- package/dist/esm/scorm2004.min.js.map +1 -0
- package/dist/scorm-again.js +1162 -328
- package/dist/scorm-again.js.map +1 -0
- package/dist/scorm-again.min.js +1 -1
- package/dist/scorm-again.min.js.map +1 -0
- package/dist/scorm12.js +832 -71
- package/dist/scorm12.js.map +1 -0
- package/dist/scorm12.min.js +1 -1
- package/dist/scorm12.min.js.map +1 -0
- package/dist/scorm2004.js +1035 -286
- package/dist/scorm2004.js.map +1 -0
- package/dist/scorm2004.min.js +1 -1
- package/dist/scorm2004.min.js.map +1 -0
- package/dist/types/BaseAPI.d.ts +3 -3
- package/dist/types/interfaces/services.d.ts +3 -2
- package/dist/types/services/EventService.d.ts +3 -3
- package/package.json +30 -37
package/dist/aicc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aicc.js","sources":["../src/constants/api_constants.ts","../src/constants/error_codes.ts","../src/constants/regex.ts","../src/exceptions.ts","../src/exceptions/scorm12_exceptions.ts","../src/cmi/common/base_cmi.ts","../src/utilities.ts","../src/cmi/common/validation.ts","../src/cmi/scorm12/validation.ts","../src/services/ValidationService.ts","../src/cmi/common/score.ts","../src/cmi/aicc/core.ts","../src/cmi/common/array.ts","../src/cmi/scorm12/objectives.ts","../src/cmi/scorm12/student_data.ts","../src/cmi/scorm12/student_preference.ts","../src/cmi/scorm12/interactions.ts","../src/cmi/scorm12/cmi.ts","../src/cmi/scorm12/nav.ts","../src/constants/enums.ts","../src/constants/default_settings.ts","../src/types/scheduled_commit.ts","../src/services/HttpService.ts","../src/services/EventService.ts","../src/services/SerializationService.ts","../src/services/LoggingService.ts","../src/services/ErrorHandlingService.ts","../src/services/OfflineStorageService.ts","../src/BaseAPI.ts","../src/Scorm12API.ts","../src/exceptions/aicc_exceptions.ts","../src/cmi/aicc/validation.ts","../src/cmi/aicc/evaluation.ts","../src/cmi/aicc/student_preferences.ts","../src/cmi/aicc/student_demographics.ts","../src/cmi/aicc/tries.ts","../src/cmi/aicc/attempts.ts","../src/cmi/aicc/student_data.ts","../src/cmi/aicc/paths.ts","../src/cmi/aicc/cmi.ts","../src/AICC.ts"],"sourcesContent":["interface ErrorDescription {\n basicMessage: string;\n detailMessage: string;\n}\n\ninterface ErrorDescriptions {\n [key: string]: ErrorDescription;\n}\n\ninterface ScormConstants {\n cmi_children: string;\n core_children: string;\n score_children: string;\n comments_children: string;\n objectives_children: string;\n correct_responses_children: string;\n student_data_children: string;\n student_preference_children: string;\n interactions_children: string;\n error_descriptions: ErrorDescriptions;\n}\n\ninterface AiccConstants extends ScormConstants {\n student_demographics_children: string;\n tries_children: string;\n attempt_records_children: string;\n paths_children: string;\n}\n\ninterface Scorm2004Constants {\n cmi_children: string;\n comments_children: string;\n score_children: string;\n objectives_children: string;\n correct_responses_children: string;\n student_data_children: string;\n student_preference_children: string;\n interactions_children: string;\n adl_data_children: string;\n error_descriptions: ErrorDescriptions;\n}\n\ninterface GlobalConstants {\n SCORM_TRUE: string;\n SCORM_FALSE: string;\n STATE_NOT_INITIALIZED: number;\n STATE_INITIALIZED: number;\n STATE_TERMINATED: number;\n}\n\nexport const global_constants: GlobalConstants = {\n SCORM_TRUE: \"true\",\n SCORM_FALSE: \"false\",\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n};\n\nexport const scorm12_constants: ScormConstants = {\n // Children lists\n cmi_children:\n \"core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions\",\n core_children:\n \"student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time\",\n score_children: \"raw,min,max\",\n comments_children: \"content,location,time\",\n objectives_children: \"id,score,status\",\n correct_responses_children: \"pattern\",\n student_data_children: \"mastery_score,max_time_allowed,time_limit_action\",\n student_preference_children: \"audio,language,speed,text\",\n interactions_children:\n \"id,objectives,time,type,correct_responses,weighting,student_response,result,latency\",\n error_descriptions: {\n \"101\": {\n basicMessage: \"General Exception\",\n detailMessage: \"No specific error code exists to describe the error.\",\n },\n \"201\": {\n basicMessage: \"Invalid argument error\",\n detailMessage:\n \"Indicates that an argument represents an invalid data model element or is otherwise incorrect.\",\n },\n \"202\": {\n basicMessage: \"Element cannot have children\",\n detailMessage:\n 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n \"203\": {\n basicMessage: \"Element not an array - cannot have count\",\n detailMessage:\n 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n \"301\": {\n basicMessage: \"Not initialized\",\n detailMessage: \"Indicates that an API call was made before the call to lmsInitialize.\",\n },\n \"401\": {\n basicMessage: \"Not implemented error\",\n detailMessage:\n \"The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.\",\n },\n \"402\": {\n basicMessage: \"Invalid set value, element is a keyword\",\n detailMessage:\n 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n \"403\": {\n basicMessage: \"Element is read only\",\n detailMessage: \"LMSSetValue was called with a data model element that can only be read.\",\n },\n \"404\": {\n basicMessage: \"Element is write only\",\n detailMessage: \"LMSGetValue was called on a data model element that can only be written to.\",\n },\n \"405\": {\n basicMessage: \"Incorrect Data Type\",\n detailMessage:\n \"LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.\",\n },\n \"407\": {\n basicMessage: \"Element Value Out Of Range\",\n detailMessage:\n \"The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.\",\n },\n \"408\": {\n basicMessage: \"Data Model Dependency Not Established\",\n detailMessage:\n \"Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.\",\n },\n },\n};\nexport const aicc_constants: AiccConstants = {\n ...scorm12_constants,\n ...{\n cmi_children:\n \"core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation\",\n student_preference_children:\n \"audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows\",\n student_data_children: \"attempt_number,tries,mastery_score,max_time_allowed,time_limit_action\",\n student_demographics_children:\n \"city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience\",\n tries_children: \"time,status,score\",\n attempt_records_children: \"score,lesson_status\",\n paths_children: \"location_id,date,time,status,why_left,time_in_element\",\n },\n};\n\nexport const scorm2004_constants: Scorm2004Constants = {\n // Children lists\n cmi_children:\n \"_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time\",\n comments_children: \"comment,timestamp,location\",\n score_children: \"max,raw,scaled,min\",\n objectives_children: \"progress_measure,completion_status,success_status,description,score,id\",\n correct_responses_children: \"pattern\",\n student_data_children: \"mastery_score,max_time_allowed,time_limit_action\",\n student_preference_children: \"audio_level,audio_captioning,delivery_speed,language\",\n interactions_children:\n \"id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description\",\n adl_data_children: \"id,store\",\n error_descriptions: {\n \"0\": {\n basicMessage: \"No Error\",\n detailMessage: \"No error occurred, the previous API call was successful.\",\n },\n \"101\": {\n basicMessage: \"General Exception\",\n detailMessage: \"No specific error code exists to describe the error.\",\n },\n \"102\": {\n basicMessage: \"General Initialization Failure\",\n detailMessage: \"Call to Initialize failed for an unknown reason.\",\n },\n \"103\": {\n basicMessage: \"Already Initialized\",\n detailMessage: \"Call to Initialize failed because Initialize was already called.\",\n },\n \"104\": {\n basicMessage: \"Content Instance Terminated\",\n detailMessage: \"Call to Initialize failed because Terminate was already called.\",\n },\n \"111\": {\n basicMessage: \"General Termination Failure\",\n detailMessage: \"Call to Terminate failed for an unknown reason.\",\n },\n \"112\": {\n basicMessage: \"Termination Before Initialization\",\n detailMessage: \"Call to Terminate failed because it was made before the call to Initialize.\",\n },\n \"113\": {\n basicMessage: \"Termination After Termination\",\n detailMessage: \"Call to Terminate failed because Terminate was already called.\",\n },\n \"122\": {\n basicMessage: \"Retrieve Data Before Initialization\",\n detailMessage: \"Call to GetValue failed because it was made before the call to Initialize.\",\n },\n \"123\": {\n basicMessage: \"Retrieve Data After Termination\",\n detailMessage: \"Call to GetValue failed because it was made after the call to Terminate.\",\n },\n \"132\": {\n basicMessage: \"Store Data Before Initialization\",\n detailMessage: \"Call to SetValue failed because it was made before the call to Initialize.\",\n },\n \"133\": {\n basicMessage: \"Store Data After Termination\",\n detailMessage: \"Call to SetValue failed because it was made after the call to Terminate.\",\n },\n \"142\": {\n basicMessage: \"Commit Before Initialization\",\n detailMessage: \"Call to Commit failed because it was made before the call to Initialize.\",\n },\n \"143\": {\n basicMessage: \"Commit After Termination\",\n detailMessage: \"Call to Commit failed because it was made after the call to Terminate.\",\n },\n \"201\": {\n basicMessage: \"General Argument Error\",\n detailMessage:\n \"An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.\",\n },\n \"301\": {\n basicMessage: \"General Get Failure\",\n detailMessage:\n \"Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"351\": {\n basicMessage: \"General Set Failure\",\n detailMessage:\n \"Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"391\": {\n basicMessage: \"General Commit Failure\",\n detailMessage:\n \"Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.\",\n },\n \"401\": {\n basicMessage: \"Undefined Data Model Element\",\n detailMessage:\n \"The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.\",\n },\n \"402\": {\n basicMessage: \"Unimplemented Data Model Element\",\n detailMessage:\n \"The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.\",\n },\n \"403\": {\n basicMessage: \"Data Model Element Value Not Initialized\",\n detailMessage:\n \"Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.\",\n },\n \"404\": {\n basicMessage: \"Data Model Element Is Read Only\",\n detailMessage: \"SetValue was called with a data model element that can only be read.\",\n },\n \"405\": {\n basicMessage: \"Data Model Element Is Write Only\",\n detailMessage: \"GetValue was called on a data model element that can only be written to.\",\n },\n \"406\": {\n basicMessage: \"Data Model Element Type Mismatch\",\n detailMessage:\n \"SetValue was called with a value that is not consistent with the data format of the supplied data model element.\",\n },\n \"407\": {\n basicMessage: \"Data Model Element Value Out Of Range\",\n detailMessage:\n \"The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.\",\n },\n \"408\": {\n basicMessage: \"Data Model Dependency Not Established\",\n detailMessage:\n \"Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.\",\n },\n },\n};\n","export type ErrorCode = {\n [key: string]: number;\n};\n\nexport const global_errors: ErrorCode = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nexport const scorm12_errors: ErrorCode = {\n ...global_errors,\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n};\n\nexport const scorm2004_errors: ErrorCode = {\n ...global_errors,\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATION: 113,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n};\n","export const scorm12_regex = {\n CMIString256: \"^[\\\\s\\\\S]{0,255}$\",\n CMIString4096: \"^[\\\\s\\\\S]{0,4096}$\",\n CMITime: \"^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$\",\n CMITimespan: \"^([0-9]{2,}):([0-9]{2}):([0-9]{2})(.[0-9]{1,2})?$\",\n\n CMIInteger: \"^\\\\d+$\",\n CMISInteger: \"^-?([0-9]+)$\",\n CMIDecimal: \"^-?([0-9]{0,3})(\\\\.[0-9]*)?$\",\n\n CMIIdentifier: \"^[\\\\u0021-\\\\u007E\\\\s]{0,255}$\",\n // Allow storing larger responses for interactions\n // Some content packages may exceed the 255 character limit\n // defined in the SCORM 1.2 specification. The previous\n // expression truncated these values which resulted in\n // a \"101: General Exception\" being thrown when long\n // answers were supplied. To support these packages we\n // relax the limitation and accept any length string.\n CMIFeedback: \"^.*$\",\n // This must be redefined\n CMIIndex: \"[._](\\\\d+).\",\n // Vocabulary Data Type Definition\n CMIStatus: \"^(passed|completed|failed|incomplete|browsed)$\",\n CMIStatus2: \"^(passed|completed|failed|incomplete|browsed|not attempted)$\",\n CMIExit: \"^(time-out|suspend|logout|)$\",\n CMIType: \"^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$\",\n CMIResult: \"^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\\\.[0-9]*)?)$\",\n NAVEvent:\n \"^(previous|continue|start|resumeAll|choice|jump|exit|exitAll|abandon|abandonAll|suspendAll|retry|retryAll|_none_)$\",\n // Data ranges\n score_range: \"0#100\",\n audio_range: \"-1#100\",\n speed_range: \"-100#100\",\n weighting_range: \"-100#100\",\n text_range: \"-1#1\",\n};\nexport const aicc_regex = {\n ...scorm12_regex,\n ...{\n // AICC identifiers may contain letters, numbers, underscores,\n // periods, and hyphens up to 255 characters in length.\n // The previous expression only allowed \"\\w\" characters which\n // excluded periods and hyphens.\n CMIIdentifier: \"^[A-Za-z0-9._-]{1,255}$\",\n },\n};\nexport const scorm2004_regex = {\n CMIString200: \"^[\\\\u0000-\\\\uFFFF]{0,200}$\",\n CMIString250: \"^[\\\\u0000-\\\\uFFFF]{0,250}$\",\n CMIString1000: \"^[\\\\u0000-\\\\uFFFF]{0,1000}$\",\n CMIString4000: \"^[\\\\u0000-\\\\uFFFF]{0,4000}$\",\n CMIString64000: \"^[\\\\u0000-\\\\uFFFF]{0,64000}$\",\n CMILang: \"^([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?$|^$\",\n\n CMILangString250: \"^({lang=([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?})?((?!{.*$).{0,250}$)?$\",\n\n CMILangcr: \"^(({lang=([a-zA-Z]{2,3}|i|x)?(-[a-zA-Z0-9-]{2,8})?}))(.*?)$\",\n\n CMILangString250cr: \"^(({lang=([a-zA-Z]{2,3}|i|x)?(-[a-zA-Z0-9-]{2,8})?})?(.{0,250})?)?$\",\n\n CMILangString4000: \"^({lang=([a-zA-Z]{2,3}|i|x)(-[a-zA-Z0-9-]{2,8})?})?((?!{.*$).{0,4000}$)?$\",\n\n CMITime:\n \"^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,6})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$\",\n CMITimespan:\n \"^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$\",\n CMIInteger: \"^\\\\d+$\",\n CMISInteger: \"^-?([0-9]+)$\",\n CMIDecimal: \"^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$\",\n CMIIdentifier: \"^\\\\S{1,250}[a-zA-Z0-9]$\",\n CMIShortIdentifier: \"^[\\\\w\\\\.\\\\-\\\\_]{1,250}$\",\n CMILongIdentifier: \"^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000}|.{1,4000})$\",\n // need to re-examine this\n CMIFeedback: \"^.*$\",\n // This must be redefined\n CMIIndex: \"[._](\\\\d+).\",\n CMIIndexStore: \".N(\\\\d+).\",\n // Vocabulary Data Type Definition\n CMICStatus: \"^(completed|incomplete|not attempted|unknown)$\",\n CMISStatus: \"^(passed|failed|unknown)$\",\n CMIExit: \"^(time-out|suspend|logout|normal)$\",\n CMIType:\n \"^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$\",\n CMIResult: \"^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$\",\n NAVEvent:\n \"^(start|resumeAll|previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|retry|retryAll|_none_|(\\\\{target=(?<choice_target>\\\\S{0,}[a-zA-Z0-9-_]+)})?choice|(\\\\{target=(?<jump_target>\\\\S{0,}[a-zA-Z0-9-_]+)})?jump)$\",\n\n NAVBoolean: \"^(unknown|true|false)$\",\n NAVTarget: \"^{target=\\\\S{0,}[a-zA-Z0-9-_]+}$\",\n // Data ranges\n scaled_range: \"-1#1\",\n audio_range: \"0#999.9999999\",\n speed_range: \"0#999.9999999\",\n text_range: \"-1#1\",\n progress_range: \"0#1\",\n};\n","type APIError = {\n errorCode: number;\n errorMessage: string;\n detailedMessage: string;\n};\n\nexport class BaseScormValidationError extends Error {\n constructor(CMIElement: string, errorCode: number) {\n super(`${CMIElement} : ${errorCode.toString()}`);\n this._errorCode = errorCode;\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, BaseScormValidationError.prototype);\n }\n\n private readonly _errorCode: number;\n\n /**\n * Getter for _errorCode\n * @return {number}\n */\n get errorCode(): number {\n return this._errorCode;\n }\n}\n\n/**\n * Base Validation Exception\n */\nexport class ValidationError extends BaseScormValidationError implements APIError {\n /**\n * Constructor to take in an error message and code\n * @param {string} CMIElement\n * @param {number} errorCode\n * @param {string} errorMessage\n * @param {string} detailedMessage\n */\n constructor(\n CMIElement: string,\n errorCode: number,\n errorMessage: string,\n detailedMessage?: string,\n ) {\n super(CMIElement, errorCode);\n this.message = `${CMIElement} : ${errorMessage}`;\n this._errorMessage = errorMessage;\n if (detailedMessage) {\n this._detailedMessage = detailedMessage;\n }\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n\n private readonly _errorMessage: string;\n private readonly _detailedMessage: string = \"\";\n\n /**\n * Getter for _errorMessage\n * @return {string}\n */\n get errorMessage(): string {\n return this._errorMessage;\n }\n\n /**\n * Getter for _detailedMessage\n * @return {string}\n */\n get detailedMessage(): string {\n return this._detailedMessage;\n }\n}\n","import { ValidationError } from \"../exceptions\";\nimport { scorm12_constants } from \"../constants/api_constants\";\n\nconst scorm12_errors = scorm12_constants.error_descriptions;\n\n/**\n * SCORM 1.2 Validation Error\n */\nexport class Scorm12ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {string} CMIElement\n * @param {number} errorCode\n */\n constructor(CMIElement: string, errorCode: number) {\n if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {\n super(\n CMIElement,\n errorCode,\n scorm12_errors[String(errorCode)]?.basicMessage || \"Unknown error\",\n scorm12_errors[String(errorCode)]?.detailMessage,\n );\n } else {\n super(\n CMIElement,\n 101,\n scorm12_errors[\"101\"]?.basicMessage ?? \"General error\",\n scorm12_errors[\"101\"]?.detailMessage,\n );\n }\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, Scorm12ValidationError.prototype);\n }\n}\n","/**\n * Base class for API cmi objects\n */\nexport abstract class BaseCMI {\n jsonString = false;\n protected readonly _cmi_element: string;\n protected _initialized = false;\n\n /**\n * Constructor for BaseCMI\n * @param {string} cmi_element\n */\n constructor(cmi_element: string) {\n this._cmi_element = cmi_element;\n }\n\n /**\n * Getter for _initialized\n * @return {boolean}\n */\n get initialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize(): void {\n this._initialized = true;\n }\n\n abstract reset(): void;\n}\n\n/**\n * Base class for cmi root objects\n */\nexport abstract class BaseRootCMI extends BaseCMI {\n protected _start_time: number | undefined;\n\n /**\n * Start time of the course\n * @type {number | undefined}\n * @protected\n */\n get start_time(): number | undefined {\n return this._start_time;\n }\n\n /**\n * Setter for start_time. Can only be called once.\n */\n setStartTime(): void {\n if (this._start_time === undefined) {\n this._start_time = new Date().getTime();\n } else {\n throw new Error(\"Start time has already been set.\");\n }\n }\n\n abstract getCurrentTotalTime(): string;\n}\n","/**\n * Constants for time conversion calculations.\n * These are used throughout the codebase for converting between different time formats.\n */\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\ntype Designation = {\n [key: string]: number;\n};\n\n/**\n * A record with string keys and unknown values.\n * This is a more type-safe alternative to using `any`.\n */\nexport type StringKeyMap = Record<string, unknown>;\n\nconst designations: Designation = {\n D: SECONDS_PER_DAY,\n H: SECONDS_PER_HOUR,\n M: SECONDS_PER_MINUTE,\n S: SECONDS_PER_SECOND,\n};\n\n/**\n * Converts a number of seconds to a formatted time string in HH:MM:SS format.\n * This function handles decimal seconds and ensures proper formatting with leading zeros.\n *\n * @param {number|null} totalSeconds - The total number of seconds to convert. If null or negative, returns \"00:00:00\".\n * @return {string} A formatted time string in HH:MM:SS format, with up to 2 decimal places for seconds if applicable.\n *\n * @example\n * // Returns \"01:30:45\"\n * getSecondsAsHHMMSS(5445);\n *\n * @example\n * // Returns \"00:00:30.5\"\n * getSecondsAsHHMMSS(30.5);\n *\n * @example\n * // Returns \"00:00:00\"\n * getSecondsAsHHMMSS(null);\n */\nexport const getSecondsAsHHMMSS = memoize((totalSeconds: number | null): string => {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return \"00:00:00\";\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds();\n const ms = totalSeconds % 1.0;\n let msStr = \"\";\n\n if (countDecimals(ms) > 0) {\n if (countDecimals(ms) > 2) {\n msStr = ms.toFixed(2);\n } else {\n msStr = String(ms);\n }\n\n msStr = \".\" + msStr.split(\".\")[1];\n }\n\n return (hours + \":\" + minutes + \":\" + seconds).replace(/\\b\\d\\b/g, \"0$&\") + msStr;\n});\n\n/**\n * Converts a number of seconds to an ISO 8601 duration string (e.g., \"PT1H30M45S\").\n * This function handles the complexity of formatting according to the ISO 8601 standard,\n * including the proper placement of the \"T\" separator for time components.\n *\n * @param {number|null} seconds - The number of seconds to convert. If null or negative, returns \"PT0S\".\n * @return {string} An ISO 8601 formatted duration string.\n *\n * @example\n * // Returns \"PT1H30M45S\" (1 hour, 30 minutes, 45 seconds)\n * getSecondsAsISODuration(5445);\n *\n * @example\n * // Returns \"PT30.5S\" (30.5 seconds)\n * getSecondsAsISODuration(30.5);\n *\n * @example\n * // Returns \"P1DT1H\" (1 day, 1 hour)\n * getSecondsAsISODuration(90000);\n *\n * @example\n * // Returns \"PT0S\" (0 seconds)\n * getSecondsAsISODuration(null);\n */\nexport const getSecondsAsISODuration = memoize((seconds: number | null): string => {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return \"PT0S\";\n }\n\n let duration = \"P\";\n let remainder = seconds;\n\n // Convert to array of entries and use functional methods\n const designationEntries = Object.entries(designations);\n\n // Process each time designation\n designationEntries.forEach(([designationsKey, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n remainder = remainder % current_seconds;\n\n // Limit decimal places\n if (countDecimals(remainder) > 2) {\n remainder = Number(Number(remainder).toFixed(2));\n }\n\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (designationsKey === \"S\" && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n // Add the 'T' separator for time components if needed\n const needsTimeSeparator =\n (duration.indexOf(\"D\") > 0 || [\"H\", \"M\", \"S\"].includes(designationsKey)) &&\n duration.indexOf(\"T\") === -1;\n\n if (needsTimeSeparator) {\n duration += \"T\";\n }\n\n duration += `${value}${designationsKey}`;\n }\n });\n\n return duration;\n});\n\n/**\n * Converts a time string in HH:MM:SS format to the equivalent number of seconds.\n * This function is flexible and can handle various input types, converting them to strings as needed.\n *\n * @param {string|number|boolean|null} timeString - The time string to convert, typically in HH:MM:SS format.\n * If not a string, it will be converted to one.\n * If null, invalid, or doesn't match the regex, returns 0.\n * @param {RegExp|string} timeRegex - The regular expression used to validate the time string format.\n * If a string is provided, it will be converted to a RegExp.\n * @return {number} The total number of seconds represented by the time string.\n *\n * @example\n * // Returns 5445 (1 hour, 30 minutes, 45 seconds)\n * getTimeAsSeconds(\"01:30:45\", /^(\\d+):(\\d+):(\\d+)$/);\n *\n * @example\n * // Returns 0 (invalid format)\n * getTimeAsSeconds(\"invalid\", /^(\\d+):(\\d+):(\\d+)$/);\n *\n * @example\n * // Returns 30 (converts number to string \"30\" then parses as 0:0:30)\n * getTimeAsSeconds(30, /^(\\d+):(\\d+):(\\d+)$/);\n */\nexport const getTimeAsSeconds = memoize(\n (timeString: string | number | boolean | null, timeRegex: RegExp | string): number => {\n if (typeof timeString === \"number\" || typeof timeString === \"boolean\") {\n timeString = String(timeString);\n }\n if (typeof timeRegex === \"string\") {\n timeRegex = new RegExp(timeRegex);\n }\n if (!timeString) {\n return 0;\n }\n\n if (!timeString.match(timeRegex)) {\n // If the string represents a simple number, treat it as seconds\n if (/^\\d+(?:\\.\\d+)?$/.test(timeString)) {\n return Number(timeString);\n }\n return 0;\n }\n\n const parts = timeString.split(\":\");\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return hours * 3600 + minutes * 60 + seconds;\n },\n // Custom key function to handle RegExp objects which can't be stringified\n (timeString, timeRegex) => {\n const timeStr = typeof timeString === \"string\" ? timeString : String(timeString ?? \"\");\n const regexStr = typeof timeRegex === \"string\" ? timeRegex : (timeRegex?.toString() ?? \"\");\n return `${timeStr}:${regexStr}`;\n },\n);\n\n/**\n * Converts an ISO 8601 duration string (e.g., \"PT1H30M45S\") to the equivalent number of seconds.\n * This function parses the duration string using a regular expression to extract years, days,\n * hours, minutes, and seconds components.\n *\n * @param {string|null} duration - The ISO 8601 duration string to convert.\n * If null, invalid, or doesn't match the regex, returns 0.\n * @param {RegExp|string} durationRegex - The regular expression used to parse the duration components.\n * If a string is provided, it will be converted to a RegExp.\n * The regex should have capture groups for years, days, hours, minutes, and seconds.\n * @return {number} The total number of seconds represented by the duration string.\n *\n * @example\n * // Returns 5445 (1 hour, 30 minutes, 45 seconds)\n * getDurationAsSeconds(\"PT1H30M45S\", /^P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/);\n *\n * @example\n * // Returns 90000 (1 day, 1 hour)\n * getDurationAsSeconds(\"P1DT1H\", /^P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/);\n *\n * @example\n * // Returns 0 (invalid format)\n * getDurationAsSeconds(\"invalid\", /^P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/);\n */\nexport const getDurationAsSeconds = memoize(\n (duration: string | null, durationRegex: RegExp | string): number => {\n if (typeof durationRegex === \"string\") {\n durationRegex = new RegExp(durationRegex);\n }\n\n if (!duration || !duration?.match?.(durationRegex)) {\n return 0;\n }\n\n const [, years, _, , days, hours, minutes, seconds] =\n new RegExp(durationRegex).exec?.(duration) ?? [];\n let result = 0.0;\n result += Number(seconds) || 0.0;\n result += Number(minutes) * 60.0 || 0.0;\n result += Number(hours) * 3600.0 || 0.0;\n result += Number(days) * (60 * 60 * 24.0) || 0.0;\n result += Number(years) * (60 * 60 * 24 * 365.0) || 0.0;\n return result;\n },\n // Custom key function to handle RegExp objects which can't be stringified\n (duration, durationRegex) => {\n const durationStr = duration ?? \"\";\n const regexStr =\n typeof durationRegex === \"string\" ? durationRegex : (durationRegex?.toString() ?? \"\");\n return `${durationStr}:${regexStr}`;\n },\n);\n\n/**\n * Validates ISO 8601 duration format according to SCORM 2004 specification\n * @param {string} duration - The duration string to validate\n * @return {boolean} - True if valid ISO 8601 duration format\n */\nexport const validateISO8601Duration = memoize(\n (duration: string, durationRegex: RegExp | string): boolean => {\n if (typeof durationRegex === \"string\") {\n durationRegex = new RegExp(durationRegex);\n }\n\n return !(!duration || !duration?.match?.(durationRegex));\n },\n);\n\n/**\n * Adds together two ISO 8601 duration strings and returns the result as a new ISO 8601 duration string.\n * This function works by converting both durations to seconds, adding them together, and then\n * converting the result back to an ISO 8601 duration string.\n *\n * @param {string} first - The first ISO 8601 duration string.\n * @param {string} second - The second ISO 8601 duration string.\n * @param {RegExp|string} durationRegex - The regular expression used to parse the duration components.\n * If a string is provided, it will be converted to a RegExp.\n * @return {string} A new ISO 8601 duration string representing the sum of the two input durations.\n *\n * @example\n * // Returns \"PT2H\" (1 hour + 1 hour = 2 hours)\n * addTwoDurations(\"PT1H\", \"PT1H\", /^P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/);\n *\n * @example\n * // Returns \"PT1H30M\" (1 hour + 30 minutes = 1 hour and 30 minutes)\n * addTwoDurations(\"PT1H\", \"PT30M\", /^P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/);\n *\n * @example\n * // Returns \"P1DT1H30M\" (1 day + 1 hour and 30 minutes = 1 day, 1 hour, and 30 minutes)\n * addTwoDurations(\"P1D\", \"PT1H30M\", /^P(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/);\n */\nexport function addTwoDurations(\n first: string,\n second: string,\n durationRegex: RegExp | string,\n): string {\n const regex: RegExp =\n typeof durationRegex === \"string\" ? new RegExp(durationRegex) : durationRegex;\n return getSecondsAsISODuration(\n getDurationAsSeconds(first, regex) + getDurationAsSeconds(second, regex),\n );\n}\n\n/**\n * Adds together two time strings in HH:MM:SS format and returns the result as a new time string.\n * This function works by converting both time strings to seconds, adding them together, and then\n * converting the result back to an HH:MM:SS format.\n *\n * @param {string} first - The first time string in HH:MM:SS format.\n * @param {string} second - The second time string in HH:MM:SS format.\n * @param {RegExp|string} timeRegex - The regular expression used to validate and parse the time strings.\n * If a string is provided, it will be converted to a RegExp.\n * @return {string} A new time string in HH:MM:SS format representing the sum of the two input times.\n *\n * @example\n * // Returns \"02:00:00\" (1 hour + 1 hour = 2 hours)\n * addHHMMSSTimeStrings(\"01:00:00\", \"01:00:00\", /^(\\d+):(\\d+):(\\d+)$/);\n *\n * @example\n * // Returns \"01:30:00\" (1 hour + 30 minutes = 1 hour and 30 minutes)\n * addHHMMSSTimeStrings(\"01:00:00\", \"00:30:00\", /^(\\d+):(\\d+):(\\d+)$/);\n *\n * @example\n * // Returns \"01:30:45\" (1 hour + 30 minutes and 45 seconds = 1 hour, 30 minutes, and 45 seconds)\n * addHHMMSSTimeStrings(\"01:00:00\", \"00:30:45\", /^(\\d+):(\\d+):(\\d+)$/);\n */\nexport function addHHMMSSTimeStrings(\n first: string,\n second: string,\n timeRegex: RegExp | string,\n): string {\n if (typeof timeRegex === \"string\") {\n timeRegex = new RegExp(timeRegex);\n }\n return getSecondsAsHHMMSS(\n getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex),\n );\n}\n\n/**\n * Flattens a nested JSON object into a flat object with dot notation for nested properties.\n * This function recursively traverses the object and creates new keys using dot notation\n * for nested objects and bracket notation for arrays.\n *\n * @param {StringKeyMap} data - The nested object to flatten.\n * @return {StringKeyMap} A flattened object where nested properties are represented with dot notation.\n *\n * @example\n * // Returns { \"a\": 1, \"b.c\": 2, \"b.d\": 3, \"e[0]\": 4, \"e[1]\": 5 }\n * flatten({\n * a: 1,\n * b: { c: 2, d: 3 },\n * e: [4, 5]\n * });\n *\n * @example\n * // Returns { \"\": [] } for an empty array\n * flatten([]);\n *\n * @example\n * // Returns { \"\": {} } for an empty object\n * flatten({});\n */\nexport function flatten(data: StringKeyMap): StringKeyMap {\n const result: StringKeyMap = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur: any, prop: any) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n // Use forEach instead of for loop\n cur.forEach((item, i) => {\n recurse(item, `${prop}[${i}]`);\n });\n\n if (cur.length === 0) result[prop] = [];\n } else {\n const keys = Object.keys(cur).filter((p) => Object.prototype.hasOwnProperty.call(cur, p));\n\n const isEmpty = keys.length === 0;\n\n // Use forEach instead of for...in loop\n keys.forEach((p) => {\n recurse(cur[p], prop ? `${prop}.${p}` : p);\n });\n\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, \"\");\n return result;\n}\n\n/**\n * Converts a flattened object back into a nested object structure.\n * This function is the inverse of `flatten()`. It parses dot notation and bracket notation\n * in property names to recreate the original nested structure.\n *\n * @param {StringKeyMap} data - The flattened object to unflatten.\n * @return {object} A nested object recreated from the flattened structure.\n *\n * @example\n * // Returns { a: 1, b: { c: 2, d: 3 }, e: [4, 5] }\n * unflatten({\n * \"a\": 1,\n * \"b.c\": 2,\n * \"b.d\": 3,\n * \"e[0]\": 4,\n * \"e[1]\": 5\n * });\n *\n * @example\n * // Handles array indices correctly\n * unflatten({\n * \"users[0].name\": \"John\",\n * \"users[0].email\": \"john@example.com\",\n * \"users[1].name\": \"Jane\",\n * \"users[1].email\": \"jane@example.com\"\n * });\n * // Returns:\n * // {\n * // users: [\n * // { name: \"John\", email: \"john@example.com\" },\n * // { name: \"Jane\", email: \"jane@example.com\" }\n * // ]\n * // }\n */\nexport function unflatten(data: StringKeyMap): object {\n \"use strict\";\n\n if (Object(data) !== data || Array.isArray(data)) return data;\n const result: StringKeyMap = {};\n\n // Regex pattern for parsing property paths\n const pattern = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n\n // Get all own properties and process them\n Object.keys(data)\n .filter((p) => Object.prototype.hasOwnProperty.call(data, p))\n .forEach((p) => {\n let cur = result;\n let prop = \"\";\n\n // Create a new regex instance for each property to reset lastIndex\n const regex = new RegExp(pattern);\n\n // Process all matches in the property path\n Array.from({ length: p.match(new RegExp(pattern, \"g\"))?.length ?? 0 }, () =>\n regex.exec(p),\n ).forEach((m) => {\n if (m) {\n // Create array or object as needed\n cur = (cur[prop] ?? (cur[prop] = m[2] ? [] : ({} as StringKeyMap))) as StringKeyMap;\n prop = m[2] || m[1] || \"\";\n }\n });\n\n cur[prop] = data[p];\n });\n\n return (result[\"\"] ?? result) as object;\n}\n\n/**\n * Counts the number of decimal places in a number.\n * This function handles both integer and floating-point numbers.\n *\n * @param {number} num - The number to analyze.\n * @return {number} The number of decimal places. Returns 0 for integers or if the number doesn't have a decimal point.\n *\n * @example\n * // Returns 0\n * countDecimals(42);\n *\n * @example\n * // Returns 2\n * countDecimals(3.14);\n *\n * @example\n * // Returns 5\n * countDecimals(1.23456);\n */\nexport function countDecimals(num: number): number {\n if (Math.floor(num) === num || String(num)?.indexOf?.(\".\") < 0) return 0;\n const parts = num.toString().split(\".\")?.[1];\n return parts?.length ?? 0;\n}\n\n/**\n * Formats SCORM messages for consistent and readable logging.\n * This function pads the function name and CMI element to create aligned log messages\n * that are easier to read in log files or console output.\n *\n * @param {string} functionName - The name of the function that generated the message.\n * @param {string} message - The message content to be logged.\n * @param {string} [CMIElement] - Optional. The CMI element related to the message.\n * @return {string} A formatted message string with consistent padding.\n *\n * @example\n * // Returns \"initialize : Successfully initialized\"\n * formatMessage(\"initialize\", \"Successfully initialized\");\n *\n * @example\n * // Returns \"getValue : cmi.core.student_id : 12345\"\n * formatMessage(\"getValue\", \"12345\", \"cmi.core.student_id\");\n *\n * @example\n * // Returns \"setValue : cmi.core.lesson_status : completed\"\n * formatMessage(\"setValue\", \"completed\", \"cmi.core.lesson_status\");\n */\nexport function formatMessage(functionName: string, message: string, CMIElement?: string): string {\n const baseLength = 20;\n\n // Use string padding instead of loops\n const paddedFunction = functionName.padEnd(baseLength);\n let messageString = `${paddedFunction}: `;\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n // Add CMIElement and pad to the required length\n messageString += CMIElement;\n messageString = messageString.padEnd(CMIElementBaseLength);\n }\n\n // Add the message (or empty string if null/undefined)\n messageString += message ?? \"\";\n\n return messageString;\n}\n\n/**\n * Checks if a string contains a specific pattern using regular expression matching.\n * This function is a wrapper around JavaScript's String.match() method that handles\n * null/undefined values gracefully.\n *\n * @param {string} str - The string to search within. If null or undefined, returns false.\n * @param {string} tester - The pattern to search for. Can be a regular expression pattern.\n * @return {boolean} True if the pattern is found in the string, false otherwise.\n *\n * @example\n * // Returns true\n * stringMatches(\"Hello, world!\", \"world\");\n *\n * @example\n * // Returns true\n * stringMatches(\"The quick brown fox\", \"\\\\w+\\\\s+\\\\w+\");\n *\n * @example\n * // Returns false\n * stringMatches(\"Hello, world!\", \"universe\");\n *\n * @example\n * // Returns false (handles null gracefully)\n * stringMatches(null, \"test\");\n */\nexport function stringMatches(str: string | null | undefined, tester: string): boolean {\n if (typeof str !== \"string\") {\n return false;\n }\n return new RegExp(tester).test(str);\n}\n\n/**\n * Creates a memoized (cached) version of a function for performance optimization.\n * This function caches the results of previous calls with the same arguments,\n * avoiding redundant calculations for repeated calls with the same input.\n *\n * @template T - The type of the function to memoize\n * @param {T} fn - The function to memoize\n * @param {Function} [keyFn] - Optional function to generate a custom cache key.\n * Useful for functions with complex arguments that can't be serialized.\n * @return {T} A memoized version of the input function with the same signature\n *\n * @example\n * // Basic usage with a simple function\n * const memoizedAdd = memoize((a, b) => {\n * console.log('Calculating...');\n * return a + b;\n * });\n *\n * memoizedAdd(1, 2); // Logs \"Calculating...\" and returns 3\n * memoizedAdd(1, 2); // Returns 3 without logging (uses cached result)\n *\n * @example\n * // Using a custom key function for objects that can't be serialized\n * const memoizedProcessUser = memoize(\n * (user) => {\n * console.log('Processing user...');\n * return { ...user, processed: true };\n * },\n * (user) => user.id // Use user.id as the cache key\n * );\n *\n * memoizedProcessUser({ id: 123, name: 'John' }); // Logs and processes\n * memoizedProcessUser({ id: 123, name: 'John' }); // Uses cached result\n */\nexport function memoize<T extends (...args: any[]) => any>(\n fn: T,\n keyFn?: (...args: Parameters<T>) => string,\n): T {\n const cache = new Map<string, ReturnType<T>>();\n\n return ((...args: Parameters<T>): ReturnType<T> => {\n const key = keyFn ? keyFn(...args) : JSON.stringify(args);\n\n return cache.has(key)\n ? (cache.get(key) as ReturnType<T>)\n : (() => {\n const result = fn(...args);\n cache.set(key, result);\n return result;\n })();\n }) as T;\n}\n","import { BaseScormValidationError } from \"../../exceptions\";\nimport { memoize } from \"../../utilities\";\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {typeof BaseScormValidationError} errorClass\n * @param {boolean} [allowEmptyString]\n * @return {boolean}\n */\nexport const checkValidFormat = memoize(\n (\n CMIElement: string,\n value: string,\n regexPattern: string | RegExp, // We accept either a string or a RegExp object to allow the usage of flags.\n errorCode: number,\n errorClass: typeof BaseScormValidationError,\n allowEmptyString?: boolean,\n ): boolean => {\n // noinspection SuspiciousTypeOfGuard\n if (typeof value !== \"string\") {\n return false;\n }\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === \"\") {\n return true;\n }\n if (value === undefined || !matches || matches[0] === \"\") {\n throw new errorClass(CMIElement, errorCode);\n }\n return true;\n },\n // Custom key function that excludes the error class from the cache key\n // since it can't be stringified and doesn't affect the validation result\n (CMIElement, value, regexPattern, errorCode, _errorClass, allowEmptyString) => {\n // Use typeof for non-string values to ensure consistent cache keys\n // noinspection SuspiciousTypeOfGuard\n const valueKey = typeof value === \"string\" ? value : `[${typeof value}]`;\n return `${CMIElement}:${valueKey}:${regexPattern}:${errorCode}:${allowEmptyString || false}`;\n },\n);\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {any} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @param {typeof BaseScormValidationError} errorClass\n * @return {boolean}\n */\nexport const checkValidRange = memoize(\n (\n CMIElement: string,\n value: any,\n rangePattern: string,\n errorCode: number,\n errorClass: typeof BaseScormValidationError,\n ): boolean => {\n const ranges = rangePattern.split(\"#\");\n value = value * 1.0;\n if (ranges[0] && value >= ranges[0]) {\n if (ranges[1] && (ranges[1] === \"*\" || value <= ranges[1])) {\n return true;\n } else {\n throw new errorClass(CMIElement, errorCode);\n }\n } else {\n throw new errorClass(CMIElement, errorCode);\n }\n },\n // Custom key function that excludes the error class from the cache key\n // since it can't be stringified and doesn't affect the validation result\n (CMIElement, value, rangePattern, errorCode, _errorClass) =>\n `${CMIElement}:${value}:${rangePattern}:${errorCode}`,\n);\n","import { checkValidFormat, checkValidRange } from \"../common/validation\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { Scorm12ValidationError } from \"../../exceptions/scorm12_exceptions\";\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {string} CMIElement\n * @param {string} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidFormat(\n CMIElement: string,\n value: string,\n regexPattern: string | RegExp, // We accept either a string or a RegExp object to allow the usage of flags.\n allowEmptyString?: boolean,\n): boolean {\n return checkValidFormat(\n CMIElement,\n value,\n regexPattern,\n scorm12_errors.TYPE_MISMATCH as number,\n Scorm12ValidationError,\n allowEmptyString,\n );\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {string} CMIElement\n * @param {string} value\n * @param {string} rangePattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidRange(\n CMIElement: string,\n value: any,\n rangePattern: string,\n allowEmptyString?: boolean,\n): boolean {\n if (!allowEmptyString && value === \"\") {\n throw new Scorm12ValidationError(CMIElement, scorm12_errors.VALUE_OUT_OF_RANGE as number);\n }\n\n return checkValidRange(\n CMIElement,\n value,\n rangePattern,\n scorm12_errors.VALUE_OUT_OF_RANGE as number,\n Scorm12ValidationError,\n );\n}\n","import { BaseScormValidationError } from \"../exceptions\";\nimport { checkValidFormat, checkValidRange } from \"../cmi/common/validation\";\nimport { check12ValidFormat, check12ValidRange } from \"../cmi/scorm12/validation\";\nimport { scorm12_regex } from \"../constants/regex\";\nimport { scorm12_errors } from \"../constants/error_codes\";\nimport { Scorm12ValidationError } from \"../exceptions/scorm12_exceptions\";\n\n/**\n * Service for validating CMI data model properties\n */\nexport class ValidationService {\n /**\n * Validates a score property (raw, min, max)\n *\n * @param {string} CMIElement\n * @param {string} value - The value to validate\n * @param {string} decimalRegex - The regex pattern for decimal validation\n * @param {string | false} scoreRange - The range pattern for score validation, or false if no range validation is needed\n * @param {number} invalidTypeCode - The error code for invalid type\n * @param {number} invalidRangeCode - The error code for invalid range\n * @param {typeof BaseScormValidationError} errorClass - The error class to use for validation errors\n * @return {boolean} - True if validation passes, throws an error otherwise\n */\n validateScore(\n CMIElement: string,\n value: string,\n decimalRegex: string,\n scoreRange: string | false,\n invalidTypeCode: number,\n invalidRangeCode: number,\n errorClass: typeof BaseScormValidationError,\n ): boolean {\n return (\n checkValidFormat(CMIElement, value, decimalRegex, invalidTypeCode, errorClass) &&\n (!scoreRange || checkValidRange(CMIElement, value, scoreRange, invalidRangeCode, errorClass))\n );\n // This line should never be reached due to exceptions being thrown\n }\n\n /**\n * Validates a SCORM 1.2 audio property\n *\n * @param {string} CMIElement\n * @param {string} value - The value to validate\n * @return {boolean} - True if validation passes, throws an error otherwise\n */\n validateScorm12Audio(CMIElement: string, value: string): boolean {\n return (\n check12ValidFormat(CMIElement, value, scorm12_regex.CMISInteger) &&\n check12ValidRange(CMIElement, value, scorm12_regex.audio_range)\n );\n }\n\n /**\n * Validates a SCORM 1.2 language property\n *\n * @param {string} CMIElement\n * @param {string} value - The value to validate\n * @return {boolean} - True if validation passes, throws an error otherwise\n */\n validateScorm12Language(CMIElement: string, value: string): boolean {\n return check12ValidFormat(CMIElement, value, scorm12_regex.CMIString256);\n }\n\n /**\n * Validates a SCORM 1.2 speed property\n *\n * @param {string} CMIElement\n * @param {string} value - The value to validate\n * @return {boolean} - True if validation passes, throws an error otherwise\n */\n validateScorm12Speed(CMIElement: string, value: string): boolean {\n return (\n check12ValidFormat(CMIElement, value, scorm12_regex.CMISInteger) &&\n check12ValidRange(CMIElement, value, scorm12_regex.speed_range)\n );\n }\n\n /**\n * Validates a SCORM 1.2 text property\n *\n * @param {string} CMIElement\n * @param {string} value - The value to validate\n * @return {boolean} - True if validation passes, throws an error otherwise\n */\n validateScorm12Text(CMIElement: string, value: string): boolean {\n return (\n check12ValidFormat(CMIElement, value, scorm12_regex.CMISInteger) &&\n check12ValidRange(CMIElement, value, scorm12_regex.text_range)\n );\n }\n\n /**\n * Validates if a property is read-only\n *\n * @param {string} CMIElement\n * @param {boolean} initialized - Whether the object is initialized\n * @throws {BaseScormValidationError} - Throws an error if the object is initialized\n */\n validateReadOnly(CMIElement: string, initialized: boolean): void {\n if (initialized) {\n throw new Scorm12ValidationError(CMIElement, scorm12_errors.READ_ONLY_ELEMENT as number);\n }\n }\n}\n\n// Export a singleton instance of the ValidationService\nexport const validationService = new ValidationService();\n","import { scorm12_constants } from \"../../constants/api_constants\";\nimport { scorm12_regex } from \"../../constants/regex\";\nimport { BaseCMI } from \"./base_cmi\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { BaseScormValidationError } from \"../../exceptions\";\nimport { validationService } from \"../../services/ValidationService\";\nimport { ScoreObject } from \"../../types/api_types\";\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n private readonly __children: string;\n private readonly __score_range: string | false;\n private readonly __invalid_error_code: number;\n private readonly __invalid_type_code: number;\n private readonly __invalid_range_code: number;\n private readonly __decimal_regex: string;\n private readonly __error_class: typeof BaseScormValidationError;\n protected _raw = \"\";\n protected _min = \"\";\n protected _max: string;\n\n /**\n * Constructor for *.score\n * @param {\n * score_children: string,\n * score_range: string,\n * max: string,\n * invalidErrorCode: number,\n * invalidTypeCode: number,\n * invalidRangeCode: number,\n * decimalRegex: string,\n * errorClass: typeof BaseScormValidationError\n * } params\n */\n constructor(params: {\n CMIElement: string;\n score_children?: string;\n score_range?: string;\n max?: string;\n invalidErrorCode?: number;\n invalidTypeCode?: number;\n invalidRangeCode?: number;\n decimalRegex?: string;\n errorClass: typeof BaseScormValidationError;\n }) {\n super(params.CMIElement);\n\n this.__children = params.score_children || scorm12_constants.score_children;\n this.__score_range = !params.score_range ? false : scorm12_regex.score_range;\n this._max = params.max || params.max === \"\" ? params.max : \"100\";\n this.__invalid_error_code =\n params.invalidErrorCode || (scorm12_errors.INVALID_SET_VALUE as number);\n this.__invalid_type_code = params.invalidTypeCode || (scorm12_errors.TYPE_MISMATCH as number);\n this.__invalid_range_code =\n params.invalidRangeCode || (scorm12_errors.VALUE_OUT_OF_RANGE as number);\n this.__decimal_regex = params.decimalRegex || scorm12_regex.CMIDecimal;\n this.__error_class = params.errorClass;\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n }\n\n /**\n * Getter for _children\n * @return {string}\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children: string) {\n throw new this.__error_class(this._cmi_element + \"._children\", this.__invalid_error_code);\n }\n\n /**\n * Getter for _raw\n * @return {string}\n */\n get raw(): string {\n return this._raw;\n }\n\n /**\n * Setter for _raw\n * @param {string} raw\n */\n set raw(raw: string) {\n if (\n validationService.validateScore(\n this._cmi_element + \".raw\",\n raw,\n this.__decimal_regex,\n this.__score_range,\n this.__invalid_type_code,\n this.__invalid_range_code,\n this.__error_class,\n )\n ) {\n this._raw = raw;\n }\n }\n\n /**\n * Getter for _min\n * @return {string}\n */\n get min(): string {\n return this._min;\n }\n\n /**\n * Setter for _min\n * @param {string} min\n */\n set min(min: string) {\n if (\n validationService.validateScore(\n this._cmi_element + \".min\",\n min,\n this.__decimal_regex,\n this.__score_range,\n this.__invalid_type_code,\n this.__invalid_range_code,\n this.__error_class,\n )\n ) {\n this._min = min;\n }\n }\n\n /**\n * Getter for _max\n * @return {string}\n */\n get max(): string {\n return this._max;\n }\n\n /**\n * Setter for _max\n * @param {string} max\n */\n set max(max: string) {\n if (\n validationService.validateScore(\n this._cmi_element + \".max\",\n max,\n this.__decimal_regex,\n this.__score_range,\n this.__invalid_type_code,\n this.__invalid_range_code,\n this.__error_class,\n )\n ) {\n this._max = max;\n }\n }\n\n /**\n * Getter for _score_range\n * @return {string | false}\n */\n public getScoreObject(): ScoreObject {\n const scoreObject: ScoreObject = {};\n if (!Number.isNaN(Number.parseFloat(this.raw))) {\n scoreObject.raw = Number.parseFloat(this.raw);\n }\n if (!Number.isNaN(Number.parseFloat(this.min))) {\n scoreObject.min = Number.parseFloat(this.min);\n }\n if (!Number.isNaN(Number.parseFloat(this.max))) {\n scoreObject.max = Number.parseFloat(this.max);\n }\n return scoreObject;\n }\n\n /**\n * toJSON for *.score\n * @return {\n * {\n * min: string,\n * max: string,\n * raw: string\n * }\n * }\n */\n toJSON(): {\n min: string;\n max: string;\n raw: string;\n } {\n this.jsonString = true;\n const result = {\n raw: this.raw,\n min: this.min,\n max: this.max,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { CMIScore } from \"../common/score\";\nimport { scorm12_constants } from \"../../constants/api_constants\";\nimport { scorm12_regex } from \"../../constants/regex\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { Scorm12ValidationError } from \"../../exceptions/scorm12_exceptions\";\nimport { check12ValidFormat } from \"../scorm12/validation\";\nimport * as Util from \"../../utilities\";\n\n/**\n * Class representing the `cmi.core` object\n * @extends BaseCMI\n */\nexport class CMICore extends BaseCMI {\n /**\n * Constructor for `cmi.core`\n */\n constructor() {\n super(\"cmi.core\");\n this.score = new CMIScore({\n CMIElement: \"cmi.core.score\",\n score_children: scorm12_constants.score_children,\n score_range: scorm12_regex.score_range,\n invalidErrorCode: scorm12_errors.INVALID_SET_VALUE as number,\n invalidTypeCode: scorm12_errors.TYPE_MISMATCH as number,\n invalidRangeCode: scorm12_errors.VALUE_OUT_OF_RANGE as number,\n errorClass: Scorm12ValidationError,\n });\n }\n\n public readonly score: CMIScore;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n private readonly __children = scorm12_constants.core_children;\n private _student_id = \"\";\n private _student_name = \"\";\n private _lesson_location = \"\";\n private _credit = \"\";\n private _lesson_status = \"not attempted\";\n private _entry = \"\";\n private _total_time = \"\";\n private _lesson_mode = \"normal\";\n private _exit = \"\";\n private _session_time = \"00:00:00\";\n private _suspend_data = \"\";\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n\n this._exit = \"\";\n this._entry = \"\";\n\n /**\n * Resetting ensures we accurately track the time spent on each SCO session independently.\n * Each new session should start from zero, so we can reset cmi.core.session_time at the beginning of each session.\n */\n this._session_time = \"00:00:00\";\n\n this.score?.reset();\n }\n\n /**\n * Getter for __children\n * @return {string}\n * @private\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for __children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children: string) {\n throw new Scorm12ValidationError(\n this._cmi_element + \"._children\",\n scorm12_errors.INVALID_SET_VALUE as number,\n );\n }\n\n /**\n * Getter for _student_id\n * @return {string}\n */\n get student_id(): string {\n return this._student_id;\n }\n\n /**\n * Setter for _student_id. Can only be called before initialization.\n * @param {string} student_id\n */\n set student_id(student_id: string) {\n if (this.initialized) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".student_id\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._student_id = student_id;\n }\n }\n\n /**\n * Getter for _student_name\n * @return {string}\n */\n get student_name(): string {\n return this._student_name;\n }\n\n /**\n * Setter for _student_name. Can only be called before initialization.\n * @param {string} student_name\n */\n set student_name(student_name: string) {\n if (this.initialized) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".student_name\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._student_name = student_name;\n }\n }\n\n /**\n * Getter for _lesson_location\n * @return {string}\n */\n get lesson_location(): string {\n return this._lesson_location;\n }\n\n /**\n * Setter for _lesson_location\n * @param {string} lesson_location\n */\n set lesson_location(lesson_location: string) {\n if (\n check12ValidFormat(\n this._cmi_element + \".lesson_location\",\n lesson_location,\n scorm12_regex.CMIString256,\n true,\n )\n ) {\n this._lesson_location = lesson_location;\n }\n }\n\n /**\n * Getter for _credit\n * @return {string}\n */\n get credit(): string {\n return this._credit;\n }\n\n /**\n * Setter for _credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit: string) {\n if (this.initialized) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".credit\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._credit = credit;\n }\n }\n\n /**\n * Getter for _lesson_status\n * @return {string}\n */\n get lesson_status(): string {\n return this._lesson_status;\n }\n\n /**\n * Setter for _lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status: string) {\n if (this.initialized) {\n if (\n check12ValidFormat(\n this._cmi_element + \".lesson_status\",\n lesson_status,\n scorm12_regex.CMIStatus,\n )\n ) {\n this._lesson_status = lesson_status;\n }\n } else {\n if (\n check12ValidFormat(\n this._cmi_element + \".lesson_status\",\n lesson_status,\n scorm12_regex.CMIStatus2,\n )\n ) {\n this._lesson_status = lesson_status;\n }\n }\n }\n\n /**\n * Getter for _entry\n * @return {string}\n */\n get entry(): string {\n return this._entry;\n }\n\n /**\n * Setter for _entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry: string) {\n if (this.initialized) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".entry\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._entry = entry;\n }\n }\n\n /**\n * Getter for _total_time\n * @return {string}\n */\n get total_time(): string {\n return this._total_time;\n }\n\n /**\n * Setter for _total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time: string) {\n if (this.initialized) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".total_time\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._total_time = total_time;\n }\n }\n\n /**\n * Getter for _lesson_mode\n * @return {string}\n */\n get lesson_mode(): string {\n return this._lesson_mode;\n }\n\n /**\n * Setter for _lesson_mode. Can only be called before initialization.\n * @param {string} lesson_mode\n */\n set lesson_mode(lesson_mode: string) {\n if (this.initialized) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".lesson_mode\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._lesson_mode = lesson_mode;\n }\n }\n\n /**\n * Getter for _exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".exit\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._exit;\n }\n\n /**\n * Setter for _exit\n * @param {string} exit\n */\n set exit(exit: string) {\n if (check12ValidFormat(this._cmi_element + \".exit\", exit, scorm12_regex.CMIExit, true)) {\n this._exit = exit;\n }\n }\n\n /**\n * Getter for _session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".session_time\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._session_time;\n }\n\n /**\n * Setter for _session_time\n * @param {string} session_time\n */\n set session_time(session_time: string) {\n if (\n check12ValidFormat(\n this._cmi_element + \".session_time\",\n session_time,\n scorm12_regex.CMITimespan,\n )\n ) {\n this._session_time = session_time;\n }\n }\n\n /**\n * Getter for _suspend_data\n * @return {string}\n */\n get suspend_data(): string {\n return this._suspend_data;\n }\n\n /**\n * Setter for _suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data: string) {\n if (\n check12ValidFormat(\n this._cmi_element + \".suspend_data\",\n suspend_data,\n scorm12_regex.CMIString4096,\n true,\n )\n ) {\n this._suspend_data = suspend_data;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n * @param {number} start_time\n * @return {string}\n */\n getCurrentTotalTime(start_time: number | undefined): string {\n let sessionTime = this._session_time;\n if (typeof start_time !== \"undefined\" && start_time !== null) {\n const seconds = new Date().getTime() - start_time;\n sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);\n }\n\n return Util.addHHMMSSTimeStrings(\n this._total_time,\n sessionTime,\n new RegExp(scorm12_regex.CMITimespan),\n );\n }\n\n /**\n * toJSON for cmi.core\n *\n * @return {\n * {\n * student_name: string,\n * entry: string,\n * exit: string,\n * score: CMIScore,\n * student_id: string,\n * lesson_mode: string,\n * lesson_location: string,\n * lesson_status: string,\n * credit: string,\n * session_time: string\n * }\n * }\n */\n toJSON(): {\n student_name: string;\n entry: string;\n exit: string;\n score: CMIScore;\n student_id: string;\n lesson_mode: string;\n lesson_location: string;\n lesson_status: string;\n credit: string;\n session_time: string;\n } {\n this.jsonString = true;\n const result = {\n student_id: this.student_id,\n student_name: this.student_name,\n lesson_location: this.lesson_location,\n credit: this.credit,\n lesson_status: this.lesson_status,\n entry: this.entry,\n lesson_mode: this.lesson_mode,\n exit: this.exit,\n session_time: this.session_time,\n score: this.score,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { BaseCMI } from \"./base_cmi\";\nimport { BaseScormValidationError } from \"../../exceptions\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n private readonly _errorCode: number;\n private readonly _errorClass: typeof BaseScormValidationError;\n private readonly __children: string;\n public childArray: any[];\n\n /**\n * Constructor cmi *.n arrays\n * @param {object} params\n */\n constructor(params: {\n CMIElement: string;\n children: string;\n errorCode?: number;\n errorClass?: typeof BaseScormValidationError;\n }) {\n super(params.CMIElement);\n this.__children = params.children;\n this._errorCode = params.errorCode || (scorm12_errors.GENERAL as number);\n this._errorClass = params.errorClass || BaseScormValidationError;\n this.childArray = [];\n }\n\n /**\n * Called when the API has been reset\n */\n reset(wipe: boolean = false): void {\n this._initialized = false;\n if (wipe) {\n this.childArray = [];\n } else {\n // Reset all children\n for (let i = 0; i < this.childArray.length; i++) {\n this.childArray[i].reset();\n }\n }\n }\n\n /**\n * Getter for _children\n * @return {string}\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children: string) {\n throw new this._errorClass(this._cmi_element + \"._children\", this._errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count(): number {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count: number) {\n throw new this._errorClass(this._cmi_element + \"._count\", this._errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON(): object {\n this.jsonString = true;\n const result: { [key: string]: any } = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + \"\"] = this.childArray[i];\n }\n this.jsonString = false;\n return result;\n }\n}\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { CMIScore } from \"../common/score\";\nimport { scorm12_constants } from \"../../constants/api_constants\";\nimport { scorm12_regex } from \"../../constants/regex\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { Scorm12ValidationError } from \"../../exceptions/scorm12_exceptions\";\nimport { check12ValidFormat } from \"./validation\";\nimport { CMIArray } from \"../common/array\";\n\n/**\n * Class representing SCORM 1.2's `cmi.objectives` object\n * @extends CMIArray\n */\nexport class CMIObjectives extends CMIArray {\n /**\n * Constructor for `cmi.objectives`\n */\n constructor() {\n super({\n CMIElement: \"cmi.objectives\",\n children: scorm12_constants.objectives_children,\n errorCode: scorm12_errors.INVALID_SET_VALUE as number,\n errorClass: Scorm12ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super(\"cmi.objectives.n\");\n this.score = new CMIScore({\n CMIElement: \"cmi.objectives.n.score\",\n score_children: scorm12_constants.score_children,\n score_range: scorm12_regex.score_range,\n invalidErrorCode: scorm12_errors.INVALID_SET_VALUE as number,\n invalidTypeCode: scorm12_errors.TYPE_MISMATCH as number,\n invalidRangeCode: scorm12_errors.VALUE_OUT_OF_RANGE as number,\n errorClass: Scorm12ValidationError,\n });\n }\n\n public readonly score: CMIScore;\n\n private _id = \"\";\n private _status = \"\";\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n this._id = \"\";\n this._status = \"\";\n this.score?.reset();\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check12ValidFormat(this._cmi_element + \".id\", id, scorm12_regex.CMIIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * Getter for _status\n * @return {string}\n */\n get status(): string {\n return this._status;\n }\n\n /**\n * Setter for _status\n * @param {string} status\n */\n set status(status: string) {\n if (check12ValidFormat(this._cmi_element + \".status\", status, scorm12_regex.CMIStatus2)) {\n this._status = status;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n * @return {\n * {\n * id: string,\n * status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON(): {\n id: string;\n status: string;\n score: CMIScore;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n status: this.status,\n score: this.score,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { scorm12_constants } from \"../../constants/api_constants\";\nimport { Scorm12ValidationError } from \"../../exceptions/scorm12_exceptions\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { validationService } from \"../../services/ValidationService\";\n\n/**\n * Class representing the SCORM 1.2 cmi.student_data object\n * @extends BaseCMI\n */\nexport class CMIStudentData extends BaseCMI {\n private readonly __children;\n private _mastery_score = \"\";\n private _max_time_allowed = \"\";\n private _time_limit_action = \"\";\n\n /**\n * Constructor for cmi.student_data\n * @param {string} student_data_children\n */\n constructor(student_data_children?: string) {\n super(\"cmi.student_data\");\n this.__children = student_data_children\n ? student_data_children\n : scorm12_constants.student_data_children;\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n }\n\n /**\n * Getter for __children\n * @return {string}\n * @private\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for __children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children: string) {\n throw new Scorm12ValidationError(\n this._cmi_element + \"._children\",\n scorm12_errors.INVALID_SET_VALUE as number,\n );\n }\n\n /**\n * Getter for _master_score\n * @return {string}\n */\n get mastery_score(): string {\n return this._mastery_score;\n }\n\n /**\n * Setter for _master_score. Can only be called before initialization.\n * @param {string} mastery_score\n */\n set mastery_score(mastery_score: string) {\n validationService.validateReadOnly(this._cmi_element + \".mastery_score\", this.initialized);\n this._mastery_score = mastery_score;\n }\n\n /**\n * Getter for _max_time_allowed\n * @return {string}\n */\n get max_time_allowed(): string {\n return this._max_time_allowed;\n }\n\n /**\n * Setter for _max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed: string) {\n validationService.validateReadOnly(this._cmi_element + \".max_time_allowed\", this.initialized);\n this._max_time_allowed = max_time_allowed;\n }\n\n /**\n * Getter for _time_limit_action\n * @return {string}\n */\n get time_limit_action(): string {\n return this._time_limit_action;\n }\n\n /**\n * Setter for _time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action: string) {\n validationService.validateReadOnly(this._cmi_element + \".time_limit_action\", this.initialized);\n this._time_limit_action = time_limit_action;\n }\n\n /**\n * toJSON for cmi.student_data\n *\n * @return {\n * {\n * max_time_allowed: string,\n * time_limit_action: string,\n * mastery_score: string\n * }\n * }\n */\n toJSON(): {\n mastery_score: string;\n max_time_allowed: string;\n time_limit_action: string;\n } {\n this.jsonString = true;\n const result = {\n mastery_score: this.mastery_score,\n max_time_allowed: this.max_time_allowed,\n time_limit_action: this.time_limit_action,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { scorm12_constants } from \"../../constants/api_constants\";\nimport { Scorm12ValidationError } from \"../../exceptions/scorm12_exceptions\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { validationService } from \"../../services/ValidationService\";\n\n/**\n * Class representing the SCORM 1.2 cmi.student_preference object\n * @extends BaseCMI\n */\nexport class CMIStudentPreference extends BaseCMI {\n private readonly __children;\n\n /**\n * Constructor for cmi.student_preference\n * @param {string} student_preference_children\n */\n constructor(student_preference_children?: string) {\n super(\"cmi.student_preference\");\n this.__children = student_preference_children\n ? student_preference_children\n : scorm12_constants.student_preference_children;\n }\n\n private _audio = \"\";\n private _language = \"\";\n private _speed = \"\";\n private _text = \"\";\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n }\n\n /**\n * Getter for __children\n * @return {string}\n * @private\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for __children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children: string) {\n throw new Scorm12ValidationError(\n this._cmi_element + \"._children\",\n scorm12_errors.INVALID_SET_VALUE as number,\n );\n }\n\n /**\n * Getter for _audio\n * @return {string}\n */\n get audio(): string {\n return this._audio;\n }\n\n /**\n * Setter for _audio\n * @param {string} audio\n */\n set audio(audio: string) {\n if (validationService.validateScorm12Audio(this._cmi_element + \".audio\", audio)) {\n this._audio = audio;\n }\n }\n\n /**\n * Getter for _language\n * @return {string}\n */\n get language(): string {\n return this._language;\n }\n\n /**\n * Setter for _language\n * @param {string} language\n */\n set language(language: string) {\n if (validationService.validateScorm12Language(this._cmi_element + \".language\", language)) {\n this._language = language;\n }\n }\n\n /**\n * Getter for _speed\n * @return {string}\n */\n get speed(): string {\n return this._speed;\n }\n\n /**\n * Setter for _speed\n * @param {string} speed\n */\n set speed(speed: string) {\n if (validationService.validateScorm12Speed(this._cmi_element + \".speed\", speed)) {\n this._speed = speed;\n }\n }\n\n /**\n * Getter for _text\n * @return {string}\n */\n get text(): string {\n return this._text;\n }\n\n /**\n * Setter for _text\n * @param {string} text\n */\n set text(text: string) {\n if (validationService.validateScorm12Text(this._cmi_element + \".text\", text)) {\n this._text = text;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON(): {\n audio: string;\n language: string;\n speed: string;\n text: string;\n } {\n this.jsonString = true;\n const result = {\n audio: this.audio,\n language: this.language,\n speed: this.speed,\n text: this.text,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { CMIArray } from \"../common/array\";\nimport { scorm12_constants } from \"../../constants/api_constants\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { Scorm12ValidationError } from \"../../exceptions/scorm12_exceptions\";\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { check12ValidFormat, check12ValidRange } from \"./validation\";\nimport { scorm12_regex } from \"../../constants/regex\";\n\n/**\n * Class representing the SCORM 1.2 `cmi.interactions`\n * @extends CMIArray\n */\nexport class CMIInteractions extends CMIArray {\n /**\n * Constructor for `cmi.interactions`\n */\n constructor() {\n super({\n CMIElement: \"cmi.interactions\",\n children: scorm12_constants.interactions_children,\n errorCode: scorm12_errors.INVALID_SET_VALUE as number,\n errorClass: Scorm12ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n object\n */\n constructor() {\n super(\"cmi.interactions.n\");\n this.objectives = new CMIArray({\n CMIElement: \"cmi.interactions.n.objectives\",\n errorCode: scorm12_errors.INVALID_SET_VALUE as number,\n errorClass: Scorm12ValidationError,\n children: scorm12_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n CMIElement: \"cmi.interactions.correct_responses\",\n errorCode: scorm12_errors.INVALID_SET_VALUE as number,\n errorClass: Scorm12ValidationError,\n children: scorm12_constants.correct_responses_children,\n });\n }\n\n public readonly objectives: CMIArray;\n public readonly correct_responses: CMIArray;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n private _id = \"\";\n private _time = \"\";\n private _type = \"\";\n private _weighting = \"\";\n private _student_response = \"\";\n private _result = \"\";\n private _latency = \"\";\n\n /**\n * Called when the API has been reset\n */\n override reset(): void {\n this._initialized = false;\n\n this._id = \"\";\n this._time = \"\";\n this._type = \"\";\n this._weighting = \"\";\n this._student_response = \"\";\n this._result = \"\";\n this._latency = \"\";\n\n this.objectives?.reset();\n this.correct_responses?.reset();\n }\n\n /**\n * Getter for _id. Should only be called during JSON export.\n * @return {string}\n */\n get id(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".id\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check12ValidFormat(this._cmi_element + \".id\", id, scorm12_regex.CMIIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * Getter for _time. Should only be called during JSON export.\n * @return {string}\n */\n get time(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".time\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._time;\n }\n\n /**\n * Setter for _time\n * @param {string} time\n */\n set time(time: string) {\n if (check12ValidFormat(this._cmi_element + \".time\", time, scorm12_regex.CMITime)) {\n this._time = time;\n }\n }\n\n /**\n * Getter for _type. Should only be called during JSON export.\n * @return {string}\n */\n get type(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".type\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._type;\n }\n\n /**\n * Setter for _type\n * @param {string} type\n */\n set type(type: string) {\n if (check12ValidFormat(this._cmi_element + \".type\", type, scorm12_regex.CMIType)) {\n this._type = type;\n }\n }\n\n /**\n * Getter for _weighting. Should only be called during JSON export.\n * @return {string}\n */\n get weighting(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".weighting\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._weighting;\n }\n\n /**\n * Setter for _weighting\n * @param {string} weighting\n */\n set weighting(weighting: string) {\n if (\n check12ValidFormat(this._cmi_element + \".weighting\", weighting, scorm12_regex.CMIDecimal) &&\n check12ValidRange(this._cmi_element + \".weighting\", weighting, scorm12_regex.weighting_range)\n ) {\n this._weighting = weighting;\n }\n }\n\n /**\n * Getter for _student_response. Should only be called during JSON export.\n * @return {string}\n */\n get student_response(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".student_response\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._student_response;\n }\n\n /**\n * Setter for _student_response\n * @param {string} student_response\n */\n set student_response(student_response: string) {\n if (\n check12ValidFormat(\n this._cmi_element + \".student_response\",\n student_response,\n scorm12_regex.CMIFeedback,\n true,\n )\n ) {\n this._student_response = student_response;\n }\n }\n\n /**\n * Getter for _result. Should only be called during JSON export.\n * @return {string}\n */\n get result(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".result\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._result;\n }\n\n /**\n * Setter for _result\n * @param {string} result\n */\n set result(result: string) {\n if (check12ValidFormat(this._cmi_element + \".result\", result, scorm12_regex.CMIResult)) {\n this._result = result;\n }\n }\n\n /**\n * Getter for _latency. Should only be called during JSON export.\n * @return {string}\n */\n get latency(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".latency\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._latency;\n }\n\n /**\n * Setter for _latency\n * @param {string} latency\n */\n set latency(latency: string) {\n if (check12ValidFormat(this._cmi_element + \".latency\", latency, scorm12_regex.CMITimespan)) {\n this._latency = latency;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * time: string,\n * type: string,\n * weighting: string,\n * student_response: string,\n * result: string,\n * latency: string,\n * objectives: CMIArray,\n * correct_responses: CMIArray\n * }\n * }\n */\n toJSON(): {\n id: string;\n time: string;\n type: string;\n weighting: string;\n student_response: string;\n result: string;\n latency: string;\n objectives: CMIArray;\n correct_responses: CMIArray;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n time: this.time,\n type: this.type,\n weighting: this.weighting,\n student_response: this.student_response,\n result: this.result,\n latency: this.latency,\n objectives: this.objectives,\n correct_responses: this.correct_responses,\n };\n this.jsonString = false;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super(\"cmi.interactions.n.objectives.n\");\n }\n\n private _id = \"\";\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n this._id = \"\";\n }\n\n /**\n * Getter for _id\n * @return {string}\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * Setter for _id\n * @param {string} id\n */\n set id(id: string) {\n if (check12ValidFormat(this._cmi_element + \".id\", id, scorm12_regex.CMIIdentifier)) {\n this._id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON(): {\n id: string;\n } {\n this.jsonString = true;\n const result = {\n id: this.id,\n };\n this.jsonString = false;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.correct_responses.n\n */\n constructor() {\n super(\"cmi.interactions.correct_responses.n\");\n }\n\n private _pattern = \"\";\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n this._pattern = \"\";\n }\n\n /**\n * Getter for _pattern\n * @return {string}\n */\n get pattern(): string {\n if (!this.jsonString) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".pattern\",\n scorm12_errors.WRITE_ONLY_ELEMENT as number,\n );\n }\n return this._pattern;\n }\n\n /**\n * Setter for _pattern\n * @param {string} pattern\n */\n set pattern(pattern: string) {\n if (\n check12ValidFormat(this._cmi_element + \".pattern\", pattern, scorm12_regex.CMIFeedback, true)\n ) {\n this._pattern = pattern;\n }\n }\n\n /**\n * toJSON for cmi.interactions.correct_responses.n\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON(): {\n pattern: string;\n } {\n this.jsonString = true;\n const result = {\n pattern: this._pattern,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { scorm12_constants } from \"../../constants/api_constants\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { scorm12_regex } from \"../../constants/regex\";\nimport { Scorm12ValidationError } from \"../../exceptions/scorm12_exceptions\";\nimport { BaseRootCMI } from \"../common/base_cmi\";\nimport { check12ValidFormat } from \"./validation\";\nimport { CMICore } from \"../aicc/core\";\nimport { CMIObjectives } from \"./objectives\";\nimport { CMIStudentData } from \"./student_data\";\nimport { CMIStudentPreference } from \"./student_preference\";\nimport { CMIInteractions } from \"./interactions\";\n\n/**\n * Class representing the cmi object for SCORM 1.2\n */\nexport class CMI extends BaseRootCMI {\n private readonly __children: string = \"\";\n private __version: string = \"3.4\";\n private _launch_data: string = \"\";\n private _comments: string = \"\";\n private _comments_from_lms: string = \"\";\n\n /**\n * Constructor for the SCORM 1.2 cmi object\n * @param {string} cmi_children\n * @param {(CMIStudentData|AICCCMIStudentData)} student_data\n * @param {boolean} initialized\n */\n constructor(cmi_children?: string, student_data?: CMIStudentData, initialized?: boolean) {\n super(\"cmi\");\n if (initialized) this.initialize();\n this.__children = cmi_children ? cmi_children : scorm12_constants.cmi_children;\n this.core = new CMICore();\n this.objectives = new CMIObjectives();\n this.student_data = student_data ? student_data : new CMIStudentData();\n this.student_preference = new CMIStudentPreference();\n this.interactions = new CMIInteractions();\n }\n\n public core: CMICore;\n public objectives: CMIObjectives;\n public student_data: CMIStudentData;\n public student_preference: CMIStudentPreference;\n public interactions: CMIInteractions;\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n\n this._launch_data = \"\";\n this._comments = \"\";\n this.core?.reset();\n this.objectives = new CMIObjectives();\n this.interactions = new CMIInteractions();\n this.student_data?.reset();\n this.student_preference?.reset();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.core?.initialize();\n this.objectives?.initialize();\n this.student_data?.initialize();\n this.student_preference?.initialize();\n this.interactions?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON(): {\n suspend_data: string;\n launch_data: string;\n comments: string;\n comments_from_lms: string;\n core: CMICore;\n objectives: CMIObjectives;\n student_data: CMIStudentData;\n student_preference: CMIStudentPreference;\n interactions: CMIInteractions;\n } {\n this.jsonString = true;\n const result = {\n suspend_data: this.suspend_data,\n launch_data: this.launch_data,\n comments: this.comments,\n comments_from_lms: this.comments_from_lms,\n core: this.core,\n objectives: this.objectives,\n student_data: this.student_data,\n student_preference: this.student_preference,\n interactions: this.interactions,\n };\n this.jsonString = false;\n return result;\n }\n\n /**\n * Getter for __version\n * @return {string}\n */\n get _version(): string {\n return this.__version;\n }\n\n /**\n * Setter for __version. Just throws an error.\n * @param {string} _version\n */\n set _version(_version: string) {\n throw new Scorm12ValidationError(\n this._cmi_element + \"._version\",\n scorm12_errors.INVALID_SET_VALUE as number,\n );\n }\n\n /**\n * Getter for __children\n * @return {string}\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Setter for __version. Just throws an error.\n * @param {string} _children\n */\n set _children(_children: string) {\n throw new Scorm12ValidationError(\n this._cmi_element + \"._children\",\n scorm12_errors.INVALID_SET_VALUE as number,\n );\n }\n\n /**\n * Getter for _suspend_data\n * @return {string}\n */\n get suspend_data(): string {\n return this.core?.suspend_data;\n }\n\n /**\n * Setter for _suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data: string) {\n if (this.core) {\n this.core.suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for _launch_data\n * @return {string}\n */\n get launch_data(): string {\n return this._launch_data;\n }\n\n /**\n * Setter for _launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data: string) {\n if (this.initialized) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".launch_data\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._launch_data = launch_data;\n }\n }\n\n /**\n * Getter for _comments\n * @return {string}\n */\n get comments(): string {\n return this._comments;\n }\n\n /**\n * Setter for _comments\n * @param {string} comments\n */\n set comments(comments: string) {\n if (\n check12ValidFormat(\n this._cmi_element + \".comments\",\n comments,\n scorm12_regex.CMIString4096,\n true,\n )\n ) {\n this._comments = comments;\n }\n }\n\n /**\n * Getter for _comments_from_lms\n * @return {string}\n */\n get comments_from_lms(): string {\n return this._comments_from_lms;\n }\n\n /**\n * Setter for _comments_from_lms. Can only be called before initialization.\n * @param {string} comments_from_lms\n */\n set comments_from_lms(comments_from_lms: string) {\n if (this.initialized) {\n throw new Scorm12ValidationError(\n this._cmi_element + \".comments_from_lms\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._comments_from_lms = comments_from_lms;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime(): string {\n return this.core.getCurrentTotalTime(this.start_time);\n }\n}\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { check12ValidFormat } from \"./validation\";\nimport { scorm12_regex } from \"../../constants/regex\";\n\n/**\n * Class for AICC Navigation object\n */\nexport class NAV extends BaseCMI {\n /**\n * Constructor for NAV object\n */\n constructor() {\n super(\"cmi.nav\");\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._event = \"\";\n this._initialized = false;\n }\n\n private _event = \"\";\n\n /**\n * Getter for _event\n * @return {string}\n */\n get event(): string {\n return this._event;\n }\n\n /**\n * Setter for _event\n * @param {string} event\n */\n set event(event: string) {\n if (\n event === \"\" ||\n check12ValidFormat(this._cmi_element + \".event\", event, scorm12_regex.NAVEvent)\n ) {\n this._event = event;\n }\n }\n\n /**\n * toJSON for nav object\n * @return {\n * {\n * event: string\n * }\n * }\n */\n toJSON(): {\n event: string;\n } {\n this.jsonString = true;\n const result = {\n event: this.event,\n };\n this.jsonString = false;\n return result;\n }\n}\n","// Using plain objects instead of enums for better compatibility with strip-only mode\n// This approach avoids TypeScript enum runtime code while maintaining the same API\n\n// NAVBoolean values\nexport const NAVBoolean = {\n UNKNOWN: \"unknown\",\n TRUE: \"true\",\n FALSE: \"false\",\n};\n\n// Type for NAVBoolean values\nexport type NAVBoolean = (typeof NAVBoolean)[keyof typeof NAVBoolean];\n\n// SuccessStatus values\nexport const SuccessStatus = {\n PASSED: \"passed\",\n FAILED: \"failed\",\n UNKNOWN: \"unknown\",\n};\n\n// Type for SuccessStatus values\nexport type SuccessStatus = (typeof SuccessStatus)[keyof typeof SuccessStatus];\n\n// CompletionStatus values\nexport const CompletionStatus = {\n COMPLETED: \"completed\",\n INCOMPLETE: \"incomplete\",\n UNKNOWN: \"unknown\",\n};\n\n// Type for CompletionStatus values\nexport type CompletionStatus = (typeof CompletionStatus)[keyof typeof CompletionStatus];\n\n// LogLevelEnum values\nexport const LogLevelEnum = {\n _: 0,\n DEBUG: 1,\n INFO: 2,\n WARN: 3,\n ERROR: 4,\n NONE: 5,\n};\n\n// Type for LogLevelEnum values\nexport type LogLevelEnum = (typeof LogLevelEnum)[keyof typeof LogLevelEnum];\n","import { InternalSettings, LogLevel, ResultObject } from \"../types/api_types\";\nimport { global_constants } from \"./api_constants\";\nimport { LogLevelEnum } from \"./enums\";\n\n/**\n * Default settings for the SCORM API\n */\nexport const DefaultSettings: InternalSettings = {\n autocommit: false,\n autocommitSeconds: 10,\n asyncCommit: false,\n sendFullCommit: true,\n lmsCommitUrl: false,\n dataCommitFormat: \"json\",\n commitRequestDataType: \"application/json;charset=UTF-8\",\n autoProgress: false,\n logLevel: LogLevelEnum.ERROR,\n selfReportSessionTime: false,\n alwaysSendTotalTime: false,\n renderCommonCommitFields: false,\n strict_errors: true,\n xhrHeaders: {},\n xhrWithCredentials: false,\n fetchMode: \"cors\",\n useBeaconInsteadOfFetch: \"never\",\n responseHandler: async function (response: Response): Promise<ResultObject> {\n if (typeof response !== \"undefined\") {\n let httpResult = null;\n\n // Handle both text() and json() response methods\n try {\n if (typeof response.json === \"function\") {\n // Try to get JSON directly if the method exists\n httpResult = await response.json();\n } else if (typeof response.text === \"function\") {\n // Fall back to text() if json() is not available\n const responseText = await response.text();\n if (responseText) {\n httpResult = JSON.parse(responseText);\n }\n }\n } catch (e) {\n // If parsing fails, continue with null httpResult\n }\n\n if (httpResult === null || !{}.hasOwnProperty.call(httpResult, \"result\")) {\n if (response.status === 200) {\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n } else {\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: 101,\n };\n }\n } else {\n return {\n result: httpResult.result,\n errorCode: httpResult.errorCode\n ? httpResult.errorCode\n : httpResult.result === global_constants.SCORM_TRUE\n ? 0\n : 101,\n };\n }\n }\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: 101,\n };\n },\n requestHandler: function (commitObject) {\n return commitObject;\n },\n onLogMessage: defaultLogHandler,\n scoItemIds: [],\n scoItemIdValidator: false,\n globalObjectiveIds: [],\n\n // Offline support settings\n enableOfflineSupport: false,\n courseId: \"\",\n syncOnInitialize: true,\n syncOnTerminate: true,\n maxSyncAttempts: 5,\n};\n\nexport function defaultLogHandler(messageLevel: LogLevel, logMessage: string): void {\n switch (messageLevel) {\n case \"4\":\n case 4:\n case \"ERROR\":\n case LogLevelEnum.ERROR:\n console.error(logMessage);\n break;\n case \"3\":\n case 3:\n case \"WARN\":\n case LogLevelEnum.WARN:\n console.warn(logMessage);\n break;\n case \"2\":\n case 2:\n case \"INFO\":\n case LogLevelEnum.INFO:\n console.info(logMessage);\n break;\n case \"1\":\n case 1:\n case \"DEBUG\":\n case LogLevelEnum.DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n}\n","import BaseAPI from \"../BaseAPI\";\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nexport class ScheduledCommit {\n private _API;\n private _cancelled = false;\n private readonly _timeout;\n private readonly _callback;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n * @param {string} callback\n */\n constructor(API: BaseAPI, when: number, callback: string) {\n this._API = API;\n this._timeout = setTimeout(this.wrapper.bind(this), when);\n this._callback = callback;\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this._cancelled = true;\n if (this._timeout) {\n clearTimeout(this._timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been canceled\n */\n wrapper() {\n if (!this._cancelled) {\n // Only proceed with scheduled commit if API is properly initialized\n if (this._API.isInitialized()) {\n (async () => await this._API.commit(this._callback))();\n }\n }\n }\n}\n","import { CommitObject, InternalSettings, ResultObject } from \"../types/api_types\";\nimport { global_constants } from \"../constants/api_constants\";\nimport { LogLevelEnum } from \"../constants/enums\";\nimport { IHttpService } from \"../interfaces/services\";\nimport { ErrorCode } from \"../constants/error_codes\";\nimport { StringKeyMap } from \"../utilities\";\n\n/**\n * Service for handling HTTP communication with the LMS\n */\nexport class HttpService implements IHttpService {\n private settings: InternalSettings;\n private error_codes: ErrorCode;\n\n /**\n * Constructor for HttpService\n * @param {Settings} settings - The settings object\n * @param {ErrorCode} error_codes - The error codes object\n */\n constructor(settings: InternalSettings, error_codes: ErrorCode) {\n this.settings = settings;\n this.error_codes = error_codes;\n }\n\n /**\n * Sends HTTP requests to the LMS with special handling for immediate and standard requests.\n *\n * This method handles communication with the LMS server, implementing two distinct\n * request handling strategies based on the context:\n *\n * 1. Immediate Mode (used during termination):\n * When immediate=true, the method:\n * - Initiates the fetch request but doesn't wait for it to complete\n * - Returns a success result immediately\n * - Processes the response asynchronously when it arrives\n *\n * This is critical for browser compatibility during page unload/termination,\n * as some browsers (especially Chrome) may cancel synchronous or awaited\n * requests when a page is closing.\n *\n * 2. Standard Mode (normal operation):\n * When immediate=false, the method:\n * - Processes the request parameters through the configured requestHandler\n * - Awaits the fetch response completely\n * - Transforms the response using the configured responseHandler\n * - Triggers appropriate event listeners based on success/failure\n * - Returns the complete result with appropriate error codes\n *\n * The method also includes error handling to catch network failures or other\n * exceptions that might occur during the request process.\n *\n * @param {string} url - The URL endpoint to send the request to\n * @param {CommitObject|StringKeyMap|Array} params - The data to send to the LMS\n * @param {boolean} immediate - Whether to send the request immediately without waiting (true) or process normally (false)\n * @param {Function} apiLog - Function to log API messages with appropriate levels\n * @param {Function} processListeners - Function to trigger event listeners for commit events\n * @return {Promise<ResultObject>} - A promise that resolves with the result of the request\n *\n * @example\n * // Standard request (waits for response)\n * const result = await httpService.processHttpRequest(\n * \"https://lms.example.com/commit\",\n * { cmi: { core: { lesson_status: \"completed\" } } },\n * false,\n * console.log,\n * (event) => dispatchEvent(new CustomEvent(event))\n * );\n *\n * @example\n * // Immediate request (for termination)\n * const result = await httpService.processHttpRequest(\n * \"https://lms.example.com/commit\",\n * { cmi: { core: { lesson_status: \"completed\" } } },\n * true,\n * console.log,\n * (event) => dispatchEvent(new CustomEvent(event))\n * );\n * // result will be success immediately, regardless of actual HTTP result\n */\n async processHttpRequest(\n url: string,\n params: CommitObject | StringKeyMap | Array<any>,\n immediate: boolean = false,\n apiLog: (\n functionName: string,\n message: any,\n messageLevel: LogLevelEnum,\n CMIElement?: string,\n ) => void,\n processListeners: (functionName: string, CMIElement?: string, value?: any) => void,\n ): Promise<ResultObject> {\n const genericError: ResultObject = {\n result: global_constants.SCORM_FALSE,\n errorCode: this.error_codes.GENERAL || 101,\n };\n\n // If immediate mode (for termination), handle differently\n if (immediate) {\n return this._handleImmediateRequest(url, params, apiLog, processListeners);\n }\n\n // Standard request processing\n try {\n const processedParams = this.settings.requestHandler(params) as\n | CommitObject\n | StringKeyMap\n | Array<any>;\n const response = await this.performFetch(url, processedParams);\n return this.transformResponse(response, processListeners);\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : String(e);\n\n // Enhanced error logging with more context\n apiLog(\"processHttpRequest\", `HTTP request failed to ${url}: ${message}`, LogLevelEnum.ERROR);\n\n if (e instanceof Error && e.stack) {\n apiLog(\"processHttpRequest\", `Stack trace: ${e.stack}`, LogLevelEnum.DEBUG);\n }\n\n // Create enhanced error object with more details\n const enhancedError: ResultObject = {\n ...genericError,\n errorMessage: message,\n errorDetails: JSON.stringify({\n url,\n errorType: e instanceof Error ? e.constructor.name : typeof e,\n originalError: message,\n }),\n };\n\n processListeners(\"CommitError\");\n return enhancedError;\n }\n }\n\n /**\n * Handles an immediate request (used during termination)\n * @param {string} url - The URL to send the request to\n * @param {CommitObject|StringKeyMap|Array} params - The parameters to include in the request\n * @param {Function} processListeners - Function to process event listeners\n * @return {ResultObject} - A success result object\n * @private\n */\n private _handleImmediateRequest(\n url: string,\n params: CommitObject | StringKeyMap | Array<any>,\n apiLog: (\n functionName: string,\n message: any,\n messageLevel: LogLevelEnum,\n CMIElement?: string,\n ) => void,\n processListeners: (functionName: string, CMIElement?: string, value?: any) => void,\n ): ResultObject {\n // Use Beacon API for final commit if specified in settings\n if (this.settings.useBeaconInsteadOfFetch !== \"never\") {\n const { body, contentType } = this._prepareRequestBody(params);\n navigator.sendBeacon(url, new Blob([body], { type: contentType }));\n } else {\n // Use regular fetch with keepalive\n this.performFetch(url, params)\n .then(async (response) => {\n await this.transformResponse(response, processListeners);\n })\n .catch((e: unknown) => {\n const message = e instanceof Error ? e.message : String(e);\n apiLog(\"processHttpRequest\", message, LogLevelEnum.ERROR);\n processListeners(\"CommitError\");\n });\n }\n\n // Return success immediately without waiting for response\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n }\n\n /**\n * Prepares the request body and content type based on params type\n * @param {CommitObject|StringKeyMap|Array} params - The parameters to include in the request\n * @return {Object} - Object containing body and contentType\n * @private\n */\n private _prepareRequestBody(params: CommitObject | StringKeyMap | Array<any>): {\n body: string;\n contentType: string;\n } {\n const body = params instanceof Array ? params.join(\"&\") : JSON.stringify(params);\n const contentType =\n params instanceof Array\n ? \"application/x-www-form-urlencoded\"\n : this.settings.commitRequestDataType;\n\n return { body, contentType };\n }\n\n /**\n * Perform the fetch request to the LMS\n * @param {string} url - The URL to send the request to\n * @param {StringKeyMap|Array} params - The parameters to include in the request\n * @return {Promise<Response>} - The response from the LMS\n * @private\n */\n private async performFetch(url: string, params: StringKeyMap | Array<any>): Promise<Response> {\n // Use Beacon API if specified in settings\n if (this.settings.useBeaconInsteadOfFetch === \"always\") {\n return this.performBeacon(url, params);\n }\n\n const { body, contentType } = this._prepareRequestBody(params);\n const init = {\n method: \"POST\",\n mode: this.settings.fetchMode,\n body,\n headers: {\n ...this.settings.xhrHeaders,\n \"Content-Type\": contentType,\n },\n keepalive: true,\n } as RequestInit;\n\n if (this.settings.xhrWithCredentials) {\n init.credentials = \"include\";\n }\n\n return fetch(url, init);\n }\n\n /**\n * Perform the beacon request to the LMS\n * @param {string} url - The URL to send the request to\n * @param {StringKeyMap|Array} params - The parameters to include in the request\n * @return {Promise<Response>} - A promise that resolves with a mock Response object\n * @private\n */\n private async performBeacon(url: string, params: StringKeyMap | Array<any>): Promise<Response> {\n const { body, contentType } = this._prepareRequestBody(params);\n\n // Send the beacon request\n const beaconSuccess = navigator.sendBeacon(url, new Blob([body], { type: contentType }));\n\n // Create a mock Response object since sendBeacon doesn't return a Response\n return Promise.resolve({\n status: beaconSuccess ? 200 : 0,\n ok: beaconSuccess,\n json: async () => ({\n result: beaconSuccess ? \"true\" : \"false\",\n errorCode: beaconSuccess ? 0 : this.error_codes.GENERAL,\n }),\n text: async () =>\n JSON.stringify({\n result: beaconSuccess ? \"true\" : \"false\",\n errorCode: beaconSuccess ? 0 : this.error_codes.GENERAL,\n }),\n } as Response);\n }\n\n /**\n * Transforms the response from the LMS to a ResultObject\n * @param {Response} response - The response from the LMS\n * @param {Function} processListeners - Function to process event listeners\n * @return {Promise<ResultObject>} - The transformed response\n * @private\n */\n private async transformResponse(\n response: Response,\n processListeners: (functionName: string, CMIElement?: string, value?: any) => void,\n ): Promise<ResultObject> {\n let result: any;\n\n try {\n // Parse the response using the configured handler or default to json\n result =\n typeof this.settings.responseHandler === \"function\"\n ? await this.settings.responseHandler(response)\n : await response.json();\n } catch (parseError) {\n // If we can't parse the response, log the raw response for debugging\n const responseText = await response.text().catch(() => \"Unable to read response text\");\n\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: this.error_codes.GENERAL || 101,\n errorMessage: `Failed to parse LMS response: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n errorDetails: JSON.stringify({\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n responseText: responseText.substring(0, 500), // Limit response text to avoid huge logs\n parseError: parseError instanceof Error ? parseError.message : String(parseError),\n }),\n };\n }\n\n // Ensure result has an errorCode property\n if (!Object.hasOwnProperty.call(result, \"errorCode\")) {\n result.errorCode = this._isSuccessResponse(response, result) ? 0 : this.error_codes.GENERAL;\n }\n\n // Add response details for failed requests\n if (!this._isSuccessResponse(response, result)) {\n result.errorDetails = {\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n ...result.errorDetails, // Preserve any existing error details\n };\n }\n\n // Trigger appropriate event based on success/failure\n if (this._isSuccessResponse(response, result)) {\n processListeners(\"CommitSuccess\");\n } else {\n processListeners(\"CommitError\", undefined, result.errorCode);\n }\n\n return result;\n }\n\n /**\n * Determines if a response is successful based on status code and result\n * @param {Response} response - The HTTP response\n * @param {ResultObject} result - The parsed result object\n * @return {boolean} - Whether the response is successful\n * @private\n */\n private _isSuccessResponse(response: Response, result: ResultObject): boolean {\n const value = (result as any).result;\n return (\n response.status >= 200 &&\n response.status <= 299 &&\n (value === true || value === \"true\" || value === global_constants.SCORM_TRUE)\n );\n }\n\n /**\n * Updates the service settings\n * @param {Settings} settings - The new settings\n */\n updateSettings(settings: InternalSettings): void {\n this.settings = settings;\n }\n}\n","import { LogLevel } from \"../types/api_types\";\nimport { LogLevelEnum } from \"../constants/enums\";\nimport { IEventService } from \"../interfaces/services\";\n\n/**\n * Interface for a listener object\n */\ninterface Listener {\n functionName: string;\n CMIElement: string | null;\n callback: Function;\n}\n\n/**\n * Type for parsed listener information\n */\ninterface ParsedListener {\n functionName: string;\n CMIElement: string | null;\n}\n\n/**\n * Service for handling event listeners and event processing\n */\nexport class EventService implements IEventService {\n // Map of function names to listeners for faster lookups\n private listenerMap: Map<string, Listener[]> = new Map();\n // Total count of listeners for logging\n private listenerCount = 0;\n // Function to log API messages\n private readonly apiLog: (\n functionName: string,\n message: string,\n messageLevel: LogLevel,\n CMIElement?: string,\n ) => void;\n\n /**\n * Constructor for EventService\n * @param {Function} apiLog - Function to log API messages\n */\n constructor(\n apiLog: (\n functionName: string,\n message: string,\n messageLevel: LogLevel,\n CMIElement?: string,\n ) => void,\n ) {\n this.apiLog = apiLog;\n }\n\n /**\n * Parses a listener name into its components\n *\n * @param {string} listenerName - The name of the listener\n * @returns {ParsedListener|null} - The parsed listener information or null if invalid\n */\n private parseListenerName(listenerName: string): ParsedListener | null {\n const listenerSplit = listenerName.split(\".\");\n if (listenerSplit.length === 0) return null;\n\n const functionName = listenerSplit[0];\n let CMIElement: string | null = null;\n\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(`${functionName}.`, \"\");\n }\n\n return { functionName: functionName ?? listenerName, CMIElement };\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName - The name of the listener\n * @param {Function} callback - The callback function to execute when the event occurs\n */\n on(listenerName: string, callback: Function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(\" \");\n for (const listenerFunction of listenerFunctions) {\n const parsedListener = this.parseListenerName(listenerFunction);\n if (!parsedListener) continue;\n\n const { functionName, CMIElement } = parsedListener;\n\n // Get or create the array for this function name\n const listeners = this.listenerMap.get(functionName) ?? [];\n\n // Add the new listener\n listeners.push({\n functionName,\n CMIElement,\n callback,\n });\n\n // Update the map and count\n this.listenerMap.set(functionName, listeners);\n this.listenerCount++;\n\n this.apiLog(\n \"on\",\n `Added event listener: ${this.listenerCount}`,\n LogLevelEnum.INFO,\n functionName,\n );\n }\n }\n\n /**\n * Provides a mechanism for detaching a specific SCORM event listener\n *\n * @param {string} listenerName - The name of the listener to remove\n * @param {Function} callback - The callback function to remove\n */\n off(listenerName: string, callback: Function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(\" \");\n for (const listenerFunction of listenerFunctions) {\n const parsedListener = this.parseListenerName(listenerFunction);\n if (!parsedListener) continue;\n\n const { functionName, CMIElement } = parsedListener;\n\n // Get the listeners for this function name\n const listeners = this.listenerMap.get(functionName);\n if (!listeners) continue;\n\n // Find the index of the listener to remove\n const removeIndex = listeners.findIndex(\n (obj) => obj.CMIElement === CMIElement && obj.callback === callback,\n );\n\n if (removeIndex !== -1) {\n // Remove the listener\n listeners.splice(removeIndex, 1);\n this.listenerCount--;\n\n // Update the map or remove the entry if empty\n if (listeners.length === 0) {\n this.listenerMap.delete(functionName);\n } else {\n this.listenerMap.set(functionName, listeners);\n }\n\n this.apiLog(\n \"off\",\n `Removed event listener: ${this.listenerCount}`,\n LogLevelEnum.INFO,\n functionName,\n );\n }\n }\n }\n\n /**\n * Provides a mechanism for clearing all listeners from a specific SCORM event\n *\n * @param {string} listenerName - The name of the listener to clear\n */\n clear(listenerName: string) {\n const listenerFunctions = listenerName.split(\" \");\n for (const listenerFunction of listenerFunctions) {\n const parsedListener = this.parseListenerName(listenerFunction);\n if (!parsedListener) continue;\n\n const { functionName, CMIElement } = parsedListener;\n\n // If we have listeners for this function name\n if (this.listenerMap.has(functionName)) {\n const listeners = this.listenerMap.get(functionName)!;\n\n // Filter out listeners that match the criteria\n const newListeners = listeners.filter((obj) => obj.CMIElement !== CMIElement);\n\n // Update the count and map\n this.listenerCount -= listeners.length - newListeners.length;\n\n if (newListeners.length === 0) {\n this.listenerMap.delete(functionName);\n } else {\n this.listenerMap.set(functionName, newListeners);\n }\n }\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName - The name of the function that triggered the event\n * @param {string} CMIElement - The CMI element that was affected\n * @param {any} value - The value that was set\n */\n processListeners(functionName: string, CMIElement?: string, value?: any) {\n this.apiLog(functionName, value, LogLevelEnum.INFO, CMIElement);\n\n // Get listeners for this function name\n const listeners = this.listenerMap.get(functionName);\n if (!listeners) return;\n\n for (const listener of listeners) {\n const listenerHasCMIElement = !!listener.CMIElement;\n let CMIElementsMatch = false;\n\n // Check if CMI elements match\n if (CMIElement && listener.CMIElement) {\n if (listener.CMIElement.endsWith(\"*\")) {\n // For wildcard matches, check if the CMI element starts with the prefix\n const prefix = listener.CMIElement.slice(0, -1);\n CMIElementsMatch = CMIElement.startsWith(prefix);\n } else {\n // For exact matches, compare the strings directly\n CMIElementsMatch = listener.CMIElement === CMIElement;\n }\n }\n\n // If the listener matches, call the callback\n if (!listenerHasCMIElement || CMIElementsMatch) {\n this.apiLog(\n \"processListeners\",\n `Processing listener: ${listener.functionName}`,\n LogLevelEnum.DEBUG,\n CMIElement,\n );\n\n // Handle special event types\n if (functionName.startsWith(\"Sequence\")) {\n // For sequence events, pass the target as the first argument\n listener.callback(value);\n } else if (functionName === \"CommitError\") {\n // For commit error events, pass the error code\n listener.callback(value);\n } else if (functionName === \"CommitSuccess\") {\n // For commit success events, pass no arguments\n listener.callback();\n } else {\n // For regular events, pass CMIElement and value\n listener.callback(CMIElement, value);\n }\n }\n }\n }\n\n /**\n * Resets the event service by clearing all listeners\n */\n reset() {\n this.listenerMap.clear();\n this.listenerCount = 0;\n }\n}\n","import { CommitObject, LogLevel } from \"../types/api_types\";\nimport { StringKeyMap, unflatten } from \"../utilities\";\nimport { LogLevelEnum } from \"../constants/enums\";\nimport { BaseCMI } from \"../cmi/common/base_cmi\";\nimport { ISerializationService } from \"../interfaces/services\";\n\n/**\n * Service for handling data serialization and deserialization in scorm-again\n */\nexport class SerializationService implements ISerializationService {\n /**\n * Loads CMI data from a flattened JSON object with special handling for arrays and ordering.\n *\n * This method implements a complex algorithm for loading flattened JSON data into the CMI\n * object structure. It handles several key challenges:\n *\n * 1. Ordering dependencies: Some CMI elements (like interactions and objectives) must be\n * loaded in a specific order to ensure proper initialization.\n *\n * 2. Array handling: Interactions and objectives are stored as arrays, and their properties\n * must be loaded in the correct order (e.g., 'id' and 'type' must be set before other properties).\n *\n * 3. Unflattening: The method converts flattened dot notation (e.g., \"cmi.objectives.0.id\")\n * back into nested objects before loading.\n *\n * The algorithm works by:\n * - Categorizing keys into interactions, objectives, and other properties\n * - Sorting interactions to prioritize 'id' and 'type' fields within each index\n * - Sorting objectives to prioritize 'id' fields within each index\n * - Processing each category in order: interactions, objectives, then other properties\n *\n * @param {StringKeyMap} json - The flattened JSON object with dot notation keys\n * @param {string} CMIElement - The CMI element to start from (usually empty or \"cmi\")\n * @param {Function} setCMIValue - Function to set CMI value\n * @param {Function} isNotInitialized - Function to check if API is not initialized\n *\n * @param setStartingData\n * @example\n * // Example of flattened JSON input:\n * // {\n * // \"cmi.objectives.0.id\": \"obj1\",\n * // \"cmi.objectives.0.score.raw\": \"80\",\n * // \"cmi.interactions.0.id\": \"int1\",\n * // \"cmi.interactions.0.type\": \"choice\",\n * // \"cmi.interactions.0.result\": \"correct\"\n * // }\n */\n loadFromFlattenedJSON(\n json: StringKeyMap,\n CMIElement: string = \"\",\n setCMIValue: (CMIElement: string, value: any) => void,\n isNotInitialized: () => boolean,\n setStartingData: (data: StringKeyMap) => void,\n ): void {\n if (!isNotInitialized()) {\n console.error(\"loadFromFlattenedJSON can only be called before the call to lmsInitialize.\");\n return;\n }\n\n const int_pattern = /^(cmi\\.interactions\\.)(\\d+)\\.(.*)$/;\n const obj_pattern = /^(cmi\\.objectives\\.)(\\d+)\\.(.*)$/;\n\n // Extract and categorize keys for better sorting\n const interactions: {\n key: string;\n value: any;\n index: number;\n field: string;\n }[] = [];\n const objectives: {\n key: string;\n value: any;\n index: number;\n field: string;\n }[] = [];\n const others: { key: string; value: any }[] = [];\n\n // Categorize keys\n for (const key in json) {\n if (Object.prototype.hasOwnProperty.call(json, key)) {\n const intMatch = key.match(int_pattern);\n if (intMatch) {\n interactions.push({\n key,\n value: json[key],\n index: Number(intMatch[2]),\n field: intMatch[3] || \"\",\n });\n continue;\n }\n\n const objMatch = key.match(obj_pattern);\n if (objMatch) {\n objectives.push({\n key,\n value: json[key],\n index: Number(objMatch[2]),\n field: objMatch[3] || \"\",\n });\n continue;\n }\n\n others.push({ key, value: json[key] });\n }\n }\n\n // Sort interactions: first by index, then prioritize 'id' and 'type' fields\n interactions.sort((a, b) => {\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n\n // Same index, prioritize id and type\n if (a.field === \"id\") return -1;\n if (b.field === \"id\") return 1;\n if (a.field === \"type\") return -1;\n if (b.field === \"type\") return 1;\n\n return a.field.localeCompare(b.field);\n });\n\n // Sort objectives: first by index, then prioritize 'id' field\n objectives.sort((a, b) => {\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n\n // Same index, prioritize id\n if (a.field === \"id\") return -1;\n if (b.field === \"id\") return 1;\n\n return a.field.localeCompare(b.field);\n });\n\n // Sort other keys alphabetically\n others.sort((a, b) => a.key.localeCompare(b.key));\n\n // Process all items in the correct order\n const processItems = (items: { key: string; value: any }[]) => {\n items.forEach((item) => {\n const obj: StringKeyMap = {};\n obj[item.key] = item.value;\n this.loadFromJSON(\n unflatten(obj) as StringKeyMap,\n CMIElement,\n setCMIValue,\n isNotInitialized,\n setStartingData,\n );\n });\n };\n\n // Process in order: interactions, objectives, others\n processItems(interactions);\n processItems(objectives);\n processItems(others);\n }\n\n /**\n * Loads CMI data from a nested JSON object with recursive traversal.\n *\n * This method implements a recursive algorithm for loading nested JSON data into the CMI\n * object structure. It handles several key aspects:\n *\n * 1. Recursive traversal: The method recursively traverses the nested JSON structure,\n * building CMI element paths as it goes (e.g., \"cmi.core.student_id\").\n *\n * 2. Type-specific handling: Different data types are handled differently:\n * - Arrays: Each array element is processed individually with its index in the path\n * - Objects: Recursively processed with updated path\n * - Primitives: Set directly using setCMIValue\n *\n * 3. Initialization check: Ensures the method is only called before API initialization\n *\n * 4. Starting data storage: Stores the original JSON data for potential future use\n *\n * The algorithm works by:\n * - First storing the complete JSON object via setStartingData\n * - Iterating through each property in the JSON object\n * - For each property, determining its type and handling it accordingly\n * - Building the CMI element path as it traverses the structure\n * - Setting values at the appropriate paths using setCMIValue\n *\n * @param {{[key: string]: any}} json - The nested JSON object to load\n * @param {string} CMIElement - The CMI element to start from (usually empty or \"cmi\")\n * @param {Function} setCMIValue - Function to set CMI value at a specific path\n * @param {Function} isNotInitialized - Function to check if API is not initialized\n * @param {Function} setStartingData - Function to store the original JSON data\n *\n * @example\n * // Example of nested JSON input:\n * // {\n * // \"core\": {\n * // \"student_id\": \"12345\",\n * // \"student_name\": \"John Doe\"\n * // },\n * // \"objectives\": [\n * // { \"id\": \"obj1\", \"score\": { \"raw\": 80 } },\n * // { \"id\": \"obj2\", \"score\": { \"raw\": 90 } }\n * // ]\n * // }\n */\n loadFromJSON(\n json: { [key: string]: any },\n CMIElement: string = \"\",\n setCMIValue: (CMIElement: string, value: any) => void,\n isNotInitialized: () => boolean,\n setStartingData: (data: StringKeyMap) => void,\n ): void {\n if (!isNotInitialized()) {\n console.error(\"loadFromJSON can only be called before the call to lmsInitialize.\");\n return;\n }\n\n CMIElement = CMIElement !== undefined ? CMIElement : \"cmi\";\n\n setStartingData(json);\n\n // could this be refactored down to flatten(json) then setCMIValue on each?\n for (const key in json) {\n if (Object.prototype.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = (CMIElement ? CMIElement + \".\" : \"\") + key;\n const value = json[key];\n\n if (value.constructor === Array) {\n for (let i = 0; i < value.length; i++) {\n if (value[i]) {\n const item = value[i];\n const tempCMIElement = `${currentCMIElement}.${i}`;\n\n if (item.constructor === Object) {\n this.loadFromJSON(\n item,\n tempCMIElement,\n setCMIValue,\n isNotInitialized,\n setStartingData,\n );\n } else {\n setCMIValue(tempCMIElement, item);\n }\n }\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(\n value,\n currentCMIElement,\n setCMIValue,\n isNotInitialized,\n setStartingData,\n );\n } else {\n setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @param {BaseCMI|StringKeyMap} cmi - The CMI object\n * @param {boolean} sendFullCommit - Whether to send the full commit\n * @return {string}\n */\n renderCMIToJSONString(cmi: BaseCMI | StringKeyMap, sendFullCommit: boolean): string {\n // Do we want/need to return fields that have no set value?\n if (sendFullCommit) {\n return JSON.stringify({ cmi });\n }\n return JSON.stringify({ cmi }, (k, v) => (v === undefined ? null : v), 2);\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @param {BaseCMI|StringKeyMap} cmi - The CMI object\n * @param {boolean} sendFullCommit - Whether to send the full commit\n * @return {object}\n */\n renderCMIToJSONObject(cmi: BaseCMI | StringKeyMap, sendFullCommit: boolean): StringKeyMap {\n // Revert to the original implementation to maintain compatibility with tests\n return JSON.parse(this.renderCMIToJSONString(cmi, sendFullCommit));\n }\n\n /**\n * Builds the commit object to be sent to the LMS\n * @param {boolean} terminateCommit - Whether this is a termination commit\n * @param {boolean} alwaysSendTotalTime - Whether to always send total time\n * @param {boolean|Function} renderCommonCommitFields - Whether to render common commit fields\n * @param {Function} renderCommitObject - Function to render commit object\n * @param {Function} renderCommitCMI - Function to render commit CMI\n * @param {LogLevel} apiLogLevel - The API log level\n * @return {CommitObject|StringKeyMap|Array<any>}\n */\n getCommitObject(\n terminateCommit: boolean,\n alwaysSendTotalTime: boolean,\n renderCommonCommitFields: boolean | ((commitObject: CommitObject) => boolean),\n renderCommitObject: (terminateCommit: boolean, includeTotalTime?: boolean) => CommitObject,\n renderCommitCMI: (\n terminateCommit: boolean,\n includeTotalTime?: boolean,\n ) => StringKeyMap | Array<any>,\n apiLogLevel: LogLevel,\n ): CommitObject | StringKeyMap | Array<any> {\n // Fix for issue: total time is being calculated incorrectly across multiple sessions\n // when selfReportSessionTime and alwaysSendTotalTime are enabled.\n //\n // Previously, we were using a single variable (shouldTerminateCommit) that combined\n // both concerns: whether this is a termination commit and whether to include total time.\n // This caused the total time to be calculated as if every commit was a terminate commit\n // when alwaysSendTotalTime was true, leading to incorrect time calculations.\n //\n // Now we pass the actual terminateCommit value and a separate parameter for whether\n // to include total time, allowing the rendering functions to handle these concerns separately.\n const includeTotalTime = alwaysSendTotalTime || terminateCommit;\n\n const commitObject = renderCommonCommitFields\n ? renderCommitObject(terminateCommit, includeTotalTime)\n : renderCommitCMI(terminateCommit, includeTotalTime);\n\n if ([LogLevelEnum.DEBUG, \"1\", 1, \"DEBUG\"].includes(apiLogLevel)) {\n console.debug(\"Commit (terminated: \" + (terminateCommit ? \"yes\" : \"no\") + \"): \");\n console.debug(commitObject);\n }\n return commitObject;\n }\n}\n","import { LogLevel } from \"../types/api_types\";\nimport { LogLevelEnum } from \"../constants/enums\";\nimport { ILoggingService } from \"../interfaces/services\";\nimport { defaultLogHandler } from \"../constants/default_settings\";\n\n/**\n * Centralized logging service implemented as a singleton\n * Provides methods for logging at different levels and configuring the log level\n */\nexport class LoggingService implements ILoggingService {\n private static _instance: LoggingService;\n private _logLevel: LogLevel = LogLevelEnum.ERROR;\n private _logHandler: (messageLevel: LogLevel, logMessage: string) => void;\n\n /**\n * Private constructor to prevent direct instantiation\n */\n private constructor() {\n // Default log handler uses console methods based on log level\n this._logHandler = defaultLogHandler;\n }\n\n /**\n * Get the singleton instance of LoggingService\n *\n * @returns {LoggingService} The singleton instance\n */\n public static getInstance(): LoggingService {\n if (!LoggingService._instance) {\n LoggingService._instance = new LoggingService();\n }\n return LoggingService._instance;\n }\n\n /**\n * Set the log level\n *\n * @param {LogLevel} level - The log level to set\n */\n public setLogLevel(level: LogLevel): void {\n this._logLevel = level;\n }\n\n /**\n * Get the current log level\n *\n * @returns {LogLevel} The current log level\n */\n public getLogLevel(): LogLevel {\n return this._logLevel;\n }\n\n /**\n * Set a custom log handler\n *\n * @param {Function} handler - The function to handle log messages\n */\n public setLogHandler(handler: (messageLevel: LogLevel, logMessage: string) => void): void {\n this._logHandler = handler;\n }\n\n /**\n * Log a message if the message level is greater than or equal to the current log level\n *\n * @param {LogLevel} messageLevel - The level of the message\n * @param {string} logMessage - The message to log\n */\n public log(messageLevel: LogLevel, logMessage: string): void {\n if (this.shouldLog(messageLevel)) {\n this._logHandler(messageLevel, logMessage);\n }\n }\n\n /**\n * Log a message at ERROR level\n *\n * @param {string} logMessage - The message to log\n */\n public error(logMessage: string): void {\n this.log(LogLevelEnum.ERROR, logMessage);\n }\n\n /**\n * Log a message at WARN level\n *\n * @param {string} logMessage - The message to log\n */\n public warn(logMessage: string): void {\n this.log(LogLevelEnum.WARN, logMessage);\n }\n\n /**\n * Log a message at INFO level\n *\n * @param {string} logMessage - The message to log\n */\n public info(logMessage: string): void {\n this.log(LogLevelEnum.INFO, logMessage);\n }\n\n /**\n * Log a message at DEBUG level\n *\n * @param {string} logMessage - The message to log\n */\n public debug(logMessage: string): void {\n this.log(LogLevelEnum.DEBUG, logMessage);\n }\n\n /**\n * Determine if a message should be logged based on its level and the current log level\n *\n * @param {LogLevel} messageLevel - The level of the message\n * @returns {boolean} Whether the message should be logged\n */\n private shouldLog(messageLevel: LogLevel): boolean {\n // Convert string levels to numbers for comparison\n const numericMessageLevel = this.getNumericLevel(messageLevel);\n const numericLogLevel = this.getNumericLevel(this._logLevel);\n\n return numericMessageLevel >= numericLogLevel;\n }\n\n /**\n * Convert a log level to its numeric value\n *\n * @param {LogLevel} level - The log level to convert\n * @returns {number} The numeric value of the log level\n */\n private getNumericLevel(level: LogLevel): number {\n if (level === undefined) return LogLevelEnum.NONE;\n\n if (typeof level === \"number\") return level;\n\n switch (level) {\n case \"1\":\n case \"DEBUG\":\n return LogLevelEnum.DEBUG;\n case \"2\":\n case \"INFO\":\n return LogLevelEnum.INFO;\n case \"3\":\n case \"WARN\":\n return LogLevelEnum.WARN;\n case \"4\":\n case \"ERROR\":\n return LogLevelEnum.ERROR;\n case \"5\":\n case \"NONE\":\n return LogLevelEnum.NONE;\n default:\n return LogLevelEnum.ERROR; // Default to ERROR if unknown\n }\n }\n}\n\n// Export a function to get the singleton instance\nexport function getLoggingService(): LoggingService {\n return LoggingService.getInstance();\n}\n","import { LogLevelEnum } from \"../constants/enums\";\nimport { global_constants } from \"../constants/api_constants\";\nimport { ErrorCode } from \"../constants/error_codes\";\nimport { ValidationError } from \"../exceptions\";\nimport { IErrorHandlingService, ILoggingService } from \"../interfaces/services\";\nimport { getLoggingService } from \"./LoggingService\";\n\n/**\n * Service for handling SCORM errors\n */\nexport class ErrorHandlingService implements IErrorHandlingService {\n private _lastErrorCode: string = \"0\";\n private readonly _errorCodes: ErrorCode;\n private readonly _apiLog: (\n functionName: string,\n message: string,\n logLevel?: LogLevelEnum,\n CMIElement?: string,\n ) => void;\n private readonly _getLmsErrorMessageDetails: (errorCode: number, detail: boolean) => string;\n private readonly _loggingService: ILoggingService;\n\n /**\n * Constructor for ErrorHandlingService\n *\n * @param {ErrorCode} errorCodes - The error codes object\n * @param {Function} apiLog - Function for logging API calls\n * @param {Function} getLmsErrorMessageDetails - Function for getting error message details\n * @param {ILoggingService} loggingService - Optional logging service instance\n */\n constructor(\n errorCodes: ErrorCode,\n apiLog: (\n functionName: string,\n message: string,\n logLevel?: LogLevelEnum,\n CMIElement?: string,\n ) => void,\n getLmsErrorMessageDetails: (errorCode: number, detail: boolean) => string,\n loggingService?: ILoggingService,\n ) {\n this._errorCodes = errorCodes;\n this._apiLog = apiLog;\n this._getLmsErrorMessageDetails = getLmsErrorMessageDetails;\n this._loggingService = loggingService || getLoggingService();\n }\n\n /**\n * Get the last error code\n *\n * @return {string} - The last error code\n */\n get lastErrorCode(): string {\n return this._lastErrorCode;\n }\n\n /**\n * Set the last error code\n *\n * @param {string} errorCode - The error code to set\n */\n set lastErrorCode(errorCode: string) {\n this._lastErrorCode = errorCode;\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {string} CMIElement\n * @param {number} errorNumber - The error number\n * @param {string} message - The error message\n * @throws {ValidationError} - If throwException is true, throws a ValidationError\n */\n throwSCORMError(CMIElement: string, errorNumber: number, message?: string): void {\n if (!message) {\n message = this._getLmsErrorMessageDetails(errorNumber, true);\n }\n\n // Format a more descriptive error message with context\n const formattedMessage = `SCORM Error ${errorNumber}: ${message}${CMIElement ? ` [Element: ${CMIElement}]` : \"\"}`;\n\n // Log using both the API log and the logging service for consistency\n this._apiLog(\"throwSCORMError\", errorNumber + \": \" + message, LogLevelEnum.ERROR, CMIElement);\n this._loggingService.error(formattedMessage);\n\n this._lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success - Whether the operation was successful\n */\n clearSCORMError(success: string): void {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this._lastErrorCode = \"0\";\n }\n }\n\n /**\n * Handles exceptions that occur when accessing or setting CMI values.\n *\n * This method provides centralized error handling for exceptions that occur during\n * CMI data operations. It differentiates between different types of errors and\n * handles them appropriately:\n *\n * 1. ValidationError: These are expected errors from the validation system that\n * indicate a specific SCORM error condition (like invalid data format or range).\n * For these errors, the method:\n * - Sets the lastErrorCode to the error code from the ValidationError\n * - Returns SCORM_FALSE to indicate failure to the caller\n *\n * 2. Standard JavaScript Error: For general JavaScript errors (like TypeError,\n * ReferenceError, etc.), the method:\n * - Logs the error message with stack trace to the logging service\n * - Sets a general SCORM error\n * - Returns SCORM_FALSE to indicate failure\n *\n * 3. Unknown exceptions: For any other type of exception that doesn't match the\n * above categories, the method:\n * - Logs the entire exception object to the logging service\n * - Sets a general SCORM error\n * - Returns SCORM_FALSE to indicate failure\n *\n * This method is critical for maintaining SCORM compliance by ensuring that\n * all errors are properly translated into the appropriate SCORM error codes.\n *\n * @param {string} CMIElement\n * @param {ValidationError|Error|unknown} e - The exception that was thrown\n * @param {string} returnValue - The default return value (typically an empty string)\n * @return {string} - Either the original returnValue or SCORM_FALSE if an error occurred\n *\n * @example\n * try {\n * const value = getCMIValue(\"cmi.core.score.raw\");\n * return value;\n * } catch (e) {\n * return handleValueAccessException(e, \"\");\n * }\n */\n handleValueAccessException(\n CMIElement: string,\n e: Error | ValidationError | unknown,\n returnValue: string,\n ): string {\n if (e instanceof ValidationError) {\n const validationError = e as ValidationError;\n this._lastErrorCode = String(validationError.errorCode);\n\n // Log validation errors at WARN level with context\n const errorMessage = `Validation Error ${validationError.errorCode}: ${validationError.message} [Element: ${CMIElement}]`;\n this._loggingService.warn(errorMessage);\n\n returnValue = global_constants.SCORM_FALSE;\n } else if (e instanceof Error) {\n // For standard JS errors, include the stack trace and error type\n const errorType = e.constructor.name; // Gets the error type (e.g., TypeError, ReferenceError)\n const errorMessage = `${errorType}: ${e.message} [Element: ${CMIElement}]`;\n const stackTrace = e.stack || \"\";\n\n // Log the detailed error with stack trace\n this._loggingService.error(`${errorMessage}\\n${stackTrace}`);\n\n this.throwSCORMError(\n CMIElement,\n this._errorCodes.GENERAL as number,\n `${errorType}: ${e.message}`,\n );\n } else {\n // For unknown errors, provide as much context as possible\n const errorMessage = `Unknown error occurred while accessing [Element: ${CMIElement}]`;\n\n this._loggingService.error(errorMessage);\n\n try {\n // Try to stringify the error object for more details\n const errorDetails = JSON.stringify(e);\n this._loggingService.error(`Error details: ${errorDetails}`);\n } catch (jsonError) {\n // If stringify fails, log that we couldn't get more details\n this._loggingService.error(\"Could not stringify error object for details\");\n }\n\n this.throwSCORMError(CMIElement, this._errorCodes.GENERAL as number, \"Unknown error\");\n }\n return returnValue;\n }\n\n /**\n * Get the error codes object\n *\n * @return {ErrorCode} - The error codes object\n */\n get errorCodes(): ErrorCode {\n return this._errorCodes;\n }\n}\n\n// Export a factory function to create the service\nexport function createErrorHandlingService(\n errorCodes: ErrorCode,\n apiLog: (\n functionName: string,\n message: string,\n logLevel?: LogLevelEnum,\n CMIElement?: string,\n ) => void,\n getLmsErrorMessageDetails: (errorCode: number, detail: boolean) => string,\n loggingService?: ILoggingService,\n): ErrorHandlingService {\n return new ErrorHandlingService(errorCodes, apiLog, getLmsErrorMessageDetails, loggingService);\n}\n","import { CommitObject, InternalSettings, ResultObject } from \"../types/api_types\";\nimport { global_constants } from \"../constants/api_constants\";\nimport { LogLevelEnum } from \"../constants/enums\";\nimport { ErrorCode } from \"../constants/error_codes\";\n\n/**\n * Interface for sync queue item\n */\ninterface SyncQueueItem {\n id: string;\n courseId: string;\n timestamp: number;\n data: CommitObject;\n syncAttempts: number;\n}\n\n/**\n * Service for handling offline storage and synchronization of SCORM data\n */\nexport class OfflineStorageService {\n private settings: InternalSettings;\n private error_codes: ErrorCode;\n private storeName: string = \"scorm_again_offline_data\";\n private syncQueue: string = \"scorm_again_sync_queue\";\n private isOnline: boolean = navigator.onLine;\n private syncInProgress: boolean = false;\n\n /**\n * Constructor for OfflineStorageService\n * @param {Settings} settings - The settings object\n * @param {ErrorCode} error_codes - The error codes object\n * @param {Function} apiLog - The logging function\n */\n constructor(\n settings: InternalSettings,\n error_codes: ErrorCode,\n private apiLog: (\n functionName: string,\n message: any,\n messageLevel: LogLevelEnum,\n CMIElement?: string,\n ) => void,\n ) {\n this.settings = settings;\n this.error_codes = error_codes;\n\n // Initialize listeners for online/offline events\n window.addEventListener(\"online\", this.handleOnlineStatusChange.bind(this));\n window.addEventListener(\"offline\", this.handleOnlineStatusChange.bind(this));\n }\n\n /**\n * Handle changes in online status\n */\n private handleOnlineStatusChange() {\n const wasOnline = this.isOnline;\n this.isOnline = navigator.onLine;\n\n // If we've come back online, trigger sync process\n if (!wasOnline && this.isOnline) {\n this.apiLog(\n \"OfflineStorageService\",\n \"Device is back online, attempting to sync...\",\n LogLevelEnum.INFO,\n );\n this.syncOfflineData().then(\n (success) => {\n if (success) {\n this.apiLog(\"OfflineStorageService\", \"Sync completed successfully\", LogLevelEnum.INFO);\n } else {\n this.apiLog(\"OfflineStorageService\", \"Sync failed\", LogLevelEnum.ERROR);\n }\n },\n (error) => {\n this.apiLog(\"OfflineStorageService\", `Error during sync: ${error}`, LogLevelEnum.ERROR);\n },\n );\n } else if (wasOnline && !this.isOnline) {\n this.apiLog(\n \"OfflineStorageService\",\n \"Device is offline, data will be stored locally\",\n LogLevelEnum.INFO,\n );\n }\n }\n\n /**\n * Store commit data offline\n * @param {string} courseId - Identifier for the course\n * @param {CommitObject} commitData - The data to store offline\n * @returns {Promise<ResultObject>} - Result of the storage operation\n */\n async storeOffline(courseId: string, commitData: CommitObject): Promise<ResultObject> {\n try {\n // Store the data in the sync queue with timestamp and unique ID\n const queueItem: SyncQueueItem = {\n id: `${courseId}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,\n courseId,\n timestamp: Date.now(),\n data: commitData,\n syncAttempts: 0,\n };\n\n // Get current queue\n const currentQueue = (await this.getFromStorage<SyncQueueItem[]>(this.syncQueue)) || [];\n currentQueue.push(queueItem);\n\n // Save updated queue\n await this.saveToStorage(this.syncQueue, currentQueue);\n\n // Also update the current state in the main storage (latest known state)\n await this.saveToStorage(`${this.storeName}_${courseId}`, commitData);\n\n this.apiLog(\n \"OfflineStorageService\",\n `Stored data offline for course ${courseId}`,\n LogLevelEnum.INFO,\n );\n\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n } catch (error) {\n this.apiLog(\n \"OfflineStorageService\",\n `Error storing offline data: ${error}`,\n LogLevelEnum.ERROR,\n );\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: this.error_codes.GENERAL ?? 0,\n };\n }\n }\n\n /**\n * Get the stored offline data for a course\n * @param {string} courseId - Identifier for the course\n * @returns {Promise<CommitObject|null>} - The stored data or null if not found\n */\n async getOfflineData(courseId: string): Promise<CommitObject | null> {\n try {\n const data = await this.getFromStorage<CommitObject>(`${this.storeName}_${courseId}`);\n return data || null;\n } catch (error) {\n this.apiLog(\n \"OfflineStorageService\",\n `Error retrieving offline data: ${error}`,\n LogLevelEnum.ERROR,\n );\n return null;\n }\n }\n\n /**\n * Synchronize offline data with the LMS when connection is available\n * @returns {Promise<boolean>} - Success status of synchronization\n */\n async syncOfflineData(): Promise<boolean> {\n // Don't run multiple sync processes at once\n if (this.syncInProgress || !this.isOnline) {\n return false;\n }\n\n this.syncInProgress = true;\n\n try {\n // Get the queue of items to sync\n const syncQueue = (await this.getFromStorage<SyncQueueItem[]>(this.syncQueue)) || [];\n\n if (syncQueue.length === 0) {\n this.syncInProgress = false;\n return true;\n }\n\n this.apiLog(\n \"OfflineStorageService\",\n `Found ${syncQueue.length} items to sync`,\n LogLevelEnum.INFO,\n );\n\n // Keep track of successful and failed sync attempts\n const remainingQueue: SyncQueueItem[] = [];\n\n // Process each queue item\n for (const item of syncQueue) {\n // Skip items that have been attempted too many times\n if (item.syncAttempts >= 5) {\n this.apiLog(\n \"OfflineStorageService\",\n `Skipping item ${item.id} after 5 failed attempts`,\n LogLevelEnum.WARN,\n );\n continue;\n }\n\n try {\n // Attempt to sync this item\n const syncResult = await this.sendDataToLMS(item.data);\n\n if (syncResult.result === global_constants.SCORM_TRUE) {\n // Sync was successful, no need to keep this item\n this.apiLog(\n \"OfflineStorageService\",\n `Successfully synced item ${item.id}`,\n LogLevelEnum.INFO,\n );\n } else {\n // Sync failed, increment attempts and keep in queue\n item.syncAttempts++;\n remainingQueue.push(item);\n this.apiLog(\n \"OfflineStorageService\",\n `Failed to sync item ${item.id}, attempt #${item.syncAttempts}`,\n LogLevelEnum.WARN,\n );\n }\n } catch (error) {\n // On error, increment attempts and keep in queue\n item.syncAttempts++;\n remainingQueue.push(item);\n this.apiLog(\n \"OfflineStorageService\",\n `Error syncing item ${item.id}: ${error}`,\n LogLevelEnum.ERROR,\n );\n }\n }\n\n // Update the queue with remaining items\n await this.saveToStorage(this.syncQueue, remainingQueue);\n\n this.apiLog(\n \"OfflineStorageService\",\n `Sync completed. ${syncQueue.length - remainingQueue.length} items synced, ${remainingQueue.length} items remaining`,\n LogLevelEnum.INFO,\n );\n\n this.syncInProgress = false;\n return true;\n } catch (error) {\n this.apiLog(\n \"OfflineStorageService\",\n `Error during sync process: ${error}`,\n LogLevelEnum.ERROR,\n );\n this.syncInProgress = false;\n return false;\n }\n }\n\n /**\n * Send data to the LMS when online\n * @param {CommitObject} data - The data to send to the LMS\n * @returns {Promise<ResultObject>} - Result of the sync operation\n */\n private async sendDataToLMS(data: CommitObject): Promise<ResultObject> {\n if (!this.settings.lmsCommitUrl) {\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: this.error_codes.GENERAL || 101,\n };\n }\n\n try {\n // Apply request handler if configured\n const processedData = this.settings.requestHandler(data);\n\n // Send the data to the LMS\n const init = {\n method: \"POST\",\n mode: this.settings.fetchMode,\n body: JSON.stringify(processedData),\n headers: {\n ...this.settings.xhrHeaders,\n \"Content-Type\": this.settings.commitRequestDataType,\n },\n } as RequestInit;\n\n if (this.settings.xhrWithCredentials) {\n init.credentials = \"include\";\n }\n\n const response = await fetch(this.settings.lmsCommitUrl as string, init);\n\n // Process the response using the configured handler\n const result =\n typeof this.settings.responseHandler === \"function\"\n ? await this.settings.responseHandler(response)\n : await response.json();\n\n if (\n response.status >= 200 &&\n response.status <= 299 &&\n (result.result === true || result.result === global_constants.SCORM_TRUE)\n ) {\n if (!Object.hasOwnProperty.call(result, \"errorCode\")) {\n result.errorCode = 0;\n }\n return result;\n } else {\n if (!Object.hasOwnProperty.call(result, \"errorCode\")) {\n result.errorCode = this.error_codes.GENERAL;\n }\n return result;\n }\n } catch (error) {\n this.apiLog(\n \"OfflineStorageService\",\n `Error sending data to LMS: ${error}`,\n LogLevelEnum.ERROR,\n );\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: this.error_codes.GENERAL || 101,\n };\n }\n }\n\n /**\n * Check if the device is currently online\n * @returns {boolean} - Online status\n */\n isDeviceOnline(): boolean {\n return this.isOnline;\n }\n\n // noinspection JSValidateJSDoc\n /**\n * Get item from localStorage\n * @param {string} key - The key to retrieve\n * @returns {Promise<T|null>} - The retrieved data\n */\n private async getFromStorage<T>(key: string): Promise<T | null> {\n const storedData = localStorage.getItem(key);\n if (storedData) {\n try {\n return JSON.parse(storedData) as T;\n } catch (e) {\n return null;\n }\n }\n return null;\n }\n\n /**\n * Save item to localStorage\n * @param {string} key - The key to store under\n * @param {any} data - The data to store\n * @returns {Promise<void>}\n */\n private async saveToStorage(key: string, data: any): Promise<void> {\n localStorage.setItem(key, JSON.stringify(data));\n }\n\n /**\n * Check if there is pending offline data for a course\n * @param {string} courseId - Identifier for the course\n * @returns {Promise<boolean>} - Whether there is pending data\n */\n async hasPendingOfflineData(courseId: string): Promise<boolean> {\n const queue = (await this.getFromStorage<SyncQueueItem[]>(this.syncQueue)) || [];\n return queue.some((item) => item.courseId === courseId);\n }\n\n /**\n * Update the service settings\n * @param {Settings} settings - The new settings\n */\n updateSettings(settings: InternalSettings): void {\n this.settings = settings;\n }\n}\n","import { ErrorCode } from \"./constants/error_codes\";\nimport { global_constants } from \"./constants/api_constants\";\nimport * as Utilities from \"./utilities\";\nimport { formatMessage, StringKeyMap, stringMatches } from \"./utilities\";\nimport { BaseCMI, BaseRootCMI } from \"./cmi/common/base_cmi\";\nimport {\n CommitObject,\n InternalSettings,\n LogLevel,\n ResultObject,\n Settings,\n} from \"./types/api_types\";\nimport { defaultLogHandler, DefaultSettings } from \"./constants/default_settings\";\nimport { IBaseAPI } from \"./interfaces/IBaseAPI\";\nimport { ScheduledCommit } from \"./types/scheduled_commit\";\nimport { LogLevelEnum } from \"./constants/enums\";\nimport { HttpService } from \"./services/HttpService\";\nimport { EventService } from \"./services/EventService\";\nimport { SerializationService } from \"./services/SerializationService\";\nimport { createErrorHandlingService } from \"./services/ErrorHandlingService\";\nimport { getLoggingService } from \"./services/LoggingService\";\nimport { OfflineStorageService } from \"./services/OfflineStorageService\";\nimport {\n ICMIDataService,\n IErrorHandlingService,\n IEventService,\n IHttpService,\n ILoggingService,\n IOfflineStorageService,\n ISerializationService,\n} from \"./interfaces/services\";\nimport { CMIArray } from \"./cmi/common/array\";\nimport { ValidationError } from \"./exceptions\";\n\n/**\n * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered\n * abstract, and never initialized on its own.\n */\nexport default abstract class BaseAPI implements IBaseAPI {\n private _timeout?: ScheduledCommit | undefined;\n private readonly _error_codes: ErrorCode;\n private _settings: InternalSettings = DefaultSettings;\n private readonly _httpService: IHttpService;\n private _eventService: IEventService;\n private _serializationService: ISerializationService;\n private readonly _errorHandlingService: IErrorHandlingService;\n private readonly _loggingService: ILoggingService;\n private readonly _offlineStorageService?: IOfflineStorageService;\n private _courseId: string = \"\";\n\n /**\n * Constructor for Base API class. Sets some shared API fields, as well as\n * sets up options for the API.\n * @param {ErrorCode} error_codes - The error codes object\n * @param {Settings} settings - Optional settings for the API\n * @param {IHttpService} httpService - Optional HTTP service instance\n * @param {IEventService} eventService - Optional Event service instance\n * @param {ISerializationService} serializationService - Optional Serialization service instance\n * @param {ICMIDataService} cmiDataService - Optional CMI Data service instance\n * @param {IErrorHandlingService} errorHandlingService - Optional Error Handling service instance\n * @param {ILoggingService} loggingService - Optional Logging service instance\n * @param {IOfflineStorageService} offlineStorageService - Optional Offline Storage service instance\n */\n protected constructor(\n error_codes: ErrorCode,\n settings?: Settings,\n httpService?: IHttpService,\n eventService?: IEventService,\n serializationService?: ISerializationService,\n cmiDataService?: ICMIDataService,\n errorHandlingService?: IErrorHandlingService,\n loggingService?: ILoggingService,\n offlineStorageService?: IOfflineStorageService,\n ) {\n if (new.target === BaseAPI) {\n throw new TypeError(\"Cannot construct BaseAPI instances directly\");\n }\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n\n this._error_codes = error_codes;\n\n if (settings) {\n this.settings = {\n ...DefaultSettings,\n ...settings,\n } as InternalSettings;\n }\n\n // Initialize and configure LoggingService\n this._loggingService = loggingService || getLoggingService();\n this._loggingService.setLogLevel(this.settings.logLevel);\n\n // If settings include a custom onLogMessage function, use it as the log handler\n if (this.settings.onLogMessage) {\n this._loggingService.setLogHandler(this.settings.onLogMessage);\n } else {\n this._loggingService.setLogHandler(defaultLogHandler);\n }\n\n // Initialize HTTP service\n this._httpService = httpService || new HttpService(this.settings, this._error_codes);\n\n // Initialize Event service\n this._eventService =\n eventService ||\n new EventService((functionName, message, level, element) =>\n this.apiLog(functionName, message, level, element),\n );\n\n // Initialize Serialization service\n this._serializationService = serializationService || new SerializationService();\n\n // Initialize Error Handling service\n this._errorHandlingService =\n errorHandlingService ||\n createErrorHandlingService(\n this._error_codes,\n (functionName, message, level, element) =>\n this.apiLog(functionName, message, level || LogLevelEnum.ERROR, element),\n (errorNumber, detail) => this.getLmsErrorMessageDetails(errorNumber, detail),\n );\n\n // Initialize Offline Storage service if enabled\n if (this.settings.enableOfflineSupport) {\n this._offlineStorageService =\n offlineStorageService ||\n new OfflineStorageService(\n this.settings,\n this._error_codes,\n (functionName, message, level, element) =>\n this.apiLog(functionName, message, level, element),\n );\n\n if (this.settings.courseId) {\n this._courseId = this.settings.courseId;\n }\n\n // Check for offline data to restore on initialization\n if (this._offlineStorageService && this._courseId) {\n this._offlineStorageService\n .getOfflineData(this._courseId)\n .then((offlineData) => {\n if (offlineData) {\n this.apiLog(\"constructor\", \"Found offline data to restore\", LogLevelEnum.INFO);\n // Restore data from offline storage\n this.loadFromJSON(offlineData.runtimeData);\n }\n })\n .catch((error) => {\n this.apiLog(\n \"constructor\",\n `Error retrieving offline data: ${error}`,\n LogLevelEnum.ERROR,\n );\n });\n }\n }\n }\n\n public abstract cmi: BaseCMI;\n public startingData?: StringKeyMap;\n\n public currentState: number;\n\n /**\n * Get the last error code\n * @return {string}\n */\n get lastErrorCode(): string {\n return this._errorHandlingService?.lastErrorCode ?? \"0\";\n }\n\n /**\n * Set the last error code\n * @param {string} errorCode\n */\n set lastErrorCode(errorCode: string) {\n if (this._errorHandlingService) {\n this._errorHandlingService.lastErrorCode = errorCode;\n }\n }\n\n /**\n * Protected getter for eventService\n * @return {IEventService}\n */\n protected get eventService(): IEventService {\n return this._eventService;\n }\n\n /**\n * Protected getter for loggingService\n * @return {ILoggingService}\n */\n protected get loggingService(): ILoggingService {\n return this._loggingService;\n }\n\n /**\n * Reset the API to its initial state.\n * This method clears all current data and resets the API to an uninitialized state.\n * It can optionally accept new settings to configure the API after reset.\n *\n * @param {Settings} settings - Optional new settings to apply after reset\n */\n abstract reset(settings?: Settings): void;\n\n /**\n * Common reset method for all APIs. New settings are merged with the existing settings.\n * @param {Settings} settings\n * @protected\n */\n commonReset(settings?: Settings): void {\n this.apiLog(\"reset\", \"Called\", LogLevelEnum.INFO);\n\n this.settings = { ...this.settings, ...settings };\n\n this.clearScheduledCommit();\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = \"0\";\n this._eventService.reset();\n this.startingData = {};\n\n // Update offline storage service with new settings if it exists\n if (this._offlineStorageService) {\n this._offlineStorageService.updateSettings(this.settings);\n\n if (settings?.courseId) {\n this._courseId = settings.courseId;\n }\n }\n }\n\n /**\n * Initialize the API\n * @param {string} callbackName\n * @param {string} initializeMessage\n * @param {string} terminationMessage\n * @return {string}\n */\n initialize(\n callbackName: string,\n initializeMessage?: string,\n terminationMessage?: string,\n ): string {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.isInitialized()) {\n this.throwSCORMError(\"api\", this._error_codes.INITIALIZED, initializeMessage);\n } else if (this.isTerminated()) {\n this.throwSCORMError(\"api\", this._error_codes.TERMINATED, terminationMessage);\n } else {\n if (this.settings.selfReportSessionTime) {\n (this.cmi as BaseRootCMI).setStartTime();\n }\n\n this.currentState = global_constants.STATE_INITIALIZED;\n this.lastErrorCode = \"0\";\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n\n // If enabled, attempt to sync offline data on initialization\n if (\n this.settings.enableOfflineSupport &&\n this._offlineStorageService &&\n this._courseId &&\n this.settings.syncOnInitialize &&\n this._offlineStorageService.isDeviceOnline()\n ) {\n this._offlineStorageService.hasPendingOfflineData(this._courseId).then((hasPendingData) => {\n if (hasPendingData) {\n this.apiLog(\n callbackName,\n \"Syncing pending offline data on initialization\",\n LogLevelEnum.INFO,\n );\n this._offlineStorageService?.syncOfflineData().then((syncSuccess) => {\n if (syncSuccess) {\n this.apiLog(callbackName, \"Successfully synced offline data\", LogLevelEnum.INFO);\n this.processListeners(\"OfflineDataSynced\");\n }\n });\n }\n });\n }\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Initialize the LMS API\n * @return {string} \"true\" if successful, \"false\" otherwise\n */\n abstract lmsInitialize(): string;\n\n /**\n * Finish the current LMS API session\n * @return {string} \"true\" if successful, \"false\" otherwise\n */\n abstract lmsFinish(): string;\n\n /**\n * Get the value of a CMI element from the LMS\n * @param {string} CMIElement - The CMI element to get the value of\n * @return {string} The value of the CMI element\n */\n abstract lmsGetValue(CMIElement: string): string;\n\n /**\n * Set the value of a CMI element in the LMS\n * @param {string} CMIElement - The CMI element to set the value of\n * @param {any} value - The value to set\n * @return {string} \"true\" if successful, \"false\" otherwise\n */\n abstract lmsSetValue(CMIElement: string, value: any): string;\n\n /**\n * Commit the current data to the LMS\n * @return {string} \"true\" if successful, \"false\" otherwise\n */\n abstract lmsCommit(): string;\n\n /**\n * Get the last error code from the LMS\n * @return {string} The last error code\n */\n abstract lmsGetLastError(): string;\n\n /**\n * Get the error string for a specific error code\n * @param {string|number} CMIErrorCode - The error code to get the string for\n * @return {string} The error string\n */\n abstract lmsGetErrorString(CMIErrorCode: string | number): string;\n\n /**\n * Get diagnostic information for a specific error code\n * @param {string|number} CMIErrorCode - The error code to get diagnostic information for\n * @return {string} The diagnostic information\n */\n abstract lmsGetDiagnostic(CMIErrorCode: string | number): string;\n\n /**\n * Abstract method for validating that a response is correct.\n * This method is used to validate the format and content of a response\n * before it is set in the CMI data model.\n *\n * @param {string} _CMIElement - The CMI element path to validate\n * @param {any} _value - The value to validate\n * @throws {Error} If the response format is invalid\n */\n abstract validateCorrectResponse(_CMIElement: string, _value: any): void;\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {BaseCMI|null}\n * @abstract\n */\n abstract getChildElement(\n _CMIElement: string,\n _value: any,\n _foundFirstIndex: boolean,\n ): BaseCMI | null;\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {ResultObject}\n * @abstract\n */\n abstract storeData(_calculateTotalTime: boolean): Promise<ResultObject>;\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} _terminateCommit - Whether this commit is part of the termination process\n * @param {boolean} [_includeTotalTime] - Whether to include total time in the commit data\n * @return {StringKeyMap|Array}\n * @abstract\n */\n abstract renderCommitCMI(\n _terminateCommit: boolean,\n _includeTotalTime?: boolean,\n ): StringKeyMap | Array<string>;\n\n /**\n * Render the commit object to the shortened format for LMS commit.\n * This method transforms the CMI data into a format suitable for sending to the LMS.\n * It is called during the commit process to prepare the data for transmission.\n *\n * @param {boolean} _terminateCommit - Whether this commit is part of the termination process\n * @param {boolean} [_includeTotalTime] - Whether to include total time in the commit data\n * @return {CommitObject} A formatted object containing the data to be sent to the LMS\n * @example\n * // Example of a commit object structure\n * {\n * method: \"POST\",\n * params: {\n * cmi: { ... },\n * finishState: \"COMPLETED\"\n * }\n * }\n */\n abstract renderCommitObject(_terminateCommit: boolean, _includeTotalTime?: boolean): CommitObject;\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} logMessage\n * @param {number} messageLevel\n * @param {string} CMIElement\n */\n apiLog(functionName: string, logMessage: string, messageLevel: LogLevel, CMIElement?: string) {\n logMessage = formatMessage(functionName, logMessage, CMIElement);\n\n // Delegate to LoggingService which handles log level comparison properly\n this._loggingService.log(messageLevel, logMessage);\n }\n\n /**\n * Getter for _settings\n * @return {InternalSettings}\n */\n get settings(): InternalSettings {\n return this._settings;\n }\n\n /**\n * Setter for _settings\n * @param {Settings} settings\n */\n set settings(settings: Settings) {\n const previousSettings = this._settings;\n // Merge the incoming settings with the existing settings\n this._settings = { ...this._settings, ...settings } as InternalSettings;\n\n // Update HTTP service settings\n this._httpService?.updateSettings(this._settings);\n\n // The following properties are duplicated as class properties for easier access\n // and need to be manually updated to stay in sync with the settings object\n\n // Update log level if it changed\n if (settings.logLevel !== undefined && settings.logLevel !== previousSettings.logLevel) {\n this._loggingService?.setLogLevel(settings.logLevel);\n }\n\n // Update log handler if onLogMessage changed\n if (\n settings.onLogMessage !== undefined &&\n settings.onLogMessage !== previousSettings.onLogMessage\n ) {\n this._loggingService?.setLogHandler(settings.onLogMessage);\n }\n }\n\n /**\n * Terminates the current run of the API\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n async terminate(callbackName: string, checkTerminated: boolean): Promise<string> {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.TERMINATION_BEFORE_INIT ?? 0,\n this._error_codes.MULTIPLE_TERMINATION ?? 0,\n )\n ) {\n this.currentState = global_constants.STATE_TERMINATED;\n // If enabled, attempt to sync offline data before termination\n if (\n this.settings.enableOfflineSupport &&\n this._offlineStorageService &&\n this._courseId &&\n this.settings.syncOnTerminate &&\n this._offlineStorageService.isDeviceOnline()\n ) {\n const hasPendingData = await this._offlineStorageService.hasPendingOfflineData(\n this._courseId,\n );\n if (hasPendingData) {\n this.apiLog(\n callbackName,\n \"Syncing pending offline data before termination\",\n LogLevelEnum.INFO,\n );\n await this._offlineStorageService.syncOfflineData();\n }\n }\n\n const result: ResultObject = await this.storeData(true);\n if ((result.errorCode ?? 0) > 0) {\n // Log detailed error information before throwing SCORM error\n if (result.errorMessage) {\n this.apiLog(\n \"terminate\",\n `Terminate failed with error: ${result.errorMessage}`,\n LogLevelEnum.ERROR,\n );\n }\n if (result.errorDetails) {\n this.apiLog(\n \"terminate\",\n `Error details: ${JSON.stringify(result.errorDetails)}`,\n LogLevelEnum.DEBUG,\n );\n }\n this.throwSCORMError(\"api\", result.errorCode ?? 0);\n }\n returnValue = result?.result ?? global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = \"0\";\n\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(callbackName: string, checkTerminated: boolean, CMIElement: string): string {\n let returnValue: string = \"\";\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.RETRIEVE_BEFORE_INIT ?? 0,\n this._error_codes.RETRIEVE_AFTER_TERM ?? 0,\n )\n ) {\n // Only reset the error code if there's no error and checkTerminated is true\n // This is a no-op if lastErrorCode is already \"0\"\n try {\n returnValue = this.getCMIValue(CMIElement);\n } catch (e) {\n returnValue = this.handleValueAccessException(CMIElement, e, returnValue);\n }\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(callbackName, \": returned: \" + returnValue, LogLevelEnum.INFO, CMIElement);\n\n if (returnValue === undefined) {\n return \"\";\n }\n\n // Only clear the error code if there's no error\n if (this.lastErrorCode === \"0\") {\n this.clearSCORMError(returnValue);\n }\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {string} commitCallback\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: string,\n commitCallback: string,\n checkTerminated: boolean,\n CMIElement: string,\n value: any,\n ): string {\n if (value !== undefined) {\n value = String(value);\n }\n let returnValue: string = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.STORE_BEFORE_INIT ?? 0,\n this._error_codes.STORE_AFTER_TERM ?? 0,\n )\n ) {\n // Only reset the error code if there's no error and checkTerminated is true\n // This is a no-op if lastErrorCode is already \"0\"\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n returnValue = this.handleValueAccessException(CMIElement, e, returnValue);\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === \"0\") {\n if (this.settings.autocommit) {\n this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);\n }\n }\n\n this.apiLog(\n callbackName,\n \": \" + value + \": result: \" + returnValue,\n LogLevelEnum.INFO,\n CMIElement,\n );\n\n // Only clear the error code if there's no error\n if (this.lastErrorCode === \"0\") {\n this.clearSCORMError(returnValue);\n }\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n async commit(callbackName: string, checkTerminated: boolean = false): Promise<string> {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (\n this.checkState(\n checkTerminated,\n this._error_codes.COMMIT_BEFORE_INIT ?? 0,\n this._error_codes.COMMIT_AFTER_TERM ?? 0,\n )\n ) {\n const result = await this.storeData(false);\n if ((result.errorCode ?? 0) > 0) {\n // Log detailed error information before throwing SCORM error\n if (result.errorMessage) {\n this.apiLog(\n \"commit\",\n `Commit failed with error: ${result.errorMessage}`,\n LogLevelEnum.ERROR,\n );\n }\n if (result.errorDetails) {\n this.apiLog(\n \"commit\",\n `Error details: ${JSON.stringify(result.errorDetails)}`,\n LogLevelEnum.DEBUG,\n );\n }\n this.throwSCORMError(\"api\", result.errorCode);\n }\n returnValue = result?.result ?? global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, \" Result: \" + returnValue, LogLevelEnum.DEBUG, \"HttpRequest\");\n\n if (checkTerminated) this.lastErrorCode = \"0\";\n\n this.processListeners(callbackName);\n\n // If online and there is offline data pending, attempt to sync it\n if (\n this.settings.enableOfflineSupport &&\n this._offlineStorageService &&\n this._offlineStorageService.isDeviceOnline() &&\n this._courseId\n ) {\n this._offlineStorageService.hasPendingOfflineData(this._courseId).then((hasPendingData) => {\n if (hasPendingData) {\n this.apiLog(callbackName, \"Syncing pending offline data\", LogLevelEnum.INFO);\n this._offlineStorageService?.syncOfflineData().then((syncSuccess) => {\n if (syncSuccess) {\n this.apiLog(callbackName, \"Successfully synced offline data\", LogLevelEnum.INFO);\n this.processListeners(\"OfflineDataSynced\");\n } else {\n this.apiLog(callbackName, \"Failed to sync some offline data\", LogLevelEnum.WARN);\n }\n });\n }\n });\n }\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n // Only clear the error code if there's no error\n if (this.lastErrorCode === \"0\") {\n this.clearSCORMError(returnValue);\n }\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: string): string {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: string, CMIErrorCode: string | number): string {\n let returnValue = \"\";\n\n if (CMIErrorCode !== null && CMIErrorCode !== \"\") {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: string, CMIErrorCode: string | number): string {\n let returnValue = \"\";\n\n if (CMIErrorCode !== null && CMIErrorCode !== \"\") {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, \"returned: \" + returnValue, LogLevelEnum.INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(checkTerminated: boolean, beforeInitError: number, afterTermError: number): boolean {\n if (this.isNotInitialized()) {\n this.throwSCORMError(\"api\", beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(\"api\", afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber: string | number, _detail: boolean = false): string {\n throw new Error(\"The getLmsErrorMessageDetails method has not been implemented\");\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement: string): string {\n throw new Error(\"The getCMIValue method has not been implemented\");\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement: string, _value: any): string {\n throw new Error(\"The setCMIValue method has not been implemented\");\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: string,\n scorm2004: boolean,\n CMIElement: string,\n value: any,\n ): string {\n if (!CMIElement || CMIElement === \"\") {\n return global_constants.SCORM_FALSE;\n }\n\n this.lastErrorCode = \"0\";\n\n const structure = CMIElement.split(\".\");\n let refObject: StringKeyMap | BaseCMI = this as StringKeyMap;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004\n ? this._error_codes.UNDEFINED_DATA_MODEL\n : this._error_codes.GENERAL;\n\n for (let idx = 0; idx < structure.length; idx++) {\n const attribute = structure[idx];\n\n if (idx === structure.length - 1) {\n if (scorm2004 && attribute && attribute.substring(0, 8) === \"{target=\") {\n if (this.isInitialized()) {\n this.throwSCORMError(CMIElement, this._error_codes.READ_ONLY_ELEMENT);\n break;\n } else {\n refObject = {\n ...refObject,\n attribute: value,\n };\n }\n } else if (\n typeof attribute === \"undefined\" ||\n !this._checkObjectHasProperty(refObject as StringKeyMap, attribute)\n ) {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n break;\n } else {\n if (\n stringMatches(CMIElement, \"\\\\.correct_responses\\\\.\\\\d+$\") &&\n this.isInitialized() &&\n attribute !== \"pattern\"\n ) {\n this.validateCorrectResponse(CMIElement, value);\n if (this.lastErrorCode !== \"0\") {\n this.throwSCORMError(CMIElement, this._error_codes.TYPE_MISMATCH);\n break;\n }\n }\n\n if (!scorm2004 || this._errorHandlingService.lastErrorCode === \"0\") {\n if (\n typeof attribute === \"undefined\" ||\n attribute === \"__proto__\" ||\n attribute === \"constructor\"\n ) {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n break;\n }\n (refObject as StringKeyMap)[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n if (\n typeof attribute === \"undefined\" ||\n !this._checkObjectHasProperty(refObject as StringKeyMap, attribute)\n ) {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n break;\n }\n refObject = (refObject as StringKeyMap)[attribute] as StringKeyMap;\n if (!refObject) {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[idx + 1] || \"0\", 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n foundFirstIndex = true;\n } else {\n const newChild = this.getChildElement(CMIElement, value, foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n if (this.lastErrorCode === \"0\") {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n }\n break;\n } else {\n if (refObject.initialized) newChild.initialize();\n refObject.childArray[index] = newChild;\n refObject = newChild;\n }\n }\n\n // Have to update idx value to skip the array position\n idx++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(\n methodName,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n LogLevelEnum.WARN,\n );\n }\n\n return returnValue;\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {any}\n */\n _commonGetCMIValue(methodName: string, scorm2004: boolean, CMIElement: string): any {\n if (!CMIElement || CMIElement === \"\") {\n return \"\";\n }\n\n const structure = CMIElement.split(\".\");\n let refObject: StringKeyMap = this as StringKeyMap;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004\n ? this._error_codes.UNDEFINED_DATA_MODEL\n : this._error_codes.GENERAL;\n\n for (let idx = 0; idx < structure.length; idx++) {\n attribute = structure[idx];\n\n if (!scorm2004) {\n if (idx === structure.length - 1) {\n if (\n typeof attribute === \"undefined\" ||\n !this._checkObjectHasProperty(refObject, attribute)\n ) {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if (\n String(attribute).substring(0, 8) === \"{target=\" &&\n typeof refObject._isTargetValid == \"function\"\n ) {\n const target = String(attribute).substring(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (\n typeof attribute === \"undefined\" ||\n !this._checkObjectHasProperty(refObject, attribute)\n ) {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n if (attribute !== undefined && attribute !== null) {\n refObject = refObject[attribute] as StringKeyMap;\n if (refObject === undefined) {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n break;\n }\n } else {\n this.throwSCORMError(CMIElement, invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[idx + 1] || \"\", 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(\n CMIElement,\n this._error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage,\n );\n break;\n }\n\n // Have to update idx value to skip the array position\n idx++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === \"_children\") {\n this.throwSCORMError(CMIElement, this._error_codes.CHILDREN_ERROR, undefined);\n } else if (attribute === \"_count\") {\n this.throwSCORMError(CMIElement, this._error_codes.COUNT_ERROR, undefined);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized(): boolean {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized(): boolean {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated(): boolean {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event.\n * This method allows you to register a callback function that will be executed\n * when the specified event occurs.\n *\n * @param {string} listenerName - The name of the event to listen for (e.g., \"Initialize\", \"Terminate\", \"GetValue\", \"SetValue\", \"Commit\")\n * @param {function} callback - The function to execute when the event occurs. The callback will receive relevant event data.\n * @example\n * // Listen for Initialize events\n * api.on(\"Initialize\", function() {\n * console.log(\"API has been initialized\");\n * });\n *\n * // Listen for SetValue events\n * api.on(\"SetValue\", function(element, value) {\n * console.log(\"Setting \" + element + \" to \" + value);\n * });\n */\n on(listenerName: string, callback: Function) {\n this._eventService.on(listenerName, callback);\n }\n\n /**\n * Provides a mechanism for detaching a specific SCORM event listener.\n * This method removes a previously registered callback for an event.\n * Both the event name and the callback reference must match what was used in the 'on' method.\n *\n * @param {string} listenerName - The name of the event to stop listening for\n * @param {function} callback - The callback function to remove\n * @example\n * // Remove a specific listener\n * const myCallback = function() { console.log(\"API initialized\"); };\n * api.on(\"Initialize\", myCallback);\n * // Later, when you want to remove it:\n * api.off(\"Initialize\", myCallback);\n */\n off(listenerName: string, callback: Function) {\n this._eventService.off(listenerName, callback);\n }\n\n /**\n * Provides a mechanism for clearing all listeners from a specific SCORM event.\n * This method removes all callbacks registered for the specified event.\n *\n * @param {string} listenerName - The name of the event to clear all listeners for\n * @example\n * // Remove all listeners for the Initialize event\n * api.clear(\"Initialize\");\n */\n clear(listenerName: string) {\n this._eventService.clear(listenerName);\n }\n\n /**\n * Processes any 'on' listeners that have been created for a specific event.\n * This method is called internally when SCORM events occur to notify all registered listeners.\n * It triggers all callback functions registered for the specified event.\n *\n * @param {string} functionName - The name of the function/event that occurred\n * @param {string} CMIElement - Optional CMI element involved in the event\n * @param {any} value - Optional value associated with the event\n */\n processListeners(functionName: string, CMIElement?: string, value?: any) {\n this._eventService.processListeners(functionName, CMIElement, value);\n }\n\n /**\n * Throws a SCORM error with the specified error number and optional message.\n * This method sets the last error code and can be used to indicate that an operation failed.\n * The error number should correspond to one of the standard SCORM error codes.\n *\n * @param {string} CMIElement\n * @param {number} errorNumber - The SCORM error code to set\n * @param {string} message - Optional custom error message to provide additional context\n * @example\n * // Throw a \"not initialized\" error\n * this.throwSCORMError(301, \"The API must be initialized before calling GetValue\");\n */\n throwSCORMError(\n CMIElement: string | undefined,\n errorNumber: number | undefined,\n message?: string,\n ) {\n this._errorHandlingService.throwSCORMError(CMIElement, errorNumber ?? 0, message);\n }\n\n /**\n * Clears the last SCORM error code when an operation succeeds.\n * This method is typically called after successful API operations to reset the error state.\n * It only clears the error if the success parameter is \"true\".\n *\n * @param {string} success - A string indicating whether the operation succeeded (\"true\" or \"false\")\n * @example\n * // Clear error after successful operation\n * this.clearSCORMError(\"true\");\n */\n clearSCORMError(success: string) {\n this._errorHandlingService.clearSCORMError(success);\n }\n\n /**\n * Load the CMI from a flattened JSON object.\n * This method populates the CMI data model from a flattened JSON structure\n * where keys represent CMI element paths (e.g., \"cmi.core.student_id\").\n *\n * @param {StringKeyMap} json - The flattened JSON object containing CMI data\n * @param {string} CMIElement - Optional base CMI element path to prepend to all keys\n * @example\n * // Load data from a flattened JSON structure\n * api.loadFromFlattenedJSON({\n * \"cmi.core.student_id\": \"12345\",\n * \"cmi.core.student_name\": \"John Doe\",\n * \"cmi.core.lesson_status\": \"incomplete\"\n * });\n */\n loadFromFlattenedJSON(json: StringKeyMap, CMIElement?: string) {\n if (!CMIElement) {\n // by default, we start from a blank string because we're expecting each element to start with `cmi`\n CMIElement = \"\";\n }\n\n this._serializationService.loadFromFlattenedJSON(\n json,\n CMIElement,\n (CMIElement, value) => this.setCMIValue(CMIElement, value),\n () => this.isNotInitialized(),\n (data: StringKeyMap) => {\n this.startingData = data;\n },\n );\n }\n\n /**\n * Returns a flattened JSON object representing the current CMI data.\n */\n getFlattenedCMI(): StringKeyMap {\n return Utilities.flatten(this.renderCMIToJSONObject());\n }\n\n /**\n * Loads CMI data from a hierarchical JSON object.\n * This method populates the CMI data model from a nested JSON structure\n * that mirrors the CMI object hierarchy.\n *\n * @param {StringKeyMap} json - The hierarchical JSON object containing CMI data\n * @param {string} CMIElement - Optional base CMI element path to prepend to all keys\n * @example\n * // Load data from a hierarchical JSON structure\n * api.loadFromJSON({\n * core: {\n * student_id: \"12345\",\n * student_name: \"John Doe\",\n * lesson_status: \"incomplete\"\n * },\n * objectives: [\n * { id: \"obj1\", score: { raw: 85 } }\n * ]\n * });\n */\n loadFromJSON(json: StringKeyMap, CMIElement: string = \"\") {\n if (\n (!CMIElement || CMIElement === \"\") &&\n !Object.hasOwnProperty.call(json, \"cmi\") &&\n !Object.hasOwnProperty.call(json, \"adl\")\n ) {\n // providing a backward compatibility for the old v1 API\n CMIElement = \"cmi\";\n }\n this._serializationService.loadFromJSON(\n json,\n CMIElement,\n (CMIElement, value) => this.setCMIValue(CMIElement, value),\n () => this.isNotInitialized(),\n (data: StringKeyMap) => {\n this.startingData = data;\n },\n );\n }\n\n /**\n * Render the CMI object to a JSON string for sending to an LMS.\n * This method serializes the current CMI data model to a JSON string.\n * The output format is controlled by the sendFullCommit setting.\n *\n * @return {string} A JSON string representation of the CMI data\n * @example\n * // Get the current CMI data as a JSON string\n * const jsonString = api.renderCMIToJSONString();\n * console.log(jsonString); // '{\"core\":{\"student_id\":\"12345\",...}}'\n */\n renderCMIToJSONString(): string {\n return this._serializationService.renderCMIToJSONString(this.cmi, this.settings.sendFullCommit);\n }\n\n /**\n * Returns a JavaScript object representing the current CMI data.\n * This method creates a plain JavaScript object that mirrors the\n * structure of the CMI data model, suitable for further processing.\n *\n * @return {StringKeyMap} A JavaScript object representing the CMI data\n * @example\n * // Get the current CMI data as a JavaScript object\n * const cmiObject = api.renderCMIToJSONObject();\n * console.log(cmiObject.core.student_id); // \"12345\"\n */\n renderCMIToJSONObject(): StringKeyMap {\n return this._serializationService.renderCMIToJSONObject(this.cmi, this.settings.sendFullCommit);\n }\n\n /**\n * Process an HTTP request\n *\n * @param {string} url - The URL to send the request to\n * @param {CommitObject | StringKeyMap | Array<any>} params - The parameters to send\n * @param {boolean} immediate - Whether to send the request immediately without waiting\n * @returns {Promise<ResultObject>} - The result of the request\n * @async\n */\n async processHttpRequest(\n url: string,\n params: CommitObject | StringKeyMap | Array<any>,\n immediate: boolean = false,\n ): Promise<ResultObject> {\n // If offline support is enabled and device is offline, store data locally instead of sending\n if (\n this.settings.enableOfflineSupport &&\n this._offlineStorageService &&\n !this._offlineStorageService.isDeviceOnline() &&\n this._courseId\n ) {\n this.apiLog(\n \"processHttpRequest\",\n \"Device is offline, storing data locally\",\n LogLevelEnum.INFO,\n );\n\n if (params && typeof params === \"object\" && \"cmi\" in params) {\n return await this._offlineStorageService.storeOffline(\n this._courseId,\n params as CommitObject,\n );\n } else {\n this.apiLog(\n \"processHttpRequest\",\n \"Invalid commit data format for offline storage\",\n LogLevelEnum.ERROR,\n );\n return {\n result: global_constants.SCORM_FALSE,\n errorCode: this._error_codes.GENERAL ?? 101, // Fallback to a default error code if GENERAL is undefined\n };\n }\n }\n\n // Otherwise, proceed with normal HTTP request\n return await this._httpService.processHttpRequest(\n url,\n params,\n immediate,\n (functionName, message, level, element) => this.apiLog(functionName, message, level, element),\n (functionName, CMIElement, value) => this.processListeners(functionName, CMIElement, value),\n );\n }\n\n /**\n * Schedules a commit operation to occur after a specified delay.\n * This method is used to implement auto-commit functionality, where data\n * is periodically sent to the LMS without requiring explicit commit calls.\n *\n * @param {number} when - The number of milliseconds to wait before committing\n * @param {string} callback - The name of the commit event callback\n * @example\n * // Schedule a commit to happen in 60 seconds\n * api.scheduleCommit(60000, \"commit\");\n */\n scheduleCommit(when: number, callback: string) {\n if (!this._timeout) {\n this._timeout = new ScheduledCommit(this, when, callback);\n this.apiLog(\"scheduleCommit\", \"scheduled\", LogLevelEnum.DEBUG, \"\");\n }\n }\n\n /**\n * Clears and cancels any currently scheduled commits.\n * This method is typically called when an explicit commit is performed\n * or when the API is terminated, to prevent redundant commits.\n *\n * @example\n * // Cancel any pending scheduled commits\n * api.clearScheduledCommit();\n */\n clearScheduledCommit() {\n if (this._timeout) {\n this._timeout.cancel();\n this._timeout = undefined;\n this.apiLog(\"clearScheduledCommit\", \"cleared\", LogLevelEnum.DEBUG, \"\");\n }\n }\n\n /**\n * Checks if an object has a specific property, using multiple detection methods.\n * This method performs a thorough check for property existence by:\n * 1. Checking if it's an own property using Object.hasOwnProperty\n * 2. Checking if it's defined in the prototype with a property descriptor\n * 3. Checking if it's accessible via the 'in' operator (includes inherited properties)\n *\n * @param {StringKeyMap} StringKeyMap - The object to check for the property\n * @param {string} attribute - The property name to look for\n * @return {boolean} True if the property exists on the object or its prototype chain\n * @private\n *\n * @example\n * // Check for an own property\n * const obj = { name: \"John\" };\n * this._checkObjectHasProperty(obj, \"name\"); // Returns true\n *\n * @example\n * // Check for an inherited property\n * class Parent { get type() { return \"parent\"; } }\n * const child = Object.create(new Parent());\n * this._checkObjectHasProperty(child, \"type\"); // Returns true\n *\n * @example\n * // Check for a non-existent property\n * const obj = { name: \"John\" };\n * this._checkObjectHasProperty(obj, \"age\"); // Returns false\n */\n private _checkObjectHasProperty(StringKeyMap: StringKeyMap, attribute: string): boolean {\n return (\n Object.hasOwnProperty.call(StringKeyMap, attribute) ||\n Object.getOwnPropertyDescriptor(Object.getPrototypeOf(StringKeyMap), attribute) != null ||\n attribute in StringKeyMap\n );\n }\n\n /**\n * Handles exceptions that occur when accessing CMI values.\n * This method delegates to the ErrorHandlingService to process exceptions\n * that occur during CMI data operations, ensuring consistent error handling\n * throughout the API.\n *\n * @param {string} CMIElement\n * @param {any} e - The exception that was thrown\n * @param {string} returnValue - The default return value to use if an error occurs\n * @return {string} Either the original returnValue or SCORM_FALSE if an error occurred\n * @private\n *\n * @example\n * // Handle a validation error when getting a CMI value\n * try {\n * return this.getCMIValue(\"cmi.core.score.raw\");\n * } catch (e) {\n * return this.handleValueAccessException(e, \"\");\n * }\n *\n * @example\n * // Handle a general error when setting a CMI value\n * try {\n * this.setCMIValue(\"cmi.core.lesson_status\", \"completed\");\n * return \"true\";\n * } catch (e) {\n * return this.handleValueAccessException(e, \"false\");\n * }\n */\n private handleValueAccessException(CMIElement: string, e: any, returnValue: string): string {\n if (e instanceof ValidationError) {\n this.lastErrorCode = String(e.errorCode);\n returnValue = global_constants.SCORM_FALSE;\n this.throwSCORMError(CMIElement, e.errorCode, e.errorMessage);\n } else {\n if (e instanceof Error && e.message) {\n this.throwSCORMError(CMIElement, this._error_codes.GENERAL, e.message);\n } else {\n this.throwSCORMError(CMIElement, this._error_codes.GENERAL, \"Unknown error\");\n }\n }\n return returnValue;\n }\n\n /**\n * Builds the commit object to be sent to the LMS.\n * This method delegates to the SerializationService to create a properly\n * formatted object containing the CMI data that needs to be sent to the LMS.\n * The format and content of the commit object depend on whether this is a\n * regular commit or a termination commit.\n *\n * @param {boolean} terminateCommit - Whether this is a termination commit\n * @return {CommitObject|StringKeyMap|Array} The formatted commit object\n * @protected\n *\n * @example\n * // Create a regular commit object\n * const regularCommit = this.getCommitObject(false);\n * // Result might be: { cmi: { core: { lesson_status: \"incomplete\" } } }\n *\n * @example\n * // Create a termination commit object (includes total_time)\n * const terminationCommit = this.getCommitObject(true);\n * // Result might be: { cmi: { core: { lesson_status: \"completed\", total_time: \"PT1H30M\" } } }\n */\n protected getCommitObject(terminateCommit: boolean): CommitObject | StringKeyMap | Array<any> {\n return this._serializationService.getCommitObject(\n terminateCommit,\n this.settings.alwaysSendTotalTime,\n this.settings.renderCommonCommitFields,\n (terminateCommit: boolean, includeTotalTime?: boolean) =>\n this.renderCommitObject(terminateCommit, includeTotalTime),\n (terminateCommit: boolean, includeTotalTime?: boolean) =>\n this.renderCommitCMI(terminateCommit, includeTotalTime),\n this.settings.logLevel,\n );\n }\n}\n","import { CMI } from \"./cmi/scorm12/cmi\";\nimport * as Utilities from \"./utilities\";\nimport { StringKeyMap, stringMatches } from \"./utilities\";\nimport { global_constants, scorm12_constants } from \"./constants/api_constants\";\nimport { scorm12_errors } from \"./constants/error_codes\";\n\nimport { BaseCMI } from \"./cmi/common/base_cmi\";\nimport { CMIObjectivesObject } from \"./cmi/scorm12/objectives\";\nimport {\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n} from \"./cmi/scorm12/interactions\";\nimport { NAV } from \"./cmi/scorm12/nav\";\nimport { CommitObject, ResultObject, ScoreObject, Settings } from \"./types/api_types\";\nimport { CompletionStatus, SuccessStatus } from \"./constants/enums\";\nimport BaseAPI from \"./BaseAPI\";\nimport { scorm12_regex } from \"./constants/regex\";\n\n/**\n * API class for SCORM 1.2\n */\nclass Scorm12API extends BaseAPI {\n /**\n * Constructor for SCORM 1.2 API\n * @param {object} settings\n */\n constructor(settings?: Settings) {\n if (settings) {\n if (settings.mastery_override === undefined) {\n settings.mastery_override = false;\n }\n }\n\n super(scorm12_errors, settings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n\n // Rename functions to match 1.2 Spec and expose to modules\n this.LMSInitialize = this.lmsInitialize;\n this.LMSFinish = this.lmsFinish;\n this.LMSGetValue = this.lmsGetValue;\n this.LMSSetValue = this.lmsSetValue;\n this.LMSCommit = this.lmsCommit;\n this.LMSGetLastError = this.lmsGetLastError;\n this.LMSGetErrorString = this.lmsGetErrorString;\n this.LMSGetDiagnostic = this.lmsGetDiagnostic;\n }\n\n public statusSetByModule = false;\n\n cmi: CMI;\n nav: NAV;\n\n LMSInitialize: () => string;\n LMSFinish: () => string;\n LMSGetValue: (CMIElement: string) => string;\n LMSSetValue: (CMIElement: string, value: any) => string;\n LMSCommit: () => string;\n LMSGetLastError: () => string;\n LMSGetErrorString: (CMIErrorCode: string) => string;\n LMSGetDiagnostic: (CMIErrorCode: string) => string;\n\n /**\n * Called when the API needs to be reset\n */\n reset(settings?: Settings) {\n this.commonReset(settings);\n\n this.cmi?.reset();\n this.nav?.reset();\n }\n\n /**\n * lmsInitialize function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsInitialize(): string {\n this.cmi.initialize();\n if (this.cmi.core.lesson_status) {\n this.statusSetByModule = true;\n } else {\n this.cmi.core.lesson_status = \"not attempted\";\n }\n return this.initialize(\n \"LMSInitialize\",\n \"LMS was already initialized!\",\n \"LMS is already finished!\",\n );\n }\n\n /**\n * LMSFinish function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsFinish(): string {\n (async () => {\n await this.internalFinish();\n })();\n return global_constants.SCORM_TRUE;\n }\n\n async internalFinish(): Promise<string> {\n const result = await this.terminate(\"LMSFinish\", true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.nav.event !== \"\") {\n if (this.nav.event === \"continue\") {\n this.processListeners(\"SequenceNext\");\n } else {\n this.processListeners(\"SequencePrevious\");\n }\n } else if (this.settings.autoProgress) {\n this.processListeners(\"SequenceNext\");\n }\n }\n\n return result;\n }\n\n /**\n * LMSGetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement: string): string {\n return this.getValue(\"LMSGetValue\", false, CMIElement);\n }\n\n /**\n * LMSSetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n lmsSetValue(CMIElement: string, value: any): string {\n if (CMIElement === \"cmi.core.lesson_status\") {\n this.statusSetByModule = true;\n }\n return this.setValue(\"LMSSetValue\", \"LMSCommit\", false, CMIElement, value);\n }\n\n /**\n * LMSCommit function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsCommit(): string {\n if (this.settings.asyncCommit) {\n this.scheduleCommit(500, \"LMSCommit\");\n } else {\n (async () => {\n await this.commit(\"LMSCommit\", false);\n })();\n }\n return global_constants.SCORM_TRUE;\n }\n\n /**\n * LMSGetLastError function from SCORM 1.2 Spec\n *\n * @return {string}\n */\n lmsGetLastError(): string {\n return this.getLastError(\"LMSGetLastError\");\n }\n\n /**\n * LMSGetErrorString function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode: string): string {\n return this.getErrorString(\"LMSGetErrorString\", CMIErrorCode);\n }\n\n /**\n * LMSGetDiagnostic function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode: string): string {\n return this.getDiagnostic(\"LMSGetDiagnostic\", CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n override setCMIValue(CMIElement: string, value: any): string {\n return this._commonSetCMIValue(\"LMSSetValue\", false, CMIElement, value);\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n override getCMIValue(CMIElement: string): any {\n return this._commonGetCMIValue(\"getCMIValue\", false, CMIElement);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {*} _value\n * @param {boolean} foundFirstIndex\n * @return {BaseCMI|null}\n */\n getChildElement(CMIElement: string, _value: any, foundFirstIndex: boolean): BaseCMI | null {\n if (stringMatches(CMIElement, \"cmi\\\\.objectives\\\\.\\\\d+\")) {\n return new CMIObjectivesObject();\n } else if (\n foundFirstIndex &&\n stringMatches(CMIElement, \"cmi\\\\.interactions\\\\.\\\\d+\\\\.correct_responses\\\\.\\\\d+\")\n ) {\n return new CMIInteractionsCorrectResponsesObject();\n } else if (\n foundFirstIndex &&\n stringMatches(CMIElement, \"cmi\\\\.interactions\\\\.\\\\d+\\\\.objectives\\\\.\\\\d+\")\n ) {\n return new CMIInteractionsObjectivesObject();\n } else if (!foundFirstIndex && stringMatches(CMIElement, \"cmi\\\\.interactions\\\\.\\\\d+\")) {\n return new CMIInteractionsObject();\n }\n\n return null;\n }\n\n /**\n * Validates Correct Response values\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement: string, _value: any) {\n // do nothing\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {number|string} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n override getLmsErrorMessageDetails(errorNumber: number | string, detail: boolean): string {\n let basicMessage = \"No Error\";\n let detailMessage = \"No Error\";\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (scorm12_constants.error_descriptions[errorNumber]) {\n basicMessage =\n scorm12_constants.error_descriptions[errorNumber]?.basicMessage || basicMessage;\n detailMessage =\n scorm12_constants.error_descriptions[errorNumber]?.detailMessage || detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {Scorm12API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI: Scorm12API) {\n // Data Model\n this.cmi = newAPI.cmi;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit - Whether this is a termination commit\n * @param {boolean} includeTotalTime - Whether to include total time in the commit data\n * @return {object|Array}\n */\n renderCommitCMI(\n terminateCommit: boolean,\n includeTotalTime: boolean = false,\n ): StringKeyMap | Array<string> {\n const cmiExport: StringKeyMap = this.renderCMIToJSONObject();\n\n if (terminateCommit || includeTotalTime) {\n (cmiExport.cmi as any).core.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened: StringKeyMap = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case \"flattened\":\n return Utilities.flatten(cmiExport);\n case \"params\":\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case \"json\":\n default:\n return cmiExport;\n }\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * @param {boolean} terminateCommit - Whether this is a termination commit\n * @param {boolean} includeTotalTime - Whether to include total time in the commit data\n * @return {CommitObject}\n */\n renderCommitObject(terminateCommit: boolean, includeTotalTime: boolean = false): CommitObject {\n const cmiExport = this.renderCommitCMI(terminateCommit, includeTotalTime);\n const calculateTotalTime = terminateCommit || includeTotalTime;\n const totalTimeHHMMSS = calculateTotalTime ? this.cmi.getCurrentTotalTime() : \"\";\n const totalTimeSeconds = Utilities.getTimeAsSeconds(totalTimeHHMMSS, scorm12_regex.CMITimespan);\n const lessonStatus = this.cmi.core.lesson_status;\n let completionStatus = CompletionStatus.UNKNOWN;\n let successStatus = SuccessStatus.UNKNOWN;\n if (lessonStatus) {\n completionStatus =\n lessonStatus === \"completed\" || lessonStatus === \"passed\"\n ? CompletionStatus.COMPLETED\n : CompletionStatus.INCOMPLETE;\n if (lessonStatus === \"passed\") {\n successStatus = SuccessStatus.PASSED;\n } else if (lessonStatus === \"failed\") {\n successStatus = SuccessStatus.FAILED;\n }\n }\n\n const scoreObject: ScoreObject = this.cmi?.core?.score?.getScoreObject() || {};\n const commitObject: CommitObject = {\n successStatus: successStatus,\n completionStatus: completionStatus,\n runtimeData: cmiExport as StringKeyMap,\n totalTimeSeconds: totalTimeSeconds,\n };\n if (scoreObject) {\n commitObject.score = scoreObject;\n }\n return commitObject;\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {ResultObject}\n */\n async storeData(terminateCommit: boolean): Promise<ResultObject> {\n if (terminateCommit) {\n const originalStatus = this.cmi.core.lesson_status;\n if (\n !this.cmi.core.lesson_status ||\n (!this.statusSetByModule && this.cmi.core.lesson_status === \"not attempted\")\n ) {\n this.cmi.core.lesson_status = \"completed\";\n }\n\n if (this.cmi.core.lesson_mode === \"normal\") {\n if (this.cmi.core.credit === \"credit\") {\n if (\n this.settings.mastery_override &&\n this.cmi.student_data.mastery_score !== \"\" &&\n this.cmi.core.score.raw !== \"\"\n ) {\n this.cmi.core.lesson_status =\n parseFloat(this.cmi.core.score.raw) >= parseFloat(this.cmi.student_data.mastery_score)\n ? \"passed\"\n : \"failed\";\n }\n }\n } else if (this.cmi.core.lesson_mode === \"browse\") {\n if (\n ((this.startingData?.cmi as any)?.core?.lesson_status || \"\") === \"\" &&\n originalStatus === \"not attempted\"\n ) {\n this.cmi.core.lesson_status = \"browsed\";\n }\n }\n }\n\n const commitObject = this.getCommitObject(terminateCommit);\n if (typeof this.settings.lmsCommitUrl === \"string\") {\n return await this.processHttpRequest(\n this.settings.lmsCommitUrl,\n commitObject,\n terminateCommit,\n );\n } else {\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n }\n }\n}\n\nexport default Scorm12API;\n","import { ValidationError } from \"../exceptions\";\nimport { aicc_constants } from \"../constants/api_constants\";\n\nconst aicc_errors = aicc_constants.error_descriptions;\n\n/**\n * AICC Validation Error\n */\nexport class AICCValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {string} CMIElement\n * @param {number} errorCode\n */\n constructor(CMIElement: string, errorCode: number) {\n if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {\n super(\n CMIElement,\n errorCode,\n aicc_errors[String(errorCode)]?.basicMessage || \"Unknown error\",\n aicc_errors[String(errorCode)]?.detailMessage,\n );\n } else {\n super(\n CMIElement,\n 101,\n aicc_errors[\"101\"]?.basicMessage || \"General error\",\n aicc_errors[\"101\"]?.detailMessage,\n );\n }\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, AICCValidationError.prototype);\n }\n}\n","import { checkValidFormat } from \"../common/validation\";\nimport { AICCValidationError } from \"../../exceptions/aicc_exceptions\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {string} CMIElement\n * @param {string} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkAICCValidFormat(\n CMIElement: string,\n value: string,\n regexPattern: string | RegExp, // We accept either a string or a RegExp object to allow the usage of flags.\n allowEmptyString?: boolean,\n): boolean {\n return checkValidFormat(\n CMIElement,\n value,\n regexPattern,\n scorm12_errors.TYPE_MISMATCH as number,\n AICCValidationError,\n allowEmptyString,\n );\n}\n","import { CMIArray } from \"../common/array\";\nimport { AICCValidationError } from \"../../exceptions/aicc_exceptions\";\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { aicc_constants } from \"../../constants/api_constants\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { checkAICCValidFormat } from \"./validation\";\nimport { aicc_regex } from \"../../constants/regex\";\n\n/**\n * AICC Evaluation object\n */\nexport class CMIEvaluation extends BaseCMI {\n /**\n * Constructor for AICC Evaluation object\n */\n constructor() {\n super(\"cmi.evaluation\");\n this.comments = new CMIEvaluationComments();\n }\n\n public comments: CMIEvaluationComments;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.comments?.initialize();\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n this.comments?.reset();\n }\n\n /**\n * toJSON for cmi.evaluation object\n * @return {{comments: CMIEvaluationComments}}\n */\n toJSON(): {\n comments: CMIEvaluationComments;\n } {\n this.jsonString = true;\n const result = {\n comments: this.comments,\n };\n this.jsonString = false;\n return result;\n }\n}\n\n/**\n * Class representing AICC's cmi.evaluation.comments object\n */\n\nclass CMIEvaluationComments extends CMIArray {\n /**\n * Constructor for AICC Evaluation Comments object\n */\n constructor() {\n super({\n CMIElement: \"cmi.evaluation.comments\",\n children: aicc_constants.comments_children,\n errorCode: scorm12_errors.INVALID_SET_VALUE as number,\n errorClass: AICCValidationError,\n });\n }\n}\n\n/**\n * Class for AICC Evaluation Comments\n */\nexport class CMIEvaluationCommentsObject extends BaseCMI {\n private _content = \"\";\n private _location = \"\";\n private _time = \"\";\n\n /**\n * Constructor for Evaluation Comments\n */\n constructor() {\n super(\"cmi.evaluation.comments.n\");\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n\n this._content = \"\";\n this._location = \"\";\n this._time = \"\";\n }\n\n /**\n * Getter for _content\n * @return {string}\n */\n get content(): string {\n return this._content;\n }\n\n /**\n * Setter for _content\n * @param {string} content\n */\n set content(content: string) {\n if (checkAICCValidFormat(this._cmi_element + \".content\", content, aicc_regex.CMIString256)) {\n this._content = content;\n }\n }\n\n /**\n * Getter for _location\n * @return {string}\n */\n get location(): string {\n return this._location;\n }\n\n /**\n * Setter for _location\n * @param {string} location\n */\n set location(location: string) {\n if (checkAICCValidFormat(this._cmi_element + \".location\", location, aicc_regex.CMIString256)) {\n this._location = location;\n }\n }\n\n /**\n * Getter for _time\n * @return {string}\n */\n get time(): string {\n return this._time;\n }\n\n /**\n * Setting for _time\n * @param {string} time\n */\n set time(time: string) {\n if (checkAICCValidFormat(this._cmi_element + \".time\", time, aicc_regex.CMITime)) {\n this._time = time;\n }\n }\n\n /**\n * toJSON for cmi.evaluation.comments.n object\n * @return {\n * {\n * content: string,\n * location: string,\n * time: string\n * }\n * }\n */\n toJSON(): {\n content: string;\n location: string;\n time: string;\n } {\n this.jsonString = true;\n const result = {\n content: this.content,\n location: this.location,\n time: this.time,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { CMIArray } from \"../common/array\";\nimport { AICCValidationError } from \"../../exceptions/aicc_exceptions\";\nimport { checkAICCValidFormat } from \"./validation\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { aicc_regex } from \"../../constants/regex\";\nimport { aicc_constants } from \"../../constants/api_constants\";\nimport { CMIStudentPreference } from \"../scorm12/student_preference\";\n\n/**\n * StudentPreferences class for AICC\n */\nexport class AICCStudentPreferences extends CMIStudentPreference {\n /**\n * Constructor for AICC Student Preferences object\n */\n constructor() {\n super(aicc_constants.student_preference_children);\n this.windows = new CMIArray({\n CMIElement: \"cmi.student_preference.windows\",\n errorCode: scorm12_errors.INVALID_SET_VALUE as number,\n errorClass: AICCValidationError,\n children: \"\",\n });\n }\n\n public windows: CMIArray;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.windows?.initialize();\n }\n\n private _lesson_type = \"\";\n private _text_color = \"\";\n private _text_location = \"\";\n private _text_size = \"\";\n private _video = \"\";\n\n /**\n * Getter for _lesson_type\n * @return {string}\n */\n get lesson_type(): string {\n return this._lesson_type;\n }\n\n /**\n * Setter for _lesson_type\n * @param {string} lesson_type\n */\n set lesson_type(lesson_type: string) {\n if (\n checkAICCValidFormat(this._cmi_element + \".lesson_type\", lesson_type, aicc_regex.CMIString256)\n ) {\n this._lesson_type = lesson_type;\n }\n }\n\n /**\n * Getter for _text_color\n * @return {string}\n */\n get text_color(): string {\n return this._text_color;\n }\n\n /**\n * Setter for _text_color\n * @param {string} text_color\n */\n set text_color(text_color: string) {\n if (\n checkAICCValidFormat(this._cmi_element + \".text_color\", text_color, aicc_regex.CMIString256)\n ) {\n this._text_color = text_color;\n }\n }\n\n /**\n * Getter for _text_location\n * @return {string}\n */\n get text_location(): string {\n return this._text_location;\n }\n\n /**\n * Setter for _text_location\n * @param {string} text_location\n */\n set text_location(text_location: string) {\n if (\n checkAICCValidFormat(\n this._cmi_element + \".text_location\",\n text_location,\n aicc_regex.CMIString256,\n )\n ) {\n this._text_location = text_location;\n }\n }\n\n /**\n * Getter for _text_size\n * @return {string}\n */\n get text_size(): string {\n return this._text_size;\n }\n\n /**\n * Setter for _text_size\n * @param {string} text_size\n */\n set text_size(text_size: string) {\n if (\n checkAICCValidFormat(this._cmi_element + \".text_size\", text_size, aicc_regex.CMIString256)\n ) {\n this._text_size = text_size;\n }\n }\n\n /**\n * Getter for _video\n * @return {string}\n */\n get video(): string {\n return this._video;\n }\n\n /**\n * Setter for _video\n * @param {string} video\n */\n set video(video: string) {\n if (checkAICCValidFormat(this._cmi_element + \".video\", video, aicc_regex.CMIString256)) {\n this._video = video;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string,\n * text_color: string,\n * text_location: string,\n * text_size: string,\n * video: string,\n * windows: CMIArray\n * }\n * }\n */\n override toJSON(): {\n audio: string;\n language: string;\n lesson_type: string;\n speed: string;\n text: string;\n text_color: string;\n text_location: string;\n text_size: string;\n video: string;\n windows: CMIArray;\n } {\n this.jsonString = true;\n const result = {\n audio: this.audio,\n language: this.language,\n lesson_type: this.lesson_type,\n speed: this.speed,\n text: this.text,\n text_color: this.text_color,\n text_location: this.text_location,\n text_size: this.text_size,\n video: this.video,\n windows: this.windows,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { AICCValidationError } from \"../../exceptions/aicc_exceptions\";\nimport { aicc_constants } from \"../../constants/api_constants\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\n\n/**\n * Class representing the AICC cmi.student_demographics object\n */\nexport class CMIStudentDemographics extends BaseCMI {\n private __children = aicc_constants.student_demographics_children;\n private _city = \"\";\n private _class = \"\";\n private _company = \"\";\n private _country = \"\";\n private _experience = \"\";\n private _familiar_name = \"\";\n private _instructor_name = \"\";\n private _title = \"\";\n private _native_language = \"\";\n private _state = \"\";\n private _street_address = \"\";\n private _telephone = \"\";\n private _years_experience = \"\";\n\n /**\n * Constructor for AICC StudentDemographics object\n */\n constructor() {\n super(\"cmi.student_demographics\");\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n }\n\n /**\n * Getter for _children\n * @return {string}\n */\n get _children(): string {\n return this.__children;\n }\n\n /**\n * Getter for city\n * @return {string}\n */\n get city(): string {\n return this._city;\n }\n\n /**\n * Setter for _city. Sets an error if trying to set after\n * initialization.\n * @param {string} city\n */\n set city(city: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.city\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._city = city;\n }\n }\n\n /**\n * Getter for class\n * @return {string}\n */\n get class(): string {\n return this._class;\n }\n\n /**\n * Setter for _class. Sets an error if trying to set after\n * initialization.\n * @param {string} clazz\n */\n set class(clazz: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.class\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._class = clazz;\n }\n }\n\n /**\n * Getter for company\n * @return {string}\n */\n get company(): string {\n return this._company;\n }\n\n /**\n * Setter for _company. Sets an error if trying to set after\n * initialization.\n * @param {string} company\n */\n set company(company: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.company\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._company = company;\n }\n }\n\n /**\n * Getter for country\n * @return {string}\n */\n get country(): string {\n return this._country;\n }\n\n /**\n * Setter for _country. Sets an error if trying to set after\n * initialization.\n * @param {string} country\n */\n set country(country: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.country\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._country = country;\n }\n }\n\n /**\n * Getter for experience\n * @return {string}\n */\n get experience(): string {\n return this._experience;\n }\n\n /**\n * Setter for _experience. Sets an error if trying to set after\n * initialization.\n * @param {string} experience\n */\n set experience(experience: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.experience\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._experience = experience;\n }\n }\n\n /**\n * Getter for familiar_name\n * @return {string}\n */\n get familiar_name(): string {\n return this._familiar_name;\n }\n\n /**\n * Setter for _familiar_name. Sets an error if trying to set after\n * initialization.\n * @param {string} familiar_name\n */\n set familiar_name(familiar_name: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.familiar_name\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._familiar_name = familiar_name;\n }\n }\n\n /**\n * Getter for instructor_name\n * @return {string}\n */\n get instructor_name(): string {\n return this._instructor_name;\n }\n\n /**\n * Setter for _instructor_name. Sets an error if trying to set after\n * initialization.\n * @param {string} instructor_name\n */\n set instructor_name(instructor_name: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.instructor_name\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._instructor_name = instructor_name;\n }\n }\n\n /**\n * Getter for title\n * @return {string}\n */\n get title(): string {\n return this._title;\n }\n\n /**\n * Setter for _title. Sets an error if trying to set after\n * initialization.\n * @param {string} title\n */\n set title(title: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.title\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._title = title;\n }\n }\n\n /**\n * Getter for native_language\n * @return {string}\n */\n get native_language(): string {\n return this._native_language;\n }\n\n /**\n * Setter for _native_language. Sets an error if trying to set after\n * initialization.\n * @param {string} native_language\n */\n set native_language(native_language: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.native_language\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._native_language = native_language;\n }\n }\n\n /**\n * Getter for state\n * @return {string}\n */\n get state(): string {\n return this._state;\n }\n\n /**\n * Setter for _state. Sets an error if trying to set after\n * initialization.\n * @param {string} state\n */\n set state(state: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.state\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._state = state;\n }\n }\n\n /**\n * Getter for street_address\n * @return {string}\n */\n get street_address(): string {\n return this._street_address;\n }\n\n /**\n * Setter for _street_address. Sets an error if trying to set after\n * initialization.\n * @param {string} street_address\n */\n set street_address(street_address: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.street_address\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._street_address = street_address;\n }\n }\n\n /**\n * Getter for telephone\n * @return {string}\n */\n get telephone(): string {\n return this._telephone;\n }\n\n /**\n * Setter for _telephone. Sets an error if trying to set after\n * initialization.\n * @param {string} telephone\n */\n set telephone(telephone: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.telephone\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._telephone = telephone;\n }\n }\n\n /**\n * Getter for years_experience\n * @return {string}\n */\n get years_experience(): string {\n return this._years_experience;\n }\n\n /**\n * Setter for _years_experience. Sets an error if trying to set after\n * initialization.\n * @param {string} years_experience\n */\n set years_experience(years_experience: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_demographics.years_experience\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._years_experience = years_experience;\n }\n }\n\n /**\n * toJSON for cmi.student_demographics object\n * @return {\n * {\n * city: string,\n * class: string,\n * company: string,\n * country: string,\n * experience: string,\n * familiar_name: string,\n * instructor_name: string,\n * title: string,\n * native_language: string,\n * state: string,\n * street_address: string,\n * telephone: string,\n * years_experience: string\n * }\n * }\n */\n toJSON(): {\n city: string;\n class: string;\n company: string;\n country: string;\n experience: string;\n familiar_name: string;\n instructor_name: string;\n title: string;\n native_language: string;\n state: string;\n street_address: string;\n telephone: string;\n years_experience: string;\n } {\n this.jsonString = true;\n const result = {\n city: this.city,\n class: this.class,\n company: this.company,\n country: this.country,\n experience: this.experience,\n familiar_name: this.familiar_name,\n instructor_name: this.instructor_name,\n title: this.title,\n native_language: this.native_language,\n state: this.state,\n street_address: this.street_address,\n telephone: this.telephone,\n years_experience: this.years_experience,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { CMIArray } from \"../common/array\";\nimport { aicc_constants } from \"../../constants/api_constants\";\nimport { BaseCMI } from \"../common/base_cmi\";\nimport { CMIScore } from \"../common/score\";\nimport { aicc_regex } from \"../../constants/regex\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { AICCValidationError } from \"../../exceptions/aicc_exceptions\";\nimport { checkAICCValidFormat } from \"./validation\";\n\n/**\n * Class representing the AICC cmi.student_data.tries object\n */\nexport class CMITries extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super({\n CMIElement: \"cmi.student_data.tries\",\n children: aicc_constants.tries_children,\n });\n }\n}\n\n/**\n * Class for AICC Tries\n */\nexport class CMITriesObject extends BaseCMI {\n private _status = \"\";\n private _time = \"\";\n\n /**\n * Constructor for AICC Tries object\n */\n constructor() {\n super(\"cmi.student_data.tries.n\");\n this.score = new CMIScore({\n CMIElement: \"cmi.student_data.tries.n.score\",\n score_children: aicc_constants.score_children,\n score_range: aicc_regex.score_range,\n invalidErrorCode: scorm12_errors.INVALID_SET_VALUE as number,\n invalidTypeCode: scorm12_errors.TYPE_MISMATCH as number,\n invalidRangeCode: scorm12_errors.VALUE_OUT_OF_RANGE as number,\n errorClass: AICCValidationError,\n });\n }\n\n public score: CMIScore;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n this._status = \"\";\n this._time = \"\";\n this.score?.reset();\n }\n\n /**\n * Getter for _status\n * @return {string}\n */\n get status(): string {\n return this._status;\n }\n\n /**\n * Setter for _status\n * @param {string} status\n */\n set status(status: string) {\n if (checkAICCValidFormat(this._cmi_element + \".status\", status, aicc_regex.CMIStatus2)) {\n this._status = status;\n }\n }\n\n /**\n * Getter for _time\n * @return {string}\n */\n get time(): string {\n return this._time;\n }\n\n /**\n * Setter for _time\n * @param {string} time\n */\n set time(time: string) {\n if (checkAICCValidFormat(this._cmi_element + \".time\", time, aicc_regex.CMITime)) {\n this._time = time;\n }\n }\n\n /**\n * toJSON for cmi.student_data.tries.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON(): {\n status: string;\n time: string;\n score: CMIScore;\n } {\n this.jsonString = true;\n const result = {\n status: this.status,\n time: this.time,\n score: this.score,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { CMIScore } from \"../common/score\";\nimport { aicc_constants } from \"../../constants/api_constants\";\nimport { aicc_regex } from \"../../constants/regex\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { AICCValidationError } from \"../../exceptions/aicc_exceptions\";\nimport { checkAICCValidFormat } from \"./validation\";\nimport { CMIArray } from \"../common/array\";\n\n/**\n * Class for cmi.student_data.attempt_records array\n */\nexport class CMIAttemptRecords extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super({\n CMIElement: \"cmi.student_data.attempt_records\",\n children: aicc_constants.attempt_records_children,\n });\n }\n}\n\n/**\n * Class for AICC Attempt Records\n */\nexport class CMIAttemptRecordsObject extends BaseCMI {\n private _lesson_status = \"\";\n\n /**\n * Constructor for AICC Attempt Records object\n */\n constructor() {\n super(\"cmi.student_data.attempt_records.n\");\n this.score = new CMIScore({\n CMIElement: \"cmi.student_data.attempt_records.n.score\",\n score_children: aicc_constants.score_children,\n score_range: aicc_regex.score_range,\n invalidErrorCode: scorm12_errors.INVALID_SET_VALUE as number,\n invalidTypeCode: scorm12_errors.TYPE_MISMATCH as number,\n invalidRangeCode: scorm12_errors.VALUE_OUT_OF_RANGE as number,\n errorClass: AICCValidationError,\n });\n }\n\n public score: CMIScore;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n\n this._lesson_status = \"\";\n this.score?.initialize();\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n this.score?.reset();\n }\n\n /**\n * Getter for _lesson_status\n * @return {string}\n */\n get lesson_status(): string {\n return this._lesson_status;\n }\n\n /**\n * Setter for _lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status: string) {\n if (\n checkAICCValidFormat(\n this._cmi_element + \".lesson_status\",\n lesson_status,\n aicc_regex.CMIStatus2,\n )\n ) {\n this._lesson_status = lesson_status;\n }\n }\n\n /**\n * toJSON for cmi.student_data.attempt_records.n object\n * @return {\n * {\n * lesson_status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON(): {\n lesson_status: string;\n score: CMIScore;\n } {\n this.jsonString = true;\n const result = {\n lesson_status: this.lesson_status,\n score: this.score,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { AICCValidationError } from \"../../exceptions/aicc_exceptions\";\nimport { scorm12_errors } from \"../../constants/error_codes\";\nimport { aicc_constants } from \"../../constants/api_constants\";\nimport { CMITries } from \"./tries\";\nimport { CMIStudentData } from \"../scorm12/student_data\";\nimport { CMIAttemptRecords } from \"./attempts\";\n\n/**\n * StudentData class for AICC\n */\nexport class AICCCMIStudentData extends CMIStudentData {\n /**\n * Constructor for AICC StudentData object\n */\n constructor() {\n super(aicc_constants.student_data_children);\n this.tries = new CMITries();\n this.attempt_records = new CMIAttemptRecords();\n }\n\n public tries: CMITries;\n public attempt_records: CMIAttemptRecords;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.tries?.initialize();\n this.attempt_records?.initialize();\n }\n\n /**\n * Called when the API has been reset\n */\n override reset(): void {\n this._initialized = false;\n this.tries?.reset(true);\n this.attempt_records?.reset(true);\n }\n\n private _tries_during_lesson = \"\";\n\n /**\n * Getter for tries_during_lesson\n * @return {string}\n */\n get tries_during_lesson(): string {\n return this._tries_during_lesson;\n }\n\n /**\n * Setter for _tries_during_lesson. Sets an error if trying to set after\n * initialization.\n * @param {string} tries_during_lesson\n */\n set tries_during_lesson(tries_during_lesson: string) {\n if (this.initialized) {\n throw new AICCValidationError(\n \"cmi.student_data.tries_during_lesson\",\n scorm12_errors.READ_ONLY_ELEMENT as number,\n );\n } else {\n this._tries_during_lesson = tries_during_lesson;\n }\n }\n\n /**\n * toJSON for cmi.student_data object\n * @return {\n * {\n * mastery_score: string,\n * max_time_allowed: string,\n * time_limit_action: string,\n * tries: CMITries,\n * attempt_records: CMIAttemptRecords\n * }\n * }\n */\n override toJSON(): {\n mastery_score: string;\n max_time_allowed: string;\n time_limit_action: string;\n tries: CMITries;\n attempt_records: CMIAttemptRecords;\n } {\n this.jsonString = true;\n const result = {\n mastery_score: this.mastery_score,\n max_time_allowed: this.max_time_allowed,\n time_limit_action: this.time_limit_action,\n tries: this.tries,\n attempt_records: this.attempt_records,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import { BaseCMI } from \"../common/base_cmi\";\nimport { checkAICCValidFormat } from \"./validation\";\nimport { CMIArray } from \"../common/array\";\nimport { aicc_regex } from \"../../constants/regex\";\nimport { aicc_constants } from \"../../constants/api_constants\";\n\n/**\n * Class representing the AICC `cmi.paths` object\n */\nexport class CMIPaths extends CMIArray {\n /**\n * Constructor for inline Paths Array class\n */\n constructor() {\n super({\n CMIElement: \"cmi.paths\",\n children: aicc_constants.paths_children,\n });\n }\n}\n\n/**\n * Class for AICC Paths\n */\nexport class CMIPathsObject extends BaseCMI {\n private _location_id = \"\";\n private _date = \"\";\n private _time = \"\";\n private _status = \"\";\n private _why_left = \"\";\n private _time_in_element = \"\";\n\n /**\n * Constructor for AICC Paths objects\n */\n constructor() {\n super(\"cmi.paths.n\");\n }\n\n /**\n * Called when the API has been reset\n */\n reset(): void {\n this._initialized = false;\n\n this._location_id = \"\";\n this._date = \"\";\n this._time = \"\";\n this._status = \"\";\n this._why_left = \"\";\n this._time_in_element = \"\";\n }\n\n /**\n * Getter for _location_id\n * @return {string}\n */\n get location_id(): string {\n return this._location_id;\n }\n\n /**\n * Setter for _location_id\n * @param {string} location_id\n */\n set location_id(location_id: string) {\n if (\n checkAICCValidFormat(this._cmi_element + \".location_id\", location_id, aicc_regex.CMIString256)\n ) {\n this._location_id = location_id;\n }\n }\n\n /**\n * Getter for _date\n * @return {string}\n */\n get date(): string {\n return this._date;\n }\n\n /**\n * Setter for _date\n * @param {string} date\n */\n set date(date: string) {\n if (checkAICCValidFormat(this._cmi_element + \".date\", date, aicc_regex.CMIString256)) {\n this._date = date;\n }\n }\n\n /**\n * Getter for _time\n * @return {string}\n */\n get time(): string {\n return this._time;\n }\n\n /**\n * Setter for _time\n * @param {string} time\n */\n set time(time: string) {\n if (checkAICCValidFormat(this._cmi_element + \".time\", time, aicc_regex.CMITime)) {\n this._time = time;\n }\n }\n\n /**\n * Getter for _status\n * @return {string}\n */\n get status(): string {\n return this._status;\n }\n\n /**\n * Setter for _status\n * @param {string} status\n */\n set status(status: string) {\n if (checkAICCValidFormat(this._cmi_element + \".status\", status, aicc_regex.CMIStatus2)) {\n this._status = status;\n }\n }\n\n /**\n * Getter for _why_left\n * @return {string}\n */\n get why_left(): string {\n return this._why_left;\n }\n\n /**\n * Setter for _why_left\n * @param {string} why_left\n */\n set why_left(why_left: string) {\n if (checkAICCValidFormat(this._cmi_element + \".why_left\", why_left, aicc_regex.CMIString256)) {\n this._why_left = why_left;\n }\n }\n\n /**\n * Getter for _time_in_element\n * @return {string}\n */\n get time_in_element(): string {\n return this._time_in_element;\n }\n\n /**\n * Setter for _time_in_element\n * @param {string} time_in_element\n */\n set time_in_element(time_in_element: string) {\n if (\n checkAICCValidFormat(\n this._cmi_element + \".time_in_element\",\n time_in_element,\n aicc_regex.CMITime,\n )\n ) {\n this._time_in_element = time_in_element;\n }\n }\n\n /**\n * toJSON for cmi.paths.n object\n * @return {\n * {\n * location_id: string,\n * date: string,\n * time: string,\n * status: string,\n * why_left: string,\n * time_in_element: string\n * }\n * }\n */\n toJSON(): {\n location_id: string;\n date: string;\n time: string;\n status: string;\n why_left: string;\n time_in_element: string;\n } {\n this.jsonString = true;\n const result = {\n location_id: this.location_id,\n date: this.date,\n time: this.time,\n status: this.status,\n why_left: this.why_left,\n time_in_element: this.time_in_element,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import * as Scorm12CMI from \"../scorm12/cmi\";\nimport { aicc_constants } from \"../../constants/api_constants\";\nimport { CMIEvaluation } from \"./evaluation\";\nimport { AICCStudentPreferences } from \"./student_preferences\";\nimport { CMIStudentDemographics } from \"./student_demographics\";\nimport { AICCCMIStudentData } from \"./student_data\";\nimport { CMIPaths } from \"./paths\";\nimport { CMICore } from \"./core\";\nimport { CMIObjectives } from \"../scorm12/objectives\";\nimport { CMIStudentData } from \"../scorm12/student_data\";\nimport { CMIStudentPreference } from \"../scorm12/student_preference\";\nimport { CMIInteractions } from \"../scorm12/interactions\";\n\n/**\n * CMI Class for AICC\n */\nexport class CMI extends Scorm12CMI.CMI {\n /**\n * Constructor for AICC CMI object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean = false) {\n super(aicc_constants.cmi_children);\n if (initialized) this.initialize();\n this.student_preference = new AICCStudentPreferences();\n this.student_data = new AICCCMIStudentData();\n this.student_demographics = new CMIStudentDemographics();\n this.evaluation = new CMIEvaluation();\n this.paths = new CMIPaths();\n }\n\n public override student_data: AICCCMIStudentData;\n public override student_preference: AICCStudentPreferences;\n public student_demographics: CMIStudentDemographics;\n public evaluation: CMIEvaluation;\n public paths: CMIPaths;\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n override initialize() {\n super.initialize();\n this.student_preference?.initialize();\n this.student_data?.initialize();\n this.student_demographics?.initialize();\n this.evaluation?.initialize();\n this.paths?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions,\n * paths: CMIPaths\n * }\n * }\n */\n override toJSON(): {\n suspend_data: string;\n launch_data: string;\n comments: string;\n comments_from_lms: string;\n core: CMICore;\n objectives: CMIObjectives;\n student_data: CMIStudentData;\n student_preference: CMIStudentPreference;\n student_demographics: CMIStudentDemographics;\n interactions: CMIInteractions;\n evaluation: CMIEvaluation;\n paths: CMIPaths;\n } {\n this.jsonString = true;\n const result = {\n suspend_data: this.suspend_data,\n launch_data: this.launch_data,\n comments: this.comments,\n comments_from_lms: this.comments_from_lms,\n core: this.core,\n objectives: this.objectives,\n student_data: this.student_data,\n student_preference: this.student_preference,\n student_demographics: this.student_demographics,\n interactions: this.interactions,\n evaluation: this.evaluation,\n paths: this.paths,\n };\n this.jsonString = false;\n return result;\n }\n}\n","import Scorm12API from \"./Scorm12API\";\nimport { CMI } from \"./cmi/aicc/cmi\";\n\nimport { BaseCMI } from \"./cmi/common/base_cmi\";\nimport { CMITriesObject } from \"./cmi/aicc/tries\";\nimport { CMIAttemptRecordsObject } from \"./cmi/aicc/attempts\";\nimport { CMIEvaluationCommentsObject } from \"./cmi/aicc/evaluation\";\nimport { NAV } from \"./cmi/scorm12/nav\";\nimport { CMIPathsObject } from \"./cmi/aicc/paths\";\nimport { Settings } from \"./types/api_types\";\nimport { stringMatches } from \"./utilities\";\n\n/**\n * The AICC API class\n */\nclass AICC extends Scorm12API {\n /**\n * Constructor to create AICC API object\n * @param {Settings} settings\n */\n constructor(settings?: Settings) {\n super(settings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n }\n\n override cmi: CMI;\n override nav: NAV;\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {BaseCMI | null}\n */\n override getChildElement(\n CMIElement: string,\n value: any,\n foundFirstIndex: boolean,\n ): BaseCMI | null {\n let newChild = super.getChildElement(CMIElement, value, foundFirstIndex);\n\n if (!newChild) {\n if (stringMatches(CMIElement, \"cmi\\\\.evaluation\\\\.comments\\\\.\\\\d+\")) {\n newChild = new CMIEvaluationCommentsObject();\n } else if (stringMatches(CMIElement, \"cmi\\\\.student_data\\\\.tries\\\\.\\\\d+\")) {\n newChild = new CMITriesObject();\n } else if (stringMatches(CMIElement, \"cmi\\\\.student_data\\\\.attempt_records\\\\.\\\\d+\")) {\n newChild = new CMIAttemptRecordsObject();\n } else if (stringMatches(CMIElement, \"cmi\\\\.paths\\\\.\\\\d+\")) {\n newChild = new CMIPathsObject();\n }\n }\n\n return newChild;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {AICC} newAPI\n */\n override replaceWithAnotherScormAPI(newAPI: AICC) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.nav = newAPI.nav;\n }\n}\n\nexport default AICC;\n"],"names":["global_constants","SCORM_TRUE","SCORM_FALSE","STATE_NOT_INITIALIZED","STATE_INITIALIZED","STATE_TERMINATED","scorm12_constants","cmi_children","core_children","score_children","comments_children","objectives_children","correct_responses_children","student_data_children","student_preference_children","interactions_children","error_descriptions","basicMessage","detailMessage","aicc_constants","student_demographics_children","tries_children","attempt_records_children","paths_children","global_errors","GENERAL","INITIALIZATION_FAILED","INITIALIZED","TERMINATED","TERMINATION_FAILURE","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","STORE_BEFORE_INIT","STORE_AFTER_TERM","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","ARGUMENT_ERROR","CHILDREN_ERROR","COUNT_ERROR","GENERAL_GET_FAILURE","GENERAL_SET_FAILURE","GENERAL_COMMIT_FAILURE","UNDEFINED_DATA_MODEL","UNIMPLEMENTED_ELEMENT","VALUE_NOT_INITIALIZED","INVALID_SET_VALUE","READ_ONLY_ELEMENT","WRITE_ONLY_ELEMENT","TYPE_MISMATCH","VALUE_OUT_OF_RANGE","DEPENDENCY_NOT_ESTABLISHED","scorm12_errors","scorm12_regex","CMIString256","CMIString4096","CMITime","CMITimespan","CMIInteger","CMISInteger","CMIDecimal","CMIIdentifier","CMIFeedback","CMIIndex","CMIStatus","CMIStatus2","CMIExit","CMIType","CMIResult","NAVEvent","score_range","audio_range","speed_range","weighting_range","text_range","aicc_regex","BaseScormValidationError","Error","constructor","CMIElement","errorCode","toString","_errorCode","Object","setPrototypeOf","prototype","ValidationError","errorMessage","detailedMessage","_detailedMessage","message","_errorMessage","Scorm12ValidationError","hasOwnProperty","call","String","BaseCMI","cmi_element","jsonString","_initialized","_cmi_element","initialized","initialize","BaseRootCMI","start_time","_start_time","setStartTime","Date","getTime","SECONDS_PER_MINUTE","SECONDS_PER_HOUR","getSecondsAsHHMMSS","memoize","totalSeconds","hours","Math","floor","dateObj","minutes","getUTCMinutes","seconds","getSeconds","ms","msStr","countDecimals","toFixed","split","replace","getTimeAsSeconds","timeString","timeRegex","RegExp","match","test","Number","parts","timeStr","regexStr","addHHMMSSTimeStrings","first","second","flatten","data","result","recurse","cur","prop","Array","isArray","forEach","item","i","length","keys","filter","p","isEmpty","unflatten","pattern","regex","from","exec","m","num","indexOf","formatMessage","functionName","baseLength","paddedFunction","padEnd","messageString","CMIElementBaseLength","stringMatches","str","tester","fn","keyFn","cache","Map","_len","arguments","args","_key","key","JSON","stringify","has","get","set","checkValidFormat","value","regexPattern","errorClass","allowEmptyString","formatRegex","matches","_errorClass","valueKey","checkValidRange","rangePattern","ranges","check12ValidFormat","check12ValidRange","ValidationService","validateScore","decimalRegex","scoreRange","invalidTypeCode","invalidRangeCode","validateScorm12Audio","validateScorm12Language","validateScorm12Speed","validateScorm12Text","validateReadOnly","validationService","CMIScore","params","_raw","_min","__children","__score_range","_max","max","__invalid_error_code","invalidErrorCode","__invalid_type_code","__invalid_range_code","__decimal_regex","__error_class","reset","_children","raw","min","getScoreObject","scoreObject","isNaN","parseFloat","toJSON","CMICore","_student_id","_student_name","_lesson_location","_credit","_lesson_status","_entry","_total_time","_lesson_mode","_exit","_session_time","_suspend_data","score","student_id","student_name","lesson_location","credit","lesson_status","entry","total_time","lesson_mode","exit","session_time","suspend_data","getCurrentTotalTime","sessionTime","Util","CMIArray","children","childArray","wipe","_count","CMIObjectives","CMIObjectivesObject","_id","_status","id","status","CMIStudentData","_mastery_score","_max_time_allowed","_time_limit_action","mastery_score","max_time_allowed","time_limit_action","CMIStudentPreference","_audio","_language","_speed","_text","audio","language","speed","text","CMIInteractions","CMIInteractionsObject","_time","_type","_weighting","_student_response","_result","_latency","objectives","correct_responses","time","type","weighting","student_response","latency","CMIInteractionsObjectivesObject","CMIInteractionsCorrectResponsesObject","_pattern","CMI","student_data","__version","_launch_data","_comments","_comments_from_lms","core","student_preference","interactions","launch_data","comments","comments_from_lms","_version","NAV","_event","event","SuccessStatus","PASSED","FAILED","UNKNOWN","CompletionStatus","COMPLETED","INCOMPLETE","LogLevelEnum","_","DEBUG","INFO","WARN","ERROR","NONE","DefaultSettings","autocommit","autocommitSeconds","asyncCommit","sendFullCommit","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","selfReportSessionTime","alwaysSendTotalTime","renderCommonCommitFields","strict_errors","xhrHeaders","xhrWithCredentials","fetchMode","useBeaconInsteadOfFetch","responseHandler","response","httpResult","json","responseText","parse","e","requestHandler","commitObject","onLogMessage","defaultLogHandler","scoItemIds","scoItemIdValidator","globalObjectiveIds","enableOfflineSupport","courseId","syncOnInitialize","syncOnTerminate","maxSyncAttempts","messageLevel","logMessage","console","error","warn","info","debug","log","ScheduledCommit","API","when","callback","_cancelled","_API","_timeout","setTimeout","wrapper","bind","_callback","cancel","clearTimeout","isInitialized","commit","HttpService","settings","error_codes","processHttpRequest","url","immediate","undefined","apiLog","processListeners","genericError","_handleImmediateRequest","processedParams","performFetch","transformResponse","stack","enhancedError","errorDetails","errorType","name","originalError","body","contentType","_prepareRequestBody","navigator","sendBeacon","Blob","then","catch","join","performBeacon","init","method","mode","headers","keepalive","credentials","fetch","beaconSuccess","Promise","resolve","ok","parseError","statusText","substring","_isSuccessResponse","updateSettings","EventService","listenerMap","listenerCount","parseListenerName","listenerName","listenerSplit","on","listenerFunctions","listenerFunction","parsedListener","listeners","push","off","removeIndex","findIndex","obj","splice","delete","clear","newListeners","listener","listenerHasCMIElement","CMIElementsMatch","endsWith","prefix","slice","startsWith","SerializationService","loadFromFlattenedJSON","setCMIValue","isNotInitialized","setStartingData","int_pattern","obj_pattern","others","intMatch","index","field","objMatch","sort","a","b","localeCompare","processItems","items","loadFromJSON","currentCMIElement","tempCMIElement","renderCMIToJSONString","cmi","k","v","renderCMIToJSONObject","getCommitObject","terminateCommit","renderCommitObject","renderCommitCMI","apiLogLevel","includeTotalTime","includes","LoggingService","_logLevel","_logHandler","getInstance","_instance","setLogLevel","level","getLogLevel","setLogHandler","handler","shouldLog","numericMessageLevel","getNumericLevel","numericLogLevel","getLoggingService","ErrorHandlingService","errorCodes","getLmsErrorMessageDetails","loggingService","_lastErrorCode","_errorCodes","_apiLog","_getLmsErrorMessageDetails","_loggingService","lastErrorCode","throwSCORMError","errorNumber","formattedMessage","clearSCORMError","success","handleValueAccessException","returnValue","validationError","stackTrace","jsonError","createErrorHandlingService","OfflineStorageService","storeName","syncQueue","isOnline","onLine","syncInProgress","window","addEventListener","handleOnlineStatusChange","wasOnline","syncOfflineData","storeOffline","commitData","queueItem","now","random","timestamp","syncAttempts","currentQueue","getFromStorage","saveToStorage","getOfflineData","remainingQueue","syncResult","sendDataToLMS","processedData","isDeviceOnline","storedData","localStorage","getItem","setItem","hasPendingOfflineData","queue","some","BaseAPI","httpService","eventService","serializationService","cmiDataService","errorHandlingService","offlineStorageService","_settings","_courseId","new","TypeError","currentState","_error_codes","_httpService","_eventService","element","_serializationService","_errorHandlingService","detail","_offlineStorageService","offlineData","runtimeData","commonReset","clearScheduledCommit","startingData","callbackName","initializeMessage","terminationMessage","isTerminated","hasPendingData","syncSuccess","previousSettings","terminate","checkTerminated","checkState","storeData","getValue","getCMIValue","setValue","commitCallback","scheduleCommit","getLastError","getErrorString","CMIErrorCode","getDiagnostic","beforeInitError","afterTermError","_errorNumber","_CMIElement","_value","_commonSetCMIValue","methodName","scorm2004","structure","refObject","foundFirstIndex","invalidErrorMessage","idx","attribute","_checkObjectHasProperty","validateCorrectResponse","parseInt","newChild","getChildElement","_commonGetCMIValue","uninitializedErrorMessage","_isTargetValid","target","getFlattenedCMI","Utilities","StringKeyMap","getOwnPropertyDescriptor","getPrototypeOf","Scorm12API","mastery_override","statusSetByModule","nav","LMSInitialize","lmsInitialize","LMSFinish","lmsFinish","LMSGetValue","lmsGetValue","LMSSetValue","lmsSetValue","LMSCommit","lmsCommit","LMSGetLastError","lmsGetLastError","LMSGetErrorString","lmsGetErrorString","LMSGetDiagnostic","lmsGetDiagnostic","internalFinish","replaceWithAnotherScormAPI","newAPI","cmiExport","flattened","calculateTotalTime","totalTimeHHMMSS","totalTimeSeconds","lessonStatus","completionStatus","successStatus","originalStatus","aicc_errors","AICCValidationError","checkAICCValidFormat","CMIEvaluation","CMIEvaluationComments","CMIEvaluationCommentsObject","_content","_location","content","location","AICCStudentPreferences","_lesson_type","_text_color","_text_location","_text_size","_video","windows","lesson_type","text_color","text_location","text_size","video","CMIStudentDemographics","_city","_class","_company","_country","_experience","_familiar_name","_instructor_name","_title","_native_language","_state","_street_address","_telephone","_years_experience","city","class","clazz","company","country","experience","familiar_name","instructor_name","title","native_language","state","street_address","telephone","years_experience","CMITries","CMITriesObject","CMIAttemptRecords","CMIAttemptRecordsObject","AICCCMIStudentData","_tries_during_lesson","tries","attempt_records","tries_during_lesson","CMIPaths","CMIPathsObject","_location_id","_date","_why_left","_time_in_element","location_id","date","why_left","time_in_element","Scorm12CMI","student_demographics","evaluation","paths","AICC"],"mappings":"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"}
|