UNPKG

scorm-wrapper

Version:

A TypeScript-based wrapper for handling SCORM (Sharable Content Object Reference Model) interactions in e-learning applications.

457 lines 14.1 kB
// src/index.ts var UTILS; ((UTILS2) => { function StringToBoolean(value) { const t = typeof value; switch (t) { case "object": case "string": return /(true|1)/i.test(value); case "number": return !!value; case "boolean": return value; case "undefined": return null; default: return false; } } UTILS2.StringToBoolean = StringToBoolean; function trace(msg) { if (SCORM.debug.isActive) { if (window.console && window.console.log) { window.console.log(msg); } else { } } } UTILS2.trace = trace; })(UTILS || (UTILS = {})); var SCORM; ((_SCORM) => { _SCORM.SCORM = { version: null, handleCompletionStatus: true, handleExitMode: true, API: { handle: null, isFound: false }, connection: { isActive: false }, data: { completionStatus: null, exitStatus: null }, debug: { isActive: false } }; _SCORM.debug = _SCORM.SCORM.debug; function isAvailable() { return true; } _SCORM.isAvailable = isAvailable; function APIFind(win) { let API = { handle: null, isFound: false }; let findAttempts = 0; const findAttemptLimit = 500; const traceMsgPrefix = "SCORM.API.find"; const trace = UTILS.trace; const scorm = _SCORM.SCORM; while (!win.API && !win.API_1484_11 && win.parent && win.parent !== win && findAttempts <= findAttemptLimit) { findAttempts++; win = win.parent; } if (scorm.version) { switch (scorm.version) { case "2004": if (win.API_1484_11) { API = { handle: win.API_1484_11, isFound: true }; } else { trace(traceMsgPrefix + ": SCORM version 2004 was specified by the user, but API_1484_11 cannot be found."); } break; case "1.2": if (win.API) { API = { handle: win.API, isFound: true }; } else { trace(traceMsgPrefix + ": SCORM version 1.2 was specified by the user, but API cannot be found."); } break; } } else { if (win.API_1484_11) { scorm.version = "2004"; API = { handle: win.API_1484_11, isFound: true }; } else if (win.API) { scorm.version = "1.2"; API = { handle: win.API, isFound: true }; } } if (API.isFound) { trace(traceMsgPrefix + ": API found. Version: " + scorm.version); trace("API: " + API.handle); } else { trace(traceMsgPrefix + ": Error finding API. \nFind attempts: " + findAttempts + ". \nFind attempt limit: " + findAttemptLimit); } return API; } _SCORM.APIFind = APIFind; function APIGet() { let API = { handle: null, isFound: false }; const win = window; const trace = UTILS.trace; API = APIFind(win); if (!API && win.parent && win.parent != win) { API = APIFind(win.parent); } if (!API && win.top && win.top.opener) { API = APIFind(win.top.opener); } if (!API && win.top && win.top.opener && win.top.opener.document) { API = APIFind(win.top.opener.document); } if (API) { _SCORM.SCORM.API = API; } else { trace("API.get failed: Can't find the API!"); } return API; } _SCORM.APIGet = APIGet; function APIGetHandle() { let API = _SCORM.SCORM.API; if (!API.handle && !API.isFound) { API = APIGet(); } return API.handle; } _SCORM.APIGetHandle = APIGetHandle; function connectionInitialize() { let success = false; let scorm = _SCORM.SCORM; let completionStatus = scorm.data.completionStatus; let trace = UTILS.trace; let traceMsgPrefix = "SCORM.connection.initialize "; trace("connectionInitialize called."); if (!scorm.connection.isActive) { let API = APIGetHandle(); let errorCode = 0; if (API) { switch (scorm.version) { case "1.2": success = UTILS.StringToBoolean(API.LMSInitialize("")); break; case "2004": success = UTILS.StringToBoolean(API.Initialize("")); break; } if (success) { errorCode = debugGetCode(); if (errorCode !== null && errorCode === 0) { scorm.connection.isActive = true; if (scorm.handleCompletionStatus) { completionStatus = status("get"); if (completionStatus) { switch (completionStatus) { case "not attempted": status("set", "incomplete"); break; case "unknown": status("set", "incomplete"); break; } dataSave(); } } } else { success = false; trace(traceMsgPrefix + "Connection issues. \nError code: " + errorCode + " \nError info: " + debugGetInfo(errorCode) + " \nError diagnostic: " + debugGetDiagnosticInfo(errorCode)); } } else { errorCode = debugGetCode(); trace(traceMsgPrefix + "Connection issues. \nError code: " + errorCode + " \nError info: " + debugGetInfo(errorCode) + " \nError diagnostic: " + debugGetDiagnosticInfo(errorCode)); } } else { trace(traceMsgPrefix + "API is null."); } } else { trace(traceMsgPrefix + "Connection already active."); } return success; } _SCORM.connectionInitialize = connectionInitialize; function connectionTerminate() { let success = false; let scorm = _SCORM.SCORM; let exitStatus = scorm.data.exitStatus; let completionStatus = scorm.data.completionStatus; let trace = UTILS.trace; let traceMsgPrefix = "SCORM.connection.terminate "; if (scorm.connection.isActive) { let API = APIGetHandle(); let errorCode = 0; if (API) { if (scorm.handleExitMode && !exitStatus) { if (completionStatus !== "completed" && completionStatus !== "passed") { switch (scorm.version) { case "1.2": success = (0, _SCORM.set)("cmi.core.exit", "suspend"); break; case "2004": success = (0, _SCORM.set)("cmi.exit", "suspend"); break; } } else { switch (scorm.version) { case "1.2": success = (0, _SCORM.set)("cmi.core.exit", "logout"); break; case "2004": success = (0, _SCORM.set)("cmi.exit", "normal"); break; } } } success = (0, _SCORM.save)(); if (success) { switch (scorm.version) { case "1.2": success = UTILS.StringToBoolean(API.LMSFinish("")); break; case "2004": success = UTILS.StringToBoolean(API.Terminate("")); break; } if (success) { scorm.connection.isActive = false; } else { errorCode = debugGetCode(); trace(traceMsgPrefix + "failed. \nError code: " + errorCode + " \nError info: " + debugGetInfo(errorCode)); } } } else { trace(traceMsgPrefix + "failed: API is null."); } } else { trace(traceMsgPrefix + "aborted: Connection already terminated."); } return success; } _SCORM.connectionTerminate = connectionTerminate; function dataGet(parameter) { let value = null; let scorm = _SCORM.SCORM; let trace = UTILS.trace; let traceMsgPrefix = "SCORM.data.get(" + parameter + ") "; if (scorm.connection.isActive) { let API = APIGetHandle(); let errorCode = 0; if (API) { switch (scorm.version) { case "1.2": value = API.LMSGetValue(parameter); break; case "2004": value = API.GetValue(parameter); break; } errorCode = debugGetCode(); if (value !== "" || errorCode === 0) { switch (parameter) { case "cmi.core.lesson_status": case "cmi.completion_status": scorm.data.completionStatus = value; break; case "cmi.core.exit": case "cmi.exit": scorm.data.exitStatus = value; break; } } else { trace(traceMsgPrefix + "failed. \nError code: " + errorCode + "\nError info: " + debugGetInfo(errorCode)); } } else { trace(traceMsgPrefix + "failed: API is null."); } } else { trace(traceMsgPrefix + "failed: API connection is inactive."); } trace(traceMsgPrefix + " value: " + value); return String(value); } _SCORM.dataGet = dataGet; function dataSet(parameter, value) { let success = false; let scorm = _SCORM.SCORM; let trace = UTILS.trace; let makeBoolean = UTILS.StringToBoolean; let traceMsgPrefix = "SCORM.data.set(" + parameter + ") "; if (scorm.connection.isActive) { let API = APIGetHandle(); let errorCode = 0; if (API) { switch (scorm.version) { case "1.2": success = makeBoolean(API.LMSSetValue(parameter, value)); break; case "2004": success = makeBoolean(API.SetValue(parameter, value)); break; } if (success) { if (parameter === "cmi.core.lesson_status" || parameter === "cmi.completion_status") { scorm.data.completionStatus = value; } } else { errorCode = debugGetCode(); trace(traceMsgPrefix + "failed. \nError code: " + errorCode + ". \nError info: " + debugGetInfo(errorCode)); } } else { trace(traceMsgPrefix + "failed: API is null."); } } else { trace(traceMsgPrefix + "failed: API connection is inactive."); } return success; } _SCORM.dataSet = dataSet; function dataSave() { let success = false; let scorm = _SCORM.SCORM; let trace = UTILS.trace; let makeBoolean = UTILS.StringToBoolean; let traceMsgPrefix = "SCORM.data.save failed"; if (scorm.connection.isActive) { let API = APIGetHandle(); let errorCode = 0; if (API) { switch (scorm.version) { case "1.2": success = makeBoolean(API.LMSCommit("")); break; case "2004": success = makeBoolean(API.Commit("")); break; } if (!success) { errorCode = debugGetCode(); trace(traceMsgPrefix + ". \nError code: " + errorCode + ". \nError info: " + debugGetInfo(errorCode)); } } else { trace(traceMsgPrefix + ": API is null."); } } else { trace(traceMsgPrefix + ": API connection is inactive."); } return success; } _SCORM.dataSave = dataSave; function status(action, status2) { let success = false; let scorm = _SCORM.SCORM; let trace = UTILS.trace; let traceMsgPrefix = "SCORM.getStatus failed"; let cmi = ""; if (action !== null) { switch (scorm.version) { case "1.2": cmi = "cmi.core.lesson_status"; break; case "2004": cmi = "cmi.completion_status"; break; } switch (action) { case "get": success = true; return dataGet(cmi); break; case "set": if (status2 && status2 !== null) { success = dataSet(cmi, status2); } else { success = false; trace(traceMsgPrefix + ": status was not specified."); } break; default: success = false; trace(traceMsgPrefix + ": no valid action was specified."); break; } } else { trace(traceMsgPrefix + ": action was not specified."); } return String(success); } _SCORM.status = status; function debugGetCode() { let API = APIGetHandle(); let scorm = _SCORM.SCORM; let code = 0; let trace = UTILS.trace; let traceMsgPrefix = "SCORM.debug.getCode "; if (API) { switch (scorm.version) { case "1.2": code = parseInt(API.LMSGetLastError(), 10); break; case "2004": code = parseInt(API.GetLastError(), 10); break; } } else { trace(traceMsgPrefix + ": API is null."); } return code; } _SCORM.debugGetCode = debugGetCode; function debugGetInfo(errorCode) { let API = APIGetHandle(); let scorm = _SCORM.SCORM; let result = ""; let trace = UTILS.trace; let traceMsgPrefix = "SCORM.debug.getInfo "; if (API) { switch (scorm.version) { case "1.2": result = API.LMSGetErrorString(errorCode.toString()); break; case "2004": result = API.GetErrorString(errorCode.toString()); break; } } else { trace(traceMsgPrefix + ": API is null."); } return String(result); } _SCORM.debugGetInfo = debugGetInfo; function debugGetDiagnosticInfo(errorCode) { let API = APIGetHandle(); let scorm = _SCORM.SCORM; let result = ""; let trace = UTILS.trace; let traceMsgPrefix = "SCORM.debug.getDiagnosticInfo "; if (API) { switch (scorm.version) { case "1.2": result = API.LMSGetDiagnostic(errorCode.toString()); break; case "2004": result = API.GetDiagnostic(errorCode.toString()); break; } } else { trace(traceMsgPrefix + ": API is null."); } return String(result); } _SCORM.debugGetDiagnosticInfo = debugGetDiagnosticInfo; _SCORM.init = connectionInitialize; _SCORM.get = dataGet; _SCORM.set = dataSet; _SCORM.save = dataSave; _SCORM.quit = connectionTerminate; })(SCORM || (SCORM = {})); var src_default = SCORM; var debug = SCORM.debug; export { debug, src_default as default }; //# sourceMappingURL=index.mjs.map