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
JavaScript
"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