UNPKG

scorm-wrapper

Version:

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

1 lines 28.1 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["\"use strict\";\r\n\r\n// Define UTILS namespace to hold utility functions\r\nnamespace UTILS {\r\n // Function to convert 'boolean strings' into actual valid booleans\r\n export function StringToBoolean(value: string | number | boolean): boolean {\r\n const t = typeof value;\r\n switch (t) {\r\n case \"object\":\r\n case \"string\":\r\n return (/(true|1)/i).test(value as string);\r\n case \"number\":\r\n return !!value;\r\n case \"boolean\":\r\n return value as boolean;\r\n case \"undefined\":\r\n return null as any;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n // Function to display error messages when in debug mode\r\n export function trace(msg: string): void {\r\n if (SCORM.debug.isActive) {\r\n if (window.console && window.console.log) {\r\n window.console.log(msg);\r\n } else {\r\n // alert(msg);\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Define SCORM namespace to hold all SCORM related functions\r\nnamespace SCORM {\r\n // Define the SCORM API interface to be used throughout the wrapper\r\n export interface API {\r\n isFound: boolean;\r\n handle: any;\r\n }\r\n\r\n // Define Connection object structure\r\n export interface Connection {\r\n isActive: boolean;\r\n }\r\n\r\n // Define Debug object structure\r\n export interface Debug {\r\n isActive: boolean;\r\n }\r\n\r\n // Define Data object structure\r\n export interface Data {\r\n completionStatus: string | null;\r\n exitStatus: string | null;\r\n }\r\n\r\n // Define SCORM object structure\r\n export interface Scorm {\r\n version: string | null;\r\n handleCompletionStatus: boolean;\r\n handleExitMode: boolean;\r\n API: API;\r\n connection: Connection;\r\n data: Data;\r\n debug: Debug;\r\n }\r\n\r\n // Create SCORM object\r\n export const SCORM: Scorm = {\r\n version: null,\r\n handleCompletionStatus: true,\r\n handleExitMode: true,\r\n API: { handle: null, isFound: false },\r\n connection: { isActive: false },\r\n data: { completionStatus: null, exitStatus: null },\r\n debug: { isActive: false }\r\n };\r\n\r\n // define SCORM debug mode\r\n export var debug = SCORM.debug;\r\n\r\n // Function to check if SCORM is available\r\n export function isAvailable(): boolean {\r\n return true;\r\n }\r\n\r\n // Function to find the SCORM API\r\n export function APIFind(win: any): API {\r\n // Implementation of APIFind function\r\n let API: API = { handle: null, isFound: false };\r\n let findAttempts = 0;\r\n const findAttemptLimit = 500;\r\n const traceMsgPrefix = \"SCORM.API.find\";\r\n const trace = UTILS.trace;\r\n const scorm = SCORM;\r\n\r\n while ((!win.API && !win.API_1484_11) &&\r\n (win.parent) &&\r\n (win.parent !== win) &&\r\n (findAttempts <= findAttemptLimit)) {\r\n findAttempts++;\r\n win = win.parent;\r\n }\r\n\r\n // If SCORM version is specified by the user, look for the specific API\r\n if (scorm.version) {\r\n switch (scorm.version) {\r\n case \"2004\":\r\n if (win.API_1484_11) {\r\n API = { handle: win.API_1484_11, isFound: true };\r\n } else {\r\n trace(traceMsgPrefix + \": SCORM version 2004 was specified by the user, but API_1484_11 cannot be found.\");\r\n }\r\n break;\r\n case \"1.2\":\r\n if (win.API) {\r\n API = { handle: win.API, isFound: true };\r\n } else {\r\n trace(traceMsgPrefix + \": SCORM version 1.2 was specified by the user, but API cannot be found.\");\r\n }\r\n break;\r\n }\r\n } else { // If SCORM version is not specified by the user, look for APIs\r\n if (win.API_1484_11) { // SCORM 2004-specific API\r\n scorm.version = \"2004\"; // Set version\r\n API = { handle: win.API_1484_11, isFound: true };\r\n } else if (win.API) { // SCORM 1.2-specific API\r\n scorm.version = \"1.2\"; // Set version\r\n API = { handle: win.API, isFound: true };\r\n }\r\n }\r\n\r\n if (API.isFound) {\r\n trace(traceMsgPrefix + \": API found. Version: \" + scorm.version);\r\n trace(\"API: \" + API.handle);\r\n } else {\r\n trace(traceMsgPrefix + \": Error finding API. \\nFind attempts: \" + findAttempts + \". \\nFind attempt limit: \" + findAttemptLimit);\r\n }\r\n\r\n return API;\r\n\r\n\r\n }\r\n\r\n // Function to get the SCORM API\r\n export function APIGet(): API {\r\n let API: API = { handle: null, isFound: false };\r\n const win = window;\r\n const trace = UTILS.trace;\r\n\r\n API = APIFind(win);\r\n if (!API && win.parent && win.parent != win) {\r\n API = APIFind(win.parent);\r\n }\r\n if (!API && win.top && win.top.opener) {\r\n API = APIFind(win.top.opener);\r\n }\r\n\r\n if (!API && win.top && win.top.opener && win.top.opener.document) {\r\n API = APIFind(win.top.opener.document);\r\n }\r\n\r\n if (API) {\r\n SCORM.API = API;\r\n } else {\r\n trace(\"API.get failed: Can't find the API!\");\r\n }\r\n\r\n return API;\r\n }\r\n\r\n // Function to get the handle to the SCORM API object\r\n export function APIGetHandle(): any {\r\n // Implementation of APIGetHandle function\r\n let API: API = SCORM.API;\r\n\r\n if (!API.handle && !API.isFound) {\r\n API = APIGet();\r\n }\r\n\r\n return API.handle;\r\n }\r\n\r\n // Function to initialize the SCORM connection\r\n export function connectionInitialize(): boolean {\r\n let success = false;\r\n let scorm = SCORM;\r\n let completionStatus = scorm.data.completionStatus;\r\n let trace = UTILS.trace;\r\n let traceMsgPrefix = \"SCORM.connection.initialize \";\r\n\r\n trace(\"connectionInitialize called.\");\r\n\r\n if (!scorm.connection.isActive) {\r\n let API = APIGetHandle();\r\n let errorCode = 0;\r\n\r\n if (API) {\r\n switch (scorm.version) {\r\n case \"1.2\":\r\n success = UTILS.StringToBoolean(API.LMSInitialize(\"\"));\r\n break;\r\n case \"2004\":\r\n success = UTILS.StringToBoolean(API.Initialize(\"\"));\r\n break;\r\n }\r\n if (success) {\r\n // Double-check that connection is active and working before returning 'true' boolean\r\n errorCode = debugGetCode();\r\n if (errorCode !== null && errorCode === 0) {\r\n scorm.connection.isActive = true;\r\n\r\n if (scorm.handleCompletionStatus) {\r\n completionStatus = status(\"get\");\r\n if (completionStatus) {\r\n switch (completionStatus) {\r\n case \"not attempted\": status(\"set\", \"incomplete\"); break;\r\n case \"unknown\": status(\"set\", \"incomplete\"); break;\r\n }\r\n dataSave();\r\n }\r\n }\r\n }\r\n else {\r\n success = false;\r\n trace(traceMsgPrefix + \"Connection issues. \\nError code: \" + errorCode + \" \\nError info: \" + debugGetInfo(errorCode) + \" \\nError diagnostic: \" + debugGetDiagnosticInfo(errorCode));\r\n }\r\n }\r\n else {\r\n errorCode = debugGetCode();\r\n trace(traceMsgPrefix + \"Connection issues. \\nError code: \" + errorCode + \" \\nError info: \" + debugGetInfo(errorCode) + \" \\nError diagnostic: \" + debugGetDiagnosticInfo(errorCode));\r\n }\r\n }\r\n else {\r\n trace(traceMsgPrefix + \"API is null.\");\r\n }\r\n }\r\n else {\r\n trace(traceMsgPrefix + \"Connection already active.\");\r\n }\r\n\r\n return success;\r\n }\r\n\r\n // Function to terminate the SCORM connection\r\n export function connectionTerminate(): boolean {\r\n let success = false;\r\n let scorm = SCORM;\r\n let exitStatus = scorm.data.exitStatus;\r\n let completionStatus = scorm.data.completionStatus;\r\n let trace = UTILS.trace;\r\n let traceMsgPrefix = \"SCORM.connection.terminate \";\r\n\r\n if (scorm.connection.isActive) {\r\n let API = APIGetHandle();\r\n let errorCode = 0;\r\n\r\n if (API) {\r\n if (scorm.handleExitMode && !exitStatus) {\r\n if (completionStatus !== \"completed\" && completionStatus !== \"passed\") {\r\n switch (scorm.version) {\r\n case \"1.2\": success = set(\"cmi.core.exit\", \"suspend\"); break;\r\n case \"2004\": success = set(\"cmi.exit\", \"suspend\"); break;\r\n }\r\n } else {\r\n switch (scorm.version) {\r\n case \"1.2\": success = set(\"cmi.core.exit\", \"logout\"); break;\r\n case \"2004\": success = set(\"cmi.exit\", \"normal\"); break;\r\n }\r\n }\r\n }\r\n // Ensure we persist the data\r\n success = save();\r\n if (success) {\r\n switch (scorm.version) {\r\n case \"1.2\": success = UTILS.StringToBoolean(API.LMSFinish(\"\")); break;\r\n case \"2004\": success = UTILS.StringToBoolean(API.Terminate(\"\")); break;\r\n }\r\n if (success) {\r\n scorm.connection.isActive = false;\r\n } else {\r\n errorCode = debugGetCode();\r\n trace(traceMsgPrefix + \"failed. \\nError code: \" + errorCode + \" \\nError info: \" + debugGetInfo(errorCode));\r\n }\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \"failed: API is null.\");\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \"aborted: Connection already terminated.\");\r\n }\r\n return success;\r\n }\r\n\r\n // Function to get SCORM data\r\n export function dataGet(parameter: string): string {\r\n let value = null;\r\n let scorm = SCORM;\r\n let trace = UTILS.trace;\r\n let traceMsgPrefix = \"SCORM.data.get(\" + parameter + \") \";\r\n\r\n if (scorm.connection.isActive) {\r\n let API = APIGetHandle();\r\n let errorCode = 0;\r\n\r\n if (API) {\r\n switch (scorm.version) {\r\n case \"1.2\":\r\n value = API.LMSGetValue(parameter);\r\n break;\r\n case \"2004\":\r\n value = API.GetValue(parameter);\r\n break;\r\n }\r\n errorCode = debugGetCode();\r\n if (value !== \"\" || errorCode === 0) {\r\n switch (parameter) {\r\n case \"cmi.core.lesson_status\":\r\n case \"cmi.completion_status\":\r\n scorm.data.completionStatus = value;\r\n break;\r\n case \"cmi.core.exit\":\r\n case \"cmi.exit\":\r\n scorm.data.exitStatus = value;\r\n break;\r\n }\r\n }\r\n else {\r\n trace(traceMsgPrefix + \"failed. \\nError code: \" + errorCode + \"\\nError info: \" + debugGetInfo(errorCode));\r\n }\r\n }\r\n else {\r\n trace(traceMsgPrefix + \"failed: API is null.\");\r\n }\r\n }\r\n else {\r\n trace(traceMsgPrefix + \"failed: API connection is inactive.\");\r\n }\r\n\r\n trace(traceMsgPrefix + \" value: \" + value);\r\n return String(value);\r\n }\r\n\r\n // Function to set SCORM data\r\n export function dataSet(parameter: string, value: string): boolean {\r\n\r\n let success = false;\r\n let scorm = SCORM;\r\n let trace = UTILS.trace;\r\n let makeBoolean = UTILS.StringToBoolean;\r\n let traceMsgPrefix = \"SCORM.data.set(\" + parameter + \") \";\r\n\r\n if (scorm.connection.isActive) {\r\n let API = APIGetHandle();\r\n let errorCode = 0;\r\n\r\n if (API) {\r\n switch (scorm.version) {\r\n case \"1.2\": success = makeBoolean(API.LMSSetValue(parameter, value)); break;\r\n case \"2004\": success = makeBoolean(API.SetValue(parameter, value)); break;\r\n }\r\n\r\n if (success) {\r\n if (parameter === \"cmi.core.lesson_status\" || parameter === \"cmi.completion_status\") {\r\n scorm.data.completionStatus = value;\r\n }\r\n } else {\r\n errorCode = debugGetCode();\r\n trace(traceMsgPrefix + \"failed. \\nError code: \" + errorCode + \". \\nError info: \" + debugGetInfo(errorCode));\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \"failed: API is null.\");\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \"failed: API connection is inactive.\");\r\n }\r\n\r\n return success;\r\n }\r\n\r\n // Function to save SCORM data\r\n export function dataSave(): boolean {\r\n let success = false;\r\n let scorm = SCORM;\r\n let trace = UTILS.trace;\r\n let makeBoolean = UTILS.StringToBoolean;\r\n let traceMsgPrefix = \"SCORM.data.save failed\";\r\n\r\n if (scorm.connection.isActive) {\r\n let API = APIGetHandle();\r\n let errorCode = 0;\r\n\r\n if (API) {\r\n switch (scorm.version) {\r\n case \"1.2\": success = makeBoolean(API.LMSCommit(\"\")); break;\r\n case \"2004\": success = makeBoolean(API.Commit(\"\")); break;\r\n }\r\n if (!success) {\r\n errorCode = debugGetCode();\r\n trace(traceMsgPrefix + \". \\nError code: \" + errorCode + \". \\nError info: \" + debugGetInfo(errorCode));\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \": API is null.\");\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \": API connection is inactive.\");\r\n }\r\n\r\n return success;\r\n }\r\n\r\n // Function to get SCORM status\r\n export function status(action: string, status?: string): string {\r\n let success = false;\r\n let scorm = SCORM;\r\n let trace = UTILS.trace;\r\n let traceMsgPrefix = \"SCORM.getStatus failed\";\r\n let cmi = \"\";\r\n\r\n if (action !== null) {\r\n switch (scorm.version) {\r\n case \"1.2\": cmi = \"cmi.core.lesson_status\"; break;\r\n case \"2004\": cmi = \"cmi.completion_status\"; break;\r\n }\r\n\r\n switch (action) {\r\n case \"get\": success = true; return dataGet(cmi); break;\r\n case \"set\": if (status && status !== null){\r\n success = dataSet(cmi, status);\r\n }\r\n else { success = false; \r\n trace(traceMsgPrefix + \": status was not specified.\"); }\r\n break;\r\n default: success = false; trace(traceMsgPrefix + \": no valid action was specified.\"); break;\r\n }\r\n }\r\n else {\r\n trace(traceMsgPrefix + \": action was not specified.\");\r\n }\r\n\r\n return String(success);\r\n }\r\n\r\n // Function to get the SCORM error code\r\n export function debugGetCode(): number {\r\n let API = APIGetHandle();\r\n let scorm = SCORM;\r\n let code = 0;\r\n let trace = UTILS.trace;\r\n let traceMsgPrefix = \"SCORM.debug.getCode \";\r\n\r\n if (API) {\r\n switch (scorm.version) {\r\n case \"1.2\": code = parseInt(API.LMSGetLastError(), 10); break;\r\n case \"2004\": code = parseInt(API.GetLastError(), 10); break;\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \": API is null.\");\r\n }\r\n\r\n return code;\r\n }\r\n\r\n // Function to get the SCORM error info\r\n export function debugGetInfo(errorCode: number): string {\r\n let API = APIGetHandle();\r\n let scorm = SCORM;\r\n let result = \"\";\r\n let trace = UTILS.trace;\r\n let traceMsgPrefix = \"SCORM.debug.getInfo \";\r\n\r\n if (API) {\r\n switch (scorm.version) {\r\n case \"1.2\": result = API.LMSGetErrorString(errorCode.toString()); break;\r\n case \"2004\": result = API.GetErrorString(errorCode.toString()); break;\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \": API is null.\");\r\n }\r\n\r\n return String(result);\r\n }\r\n\r\n // Function to get additional diagnostic information for the SCORM error code\r\n export function debugGetDiagnosticInfo(errorCode: number): string {\r\n let API = APIGetHandle();\r\n let scorm = SCORM;\r\n let result = \"\";\r\n let trace = UTILS.trace;\r\n let traceMsgPrefix = \"SCORM.debug.getDiagnosticInfo \";\r\n\r\n if (API) {\r\n switch (scorm.version) {\r\n case \"1.2\": result = API.LMSGetDiagnostic(errorCode.toString()); break;\r\n case \"2004\": result = API.GetDiagnostic(errorCode.toString()); break;\r\n }\r\n } else {\r\n trace(traceMsgPrefix + \": API is null.\");\r\n }\r\n\r\n return String(result);\r\n }\r\n\r\n // Shortcuts for commonly used functions\r\n export const init = connectionInitialize;\r\n export const get = dataGet;\r\n export const set = dataSet;\r\n export const save = dataSave;\r\n export const quit = connectionTerminate;\r\n}\r\n\r\n\r\nexport default SCORM;\r\nexport var debug = SCORM.debug;"],"mappings":"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","names":["UTILS","status"]}