@amelon/fakelms
Version:
Enable to quickly test a simple SCORM module by emulating some LMS functionnalities clientside
1 lines • 10.5 kB
JavaScript
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.FakeLms=e():t.FakeLms=e()}(window,function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var E=e[r]={i:r,l:!1,exports:{}};return t[r].call(E.exports,E,E.exports,n),E.l=!0,E.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var E in t)n.d(r,E,function(e){return t[e]}.bind(null,E));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}n.r(e);var E={};E.isAvailable=function(){return void 0!==window&&"localStorage"in window},E.returnBooleanStrings=!1,E.attachLMSAPIToWindow=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"fkLMS";if(!this.isAvailable())throw new Error("localStorage not available");E.storage={set:function(e,n){window.localStorage.setItem("".concat(t,"-").concat(e),n)},get:function(e){return window.localStorage.getItem("".concat(t,"-").concat(e))},remove:function(e){window.localStorage.removeItem("".concat(t,"-").concat(e))}},window.API_1484_11=new o},E.clearData=function(){["exit","success_status","completion_status","interactions","suspend_data","location","entry"].forEach(E.storage.remove),E.storage.set("total_time",0)},E.STATUS={STARTED:0,INITIALIZED:1,TERMINATED:2};var i={},a=[];function o(){this.status=E.STATUS.STARTED,this.lastErrcode=E.ERRCODES.NO_ERROR,this.lastDiagnotic=""}a[i.NO_ERROR=0]="No Error",a[i.GENERAL_INITIALIZATION_FAILURE=102]="General Initialization Failure",a[i.ALREADY_INITIALIZED=103]="Already Initialized",a[i.CONTENT_INSTANCE_TERMINATED=104]="Content Instance Terminated",a[i.GENERAL_TERMINATION_FAILURE=111]="General Termination Failure",a[i.TERMINATION_BEFORE_INITIALIZATION=112]="Termination Before Initialization",a[i.GENERAL_ARGUMENT_ERROR=201]="General Argument Error",a[i.GENERAL_GET_FAILURE=301]="General Get Failure",a[i.GENERAL_SET_FAILURE=351]="General Set Failure",a[i.UNDEFINED_DATA_ELEMENT=401]="Undefined data element",a[i.UNIMPLEMENTED_DATA_MODEL_ELEMENT=402]="Unimplemented Data Model Element",a[i.DATA_MODEL_ELEMENT_VALUE_NOT_INITIALIZED=403]="Data Model Element Value Not Initialized",a[i.DATA_MODEL_ELEMENT_IS_READ_ONLY=404]="Data Model Element Is Read Only",a[i.DATA_MODEL_ELEMENT_IS_WRITE_ONLY=405]="Data Model Element Is Write Only",a[i.DATA_MODEL_ELEMENT_VALUE_OUT_OF_RANGE=407]="Data Model Element Value Out Of Range",E.ERRCODES=i,E.ERRSTRINGS=a,E.SUPPORTED_INTERACTIONS_FIELDS=["id","type","learner_response","result",".correct_responses.0.pattern","description","weighting","latency","objectives.0.id","timestamp"],E.VALID_INTERACTIONS_TYPE_VALUES=["choice","fill-in","likert","long-fill-in","matching","numeric","other","performance","sequencing","true-false"],o.prototype._result=function(t,e){this.lastErrcode=t,this.lastDiagnotic=void 0===e?"":e},o.prototype._fail=function(t,e){return this._result(t,e),!!E.returnBooleanStrings&&"false"},o.prototype._ok=function(){return this._result(E.ERRCODES.NO_ERROR),!E.returnBooleanStrings||"true"},o.prototype.Initialize=function(t){if("string"!=typeof t||t.length)return this._fail(E.ERRCODES.GENERAL_ARGUMENT_ERROR);switch(this.status){case E.STATUS.STARTED:break;case E.STATUS.INITIALIZED:return this._fail(E.ERRCODES.ALREADY_INITIALIZED);case E.STATUS.TERMINATED:return this._fail(E.ERRCODES.CONTENT_INSTANCE_TERMINATED);default:return this._fail(E.ERRCODES.GENERAL_INITIALIZATION_FAILURE,"Unknown status "+this.status)}return this.session_time=0,null===E.storage.get("total_time")&&E.storage.set("total_time",0),this.status=E.STATUS.INITIALIZED,this._ok()},o.prototype.Terminate=function(t){if("string"!=typeof t||t.length)return this._fail(E.ERRCODES.GENERAL_ARGUMENT_ERROR);switch(this.status){case E.STATUS.STARTED:return this._fail(E.ERRCODES.TERMINATION_BEFORE_INITIALIZATION);case E.STATUS.INITIALIZED:break;case E.STATUS.TERMINATED:console.warn("LMS API : Terminate() called after termination");break;default:return this._fail(E.ERRCODES.GENERAL_TERMINATION_FAILURE,"Unknown status "+this.status)}return this.status=E.STATUS.TERMINATED,E.storage.set("total_time",Number(E.storage.get("total_time"))+this.session_time),this._ok()},o.prototype.GetValue=function(t){var e;if("string"!=typeof t)return this._fail(E.ERRCODES.GENERAL_ARGUMENT_ERROR,"GetValue takes a string as parameter");var n=t.split(".");if(n.length<2)return this._fail(E.ERRCODES.UNDEFINED_DATA_ELEMENT);if("cmi"!==n[0])return this._fail(E.ERRCODES.UNIMPLEMENTED_DATA_MODEL_ELEMENT);if(-1!==["exit","session_time"].indexOf(n[1]))return this._fail(E.ERRCODES.DATA_MODEL_ELEMENT_IS_WRITE_ONLY);switch(n[1]){case"entry":return null===(e=E.storage.get("entry"))?"ab-initio":e;case"completion_status":case"success_status":return E.storage.get(n[1]);case"total_time":return"PT"+E.storage.get("total_time")+"S";case"suspend_data":return E.storage.get("suspend_data");case"location":return E.storage.get("location");case"interactions":return function(t,e,n){if(e.length<3)return n(E.ERRCODES.UNDEFINED_DATA_ELEMENT,"Unknown data element : "+t);var i;try{i=JSON.parse(E.storage.get("interactions"))||[]}catch(t){return n(E.ERRCODES.GENERAL_GET_FAILURE,"internal : interactions parse error : "+t.message)}if("object"!==r(i))return n(E.ERRCODES.GENERAL_GET_FAILURE,"internal : interactions is not an object");if(!Array.isArray(i))return n(E.ERRCODES.GENERAL_GET_FAILURE,"internal : interactions is not an array");switch(e[2]){case"_count":return i.length;case"_children":return E.SUPPORTED_INTERACTIONS_FIELDS;default:return function(t,e,n,r){var i=n.length;if(!e[2].match(/^[0-9]+$/))return r(E.ERRCODES.UNDEFINED_DATA_ELEMENT,"Unknown data element : "+t);var a=Number(e[2]);if(a>=i)return r(E.ERRCODES.DATA_MODEL_ELEMENT_VALUE_NOT_INITIALIZED);var o=n[a];if(e.length<4)return r(E.ERRCODES.UNDEFINED_DATA_ELEMENT,"Unknown data element : "+t);var s="correct_responses"===e[3]?"".concat(e[3],".").concat(e[4],".").concat(e[5]):e[3];if(-1===E.SUPPORTED_INTERACTIONS_FIELDS.indexOf(s))return r(E.ERRCODES.UNIMPLEMENTED_DATA_MODEL_ELEMENT);if(!(s in o))return r(E.ERRCODES.DATA_MODEL_ELEMENT_VALUE_NOT_INITIALIZED,"not initialized : "+t);return o[s]}(t,e,i,n)}}(t,n,this._fail.bind(this));default:return this._fail(E.ERRCODES.UNIMPLEMENTED_DATA_MODEL_ELEMENT)}},o.prototype.SetValue=function(t,e){if("string"!=typeof t||"string"!=typeof e)return this._fail(E.ERRCODES.GENERAL_ARGUMENT_ERROR,"SetValue takes strings as parameters");var n=t.split(".");if(n.length<2)return this._fail(E.ERRCODES.UNDEFINED_DATA_ELEMENT);if("cmi"!==n[0])return this._fail(E.ERRCODES.UNIMPLEMENTED_DATA_MODEL_ELEMENT);if(-1!==["total_time"].indexOf(n[1]))return this._fail(E.ERRCODES.DATA_MODEL_ELEMENT_IS_READ_ONLY);switch(n[1]){case"exit":if(-1===["timeout","suspend","logout","normal",""].indexOf(e))return this._fail(E.ERRCODES.DATA_MODEL_ELEMENT_VALUE_OUT_OF_RANGE);E.storage.set("exit",e),-1!==["suspend","logout"].indexOf(e)?E.storage.set("entry","resume"):E.storage.set("entry","");break;case"completion_status":if(-1===["completed","incomplete","not attempted","unknown"].indexOf(e))return this._fail(E.ERRCODES.DATA_MODEL_ELEMENT_VALUE_OUT_OF_RANGE);E.storage.set("completion_status",e);break;case"success_status":if(-1===["passed","failed","unknown"].indexOf(e))return this._fail(E.ERRCODES.DATA_MODEL_ELEMENT_VALUE_OUT_OF_RANGE);E.storage.set("success_status",e);break;case"session_time":var i=/PT(\d+)S/.exec(e);if(null===i)return this._fail(E.ERRCODES.DATA_MODEL_ELEMENT_VALUE_OUT_OF_RANGE,"set cmi.session_time with value that do not match /PT\\d+S/ (sole pattern recognized so far)");this.session_time=Number(i[1]);break;case"suspend_data":if(e.length>64e3)return this._fail(E.ERRCODES.DATA_MODEL_ELEMENT_VALUE_OUT_OF_RANGE,"set cmi.suspend_data with value greater than 64k is not allowed - received ".concat(e.length));E.storage.set("suspend_data",e);break;case"location":E.storage.set("location",e);break;case"interactions":!function(t,e,n,i){if(n.length<3)return i(E.ERRCODES.UNDEFINED_DATA_ELEMENT,"Unknown data element : "+t);var a;try{a=JSON.parse(E.storage.get("interactions"))||[]}catch(t){return i(E.ERRCODES.GENERAL_SET_FAILURE,"internal : interactions parse error : "+t.message)}if("object"!==r(a))return i(E.ERRCODES.GENERAL_SET_FAILURE,"internal : interactions is not an object");if(!Array.isArray(a))return i(E.ERRCODES.GENERAL_SET_FAILURE,"internal : interactions is not an array");switch(n[2]){case"_count":case"_children":return i(E.ERRCODES.DATA_MODEL_ELEMENT_IS_READ_ONLY);default:!function(t,e,n,r,i){if(n.length<4)return i(E.ERRCODES.UNDEFINED_DATA_ELEMENT,"Unknown data element : "+t);if(!n[2].match(/^[0-9]+$/))return i(E.ERRCODES.UNDEFINED_DATA_ELEMENT,"Unknown data element : "+t);var a="correct_responses"===n[3]?"".concat(n[3],".").concat(n[4],".").concat(n[5]):n[3],o=r.length;if(-1===E.SUPPORTED_INTERACTIONS_FIELDS.indexOf(a))return i(E.ERRCODES.UNIMPLEMENTED_DATA_MODEL_ELEMENT);if("type"===a&&-1===E.VALID_INTERACTIONS_TYPE_VALUES.indexOf(e))return i(E.ERRCODES.DATA_MODEL_ELEMENT_VALUE_OUT_OF_RANGE);var s=Number(n[2]);if(s>=o)for(var _=o;_<=s;_++)r.push({id:_,type:"true-false",learner_response:"true"});r[s][a]=e,E.storage.set("interactions",JSON.stringify(r))}(t,e,n,a,i)}}(t,e,n,this._fail.bind(this));break;default:return this._fail(E.ERRCODES.UNIMPLEMENTED_DATA_MODEL_ELEMENT)}return this._ok()},o.prototype.Commit=function(t){return"string"!=typeof t||t.length?this._fail(E.ERRCODES.GENERAL_ARGUMENT_ERROR):this._ok()},o.prototype.GetLastError=function(){return this.lastErrcode},o.prototype.GetErrorString=function(t){return E.ERRSTRINGS[t]},o.prototype.GetDiagnostic=function(){return this.lastDiagnotic},e.default=E}])});