UNPKG

scorm-wrapper

Version:

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

482 lines (481 loc) 15.1 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { debug: () => debug, default: () => src_default }); module.exports = __toCommonJS(src_exports); 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; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { debug }); //# sourceMappingURL=index.js.map