{"version":3,"sources":["../runner/areaBroker.js","../runner/dataHolder.js","../runner/plugin.js","../runner/probeOverseer.js","../runner/runner.js","../runner/proxy.js","../runner/providerLoader.js","../runner/proxy/sample.js","../runner/runnerComponent.js","../runner/testStore.js","module-create.js","/github/workspace/tao/views/build/config-wrap-end-default.js"],"names":[],"mappings":"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","sourcesContent":["define('taoTests/runner/areaBroker',['lodash', 'ui/areaBroker'], function (_, areaBroker$1) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n areaBroker$1 = areaBroker$1 && Object.prototype.hasOwnProperty.call(areaBroker$1, 'default') ? areaBroker$1['default'] : areaBroker$1;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technlogies SA\n *\n */\n var requireAreas = ['content', //where the content is renderer, for example an item\n 'toolbox', //the place to add arbitrary tools, like a zoom, a comment box, etc.\n 'navigation', //the navigation controls like next, previous, skip\n 'control', //the control center of the test, progress, timers, etc.\n 'header', //the area that could contains the test titles\n 'panel' //a panel to add more advanced GUI (item review, navigation pane, etc.)\n ];\n /**\n * Creates an area broker with the required areas for the test runner.\n *\n * @see ui/areaBroker\n *\n * @param {jQueryElement|HTMLElement|String} $container - the main container\n * @param {Object} mapping - keys are the area names, values are jQueryElement\n * @returns {broker} the broker\n * @throws {TypeError} without a valid container\n */\n\n var areaBroker = _.partial(areaBroker$1, requireAreas);\n\n return areaBroker;\n\n});\n\n","define('taoTests/runner/dataHolder',[],function () { 'use strict';\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 (original work) Open Assessment Technlogies SA\n *\n */\n\n /**\n * Holds the test runner data.\n *\n * @example\n * var holder = holder();\n * holder.get('testMap');\n *\n * @author Bertrand Chevrier \n */\n\n /**\n * @type {String[]} the list of default objects to create\n */\n var defaultObjects = ['testContext', 'testMap'];\n /**\n * Creates a new data holder,\n * with default entries.\n *\n * @returns {Map} the holder\n */\n\n function dataHolderFactory() {\n var map = new Map();\n defaultObjects.forEach(function (entry) {\n map.set(entry, {});\n });\n return map;\n }\n\n return dataHolderFactory;\n\n});\n\n","define('taoTests/runner/plugin',['lodash', 'core/plugin'], function (_, pluginFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n pluginFactory = pluginFactory && Object.prototype.hasOwnProperty.call(pluginFactory, 'default') ? pluginFactory['default'] : pluginFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n /**\n * A pluginFactory configured for the test runner\n * @returns {Function} the preconfigured plugin factory\n */\n\n var plugin = _.partialRight(pluginFactory, {\n //alias getHost to getTestRunner\n hostName: 'testRunner'\n });\n\n return plugin;\n\n});\n\n","define('taoTests/runner/probeOverseer',['lodash', 'moment', 'lib/uuid', 'lib/moment-timezone.min'], function (_, moment, uuid, momentTimezone_min) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n moment = moment && Object.prototype.hasOwnProperty.call(moment, 'default') ? moment['default'] : moment;\n uuid = uuid && Object.prototype.hasOwnProperty.call(uuid, 'default') ? uuid['default'] : uuid;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technlogies SA\n *\n */\n var timeZone = moment.tz.guess();\n var slice = Array.prototype.slice;\n /**\n * Create the overseer intance\n * @param {runner} runner - a instance of a test runner\n * @returns {probeOverseer} the new probe overseer\n * @throws TypeError if something goes wrong\n */\n\n function probeOverseerFactory(runner) {\n // the created instance\n var overseer; // the list of registered probes\n\n var probes = []; //temp queue\n\n var queue = []; //immutable queue which will not be flushed\n\n var immutableQueue = [];\n /**\n * @type {Storage} to store the collected events\n */\n\n var queueStorage;\n /**\n * @type {Promise} Promises chain to avoid write collisions\n */\n\n var writing = Promise.resolve(); //is the overseer started\n\n var started = false;\n /**\n * Get the storage instance\n * @returns {Promise} that resolves with the storage\n */\n\n var getStorage = function getStorage() {\n if (queueStorage) {\n return Promise.resolve(queueStorage);\n }\n\n return runner.getTestStore().getStore('test-probe').then(function (newStorage) {\n queueStorage = newStorage;\n return Promise.resolve(queueStorage);\n });\n };\n /**\n * Unset the storage instance\n */\n\n\n var resetStorage = function resetStorage() {\n queueStorage = null;\n };\n /**\n * Register the collection event of a probe against a runner\n * @param {Object} probe - a valid probe\n */\n\n\n function collectEvent(probe) {\n var eventNs = \".probe-\".concat(probe.name); //event handler registered to collect data\n\n var probeHandler = function probeHandler() {\n var now = moment();\n var data = {\n id: uuid(12, 16),\n type: probe.name,\n timestamp: now.format('x') / 1000,\n timezone: now.tz(timeZone).format('Z')\n };\n\n if (typeof probe.capture === 'function') {\n data.context = probe.capture.apply(probe, [runner].concat(slice.call(arguments)));\n }\n\n overseer.push(data);\n }; //fallback\n\n\n if (probe.latency) {\n return collectLatencyEvent(probe);\n }\n\n _.forEach(probe.events, function (eventName) {\n var listen = eventName.indexOf('.') > 0 ? eventName : eventName + eventNs;\n runner.on(listen, _.partial(probeHandler, eventName));\n });\n }\n\n function collectLatencyEvent(probe) {\n var eventNs = \".probe-\".concat(probe.name); //start event handler registered to collect data\n\n var startHandler = function startHandler() {\n var now = moment();\n var data = {\n id: uuid(12, 16),\n marker: 'start',\n type: probe.name,\n timestamp: now.format('x') / 1000,\n timezone: now.tz(timeZone).format('Z')\n };\n\n if (typeof probe.capture === 'function') {\n data.context = probe.capture.apply(probe, [runner].concat(slice.call(arguments)));\n }\n\n overseer.push(data);\n }; //stop event handler registered to collect data\n\n\n var stopHandler = function stopHandler() {\n var now = moment();\n var last;\n var data = {\n type: probe.name,\n timestamp: now.format('x') / 1000,\n timezone: now.tz(timeZone).format('Z')\n };\n var args = slice.call(arguments);\n last = _.findLast(immutableQueue, {\n type: probe.name,\n marker: 'start'\n });\n\n if (last && !_.findLast(immutableQueue, {\n type: probe.name,\n marker: 'end',\n id: last.id\n })) {\n data.id = last.id;\n data.marker = 'end';\n\n if (typeof probe.capture === 'function') {\n data.context = probe.capture.apply(probe, [runner].concat(args));\n }\n\n overseer.push(data);\n }\n }; //fallback\n\n\n if (!probe.latency) {\n return collectEvent(probe);\n }\n\n _.forEach(probe.startEvents, function (eventName) {\n var listen = eventName.indexOf('.') > 0 ? eventName : eventName + eventNs;\n runner.on(listen, _.partial(startHandler, eventName));\n });\n\n _.forEach(probe.stopEvents, function (eventName) {\n var listen = eventName.indexOf('.') > 0 ? eventName : eventName + eventNs;\n runner.on(listen, _.partial(stopHandler, eventName));\n });\n } //argument validation\n\n\n if (!_.isPlainObject(runner) || !_.isFunction(runner.init) || !_.isFunction(runner.on)) {\n throw new TypeError('Please set a test runner');\n }\n /**\n * @typedef {probeOverseer}\n */\n\n\n overseer = {\n /**\n * Add a new probe\n * @param {Object} probe\n * @param {String} probe.name - the probe name\n * @param {Boolean} [probe.latency = false] - simple or latency mode\n * @param {String[]} [probe.events] - the list of events to listen (simple mode)\n * @param {String[]} [probe.startEvents] - the list of events to mark the start (lantency mode)\n * @param {String[]} [probe.stopEvents] - the list of events to mark the end (latency mode)\n * @param {Function} [probe.capture] - lambda fn to define the data context, it receive the test runner and the event parameters\n * @returns {probeOverseer} chains\n * @throws TypeError if the probe is not well formatted\n */\n add: function add(probe) {\n // probe structure strict validation\n if (!_.isPlainObject(probe)) {\n throw new TypeError('A probe is a plain object');\n }\n\n if (!_.isString(probe.name) || _.isEmpty(probe.name)) {\n throw new TypeError('A probe must have a name');\n }\n\n if (_.where(probes, {\n name: probe.name\n }).length > 0) {\n throw new TypeError('A probe with this name is already regsitered');\n }\n\n if (probe.latency) {\n if (_.isString(probe.startEvents) && !_.isEmpty(probe.startEvents)) {\n probe.startEvents = [probe.startEvents];\n }\n\n if (_.isString(probe.stopEvents) && !_.isEmpty(probe.stopEvents)) {\n probe.stopEvents = [probe.stopEvents];\n }\n\n if (!probe.startEvents.length || !probe.stopEvents.length) {\n throw new TypeError('Latency based probes must have startEvents and stopEvents defined');\n } //if already started we register the events on addition\n\n\n if (started) {\n collectLatencyEvent(probe);\n }\n } else {\n if (_.isString(probe.events) && !_.isEmpty(probe.events)) {\n probe.events = [probe.events];\n }\n\n if (!_.isArray(probe.events) || probe.events.length === 0) {\n throw new TypeError('A probe must define events');\n } //if already started we register the events on addition\n\n\n if (started) {\n collectEvent(probe);\n }\n }\n\n probes.push(probe);\n return this;\n },\n\n /**\n * Get the time entries queue\n * @returns {Promise} with the data in parameterj\n */\n getQueue: function getQueue() {\n return getStorage().then(function (storage) {\n return storage.getItem('queue');\n });\n },\n\n /**\n * Get the list of defined probes\n * @returns {Object[]} the probes collection\n */\n getProbes: function getProbes() {\n return probes;\n },\n\n /**\n * Push a time entry to the queue\n * @param {Object} entry - the time entry\n */\n push: function push(entry) {\n getStorage().then(function (storage) {\n //ensure the queue is pushed to the store consistently and atomically\n writing = writing.then(function () {\n queue.push(entry);\n immutableQueue.push(entry);\n return storage.setItem('queue', queue);\n });\n });\n },\n\n /**\n * Flush the queue and get the entries\n * @returns {Promise} with the data in parameter\n */\n flush: function flush() {\n return new Promise(function (resolve) {\n getStorage().then(function (storage) {\n writing = writing.then(function () {\n return storage.getItem('queue').then(function (flushed) {\n queue = [];\n return storage.setItem('queue', queue).then(function () {\n resolve(flushed);\n });\n });\n });\n });\n });\n },\n\n /**\n * Start the probes\n * @returns {Promise} once started\n */\n start: function start() {\n return getStorage().then(function (storage) {\n return storage.getItem('queue').then(function (savedQueue) {\n if (_.isArray(savedQueue)) {\n queue = savedQueue;\n immutableQueue = savedQueue;\n }\n\n _.forEach(probes, collectEvent);\n\n started = true;\n });\n });\n },\n\n /**\n * Stop the probes\n * Be carefull, stop will also clear the store and the queue\n * @returns {Promise} once stopped\n */\n stop: function stop() {\n started = false;\n\n _.forEach(probes, function (probe) {\n var eventNs = \".probe-\".concat(probe.name);\n\n var removeHandler = function removeHandler(eventName) {\n runner.off(eventName + eventNs);\n };\n\n _.forEach(probe.startEvents, removeHandler);\n\n _.forEach(probe.stopEvents, removeHandler);\n\n _.forEach(probe.events, removeHandler);\n });\n\n queue = [];\n immutableQueue = [];\n return getStorage().then(function (storage) {\n return storage.removeItem('queue').then(resetStorage);\n });\n }\n };\n return overseer;\n }\n\n return probeOverseerFactory;\n\n});\n\n","define('taoTests/runner/runner',['lodash', 'core/eventifier', 'core/providerRegistry', 'taoTests/runner/dataHolder'], function (_, eventifier, providerRegistry, dataHolderFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n dataHolderFactory = dataHolderFactory && Object.prototype.hasOwnProperty.call(dataHolderFactory, 'default') ? dataHolderFactory['default'] : dataHolderFactory;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2015-2020 (original work) Open Assessment Technologies SA ;\n */\n /**\n * Builds an instance of the QTI test runner\n *\n * @param {String} providerName\n * @param {Function[]} pluginFactories\n * @param {Object} config\n * @param {String} config.serviceCallId - the identifier of the test session\n * @param {String} [config.testDefinition] - the identifier of the test definition\n * @param {String} [config.testCompilation] - the identifier of the compiled test\n * @param {Object} config.options - the test runner configuration options\n * @param {Object} config.options.plugins - the plugins configuration\n * @param {jQueryElement} [config.renderTo] - the dom element that is going to holds the test content (item, rubick, etc)\n * @returns {runner}\n */\n\n function testRunnerFactory(providerName) {\n var pluginFactories = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var config = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n /**\n * @type {Object} The test runner instance\n */\n var runner;\n /**\n * @type {Map} Contains the test runner data\n */\n\n var dataHolder;\n /**\n * @type {Object} the registered plugins\n */\n\n var plugins = {};\n /**\n * @type {Object} the test of the runner\n */\n\n var states = {\n init: false,\n ready: false,\n render: false,\n finish: false,\n destroy: false\n };\n /**\n * @type {Object} keeps the states of the items\n */\n\n var itemStates = {};\n /**\n * The selected test runner provider\n */\n\n var provider = testRunnerFactory.getProvider(providerName);\n /**\n * Keep the area broker instance\n * @see taoTests/runner/areaBroker\n */\n\n var areaBroker;\n /**\n * Keep the proxy instance\n * @see taoTests/runner/proxy\n */\n\n var proxy;\n /**\n * Keep the instance of the probes overseer\n * @see taoTests/runner/probeOverseer\n */\n\n var probeOverseer;\n /**\n * Keep the instance of a testStore\n * @see taoTests/runner/testStore\n */\n\n var testStore;\n /**\n * Run a method of the provider (by delegation)\n *\n * @param {String} method - the method to run\n * @param {...} args - rest parameters given to the provider method\n * @returns {Promise} so provider can do async stuffs\n */\n\n function providerRun(method) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return new Promise(function (resolve) {\n if (!_.isFunction(provider[method])) {\n return resolve();\n }\n\n return resolve(provider[method].apply(runner, args));\n });\n }\n /**\n * Run a method in all plugins\n *\n * @param {String} method - the method to run\n * @returns {Promise} once that resolve when all plugins are done\n */\n\n\n function pluginRun(method) {\n var execStack = [];\n\n _.forEach(runner.getPlugins(), function (plugin) {\n if (_.isFunction(plugin[method])) {\n execStack.push(plugin[method]());\n }\n });\n\n return Promise.all(execStack);\n }\n /**\n * Trigger error event\n * @param {Error|String} err - the error\n * @fires runner#error\n */\n\n\n function reportError(err) {\n runner.trigger('error', err);\n }\n /**\n * Defines the test runner\n *\n * @type {runner}\n */\n\n\n runner = eventifier({\n /**\n * Initialize the runner\n * - instantiate the plugins\n * - provider init\n * - plugins init\n * - call render\n * @fires runner#init\n * @returns {runner} chains\n */\n init: function init() {\n var _this = this;\n\n if (!dataHolder) {\n dataHolder = this.getDataHolder();\n } //instantiate the plugins first\n\n\n _.forEach(pluginFactories, function (pluginFactory) {\n var plugin = pluginFactory(runner, _this.getAreaBroker());\n plugins[plugin.getName()] = plugin;\n });\n\n providerRun('install').then(_.partial(providerRun, 'loadPersistentStates')).then(_.partial(pluginRun, 'install')).then(_.partial(providerRun, 'init')).then(_.partial(pluginRun, 'init')).then(function () {\n _this.setState('init', true).off('init.internal').after('init.internal', function () {\n return _this.render();\n }).trigger('init');\n }).catch(reportError);\n return this;\n },\n\n /**\n * Render the runner\n * - provider render\n * - plugins render\n * @fires runner#render\n * @fires runner#ready\n * @returns {runner} chains\n */\n render: function render() {\n var _this2 = this;\n\n providerRun('render').then(function () {\n return pluginRun('render');\n }).then(function () {\n _this2.setState('ready', true).trigger('render').trigger('ready');\n }).catch(reportError);\n return this;\n },\n\n /**\n * Load an item\n * - provider loadItem, resolve or return the itemData\n * - plugins loadItem\n * - call renderItem\n * @param {*} itemRef - something that let you identify the item to load\n * @fires runner#loaditem\n * @returns {runner} chains\n */\n loadItem: function loadItem(itemRef) {\n var _this3 = this;\n\n providerRun('loadItem', itemRef).then(function (itemData) {\n _this3.setItemState(itemRef, 'loaded', true).off('loaditem.internal').after('loaditem.internal', function () {\n return _this3.renderItem(itemRef, itemData);\n }).trigger('loaditem', itemRef, itemData);\n }).catch(reportError);\n return this;\n },\n\n /**\n * Render an item\n * - provider renderItem\n * - plugins renderItem\n * @param {Object} itemRef\n * @param {Object} itemData - the loaded item data\n * @fires runner#renderitem\n * @returns {runner} chains\n */\n renderItem: function renderItem(itemRef, itemData) {\n var _this4 = this;\n\n providerRun('renderItem', itemRef, itemData).then(function () {\n _this4.setItemState(itemRef, 'ready', true).trigger('renderitem', itemRef, itemData);\n }).catch(reportError);\n return this;\n },\n\n /**\n * Unload an item (for example to destroy the item)\n * - provider unloadItem\n * - plugins unloadItem\n * @param {*} itemRef - something that let you identify the item to unload\n * @fires runner#unloaditem\n * @returns {runner} chains\n */\n unloadItem: function unloadItem(itemRef) {\n var _this5 = this;\n\n providerRun('unloadItem', itemRef).then(function () {\n itemStates = _.omit(itemStates, itemRef);\n\n _this5.trigger('unloaditem', itemRef);\n }).catch(reportError);\n return this;\n },\n\n /**\n * Disable an item\n * - provider disableItem\n * @param {*} itemRef - something that let you identify the item\n * @fires runner#disableitem\n * @returns {runner} chains\n */\n disableItem: function disableItem(itemRef) {\n var _this6 = this;\n\n if (!this.getItemState(itemRef, 'disabled')) {\n providerRun('disableItem', itemRef).then(function () {\n _this6.setItemState(itemRef, 'disabled', true).trigger('disableitem', itemRef);\n }).catch(reportError);\n }\n\n return this;\n },\n\n /**\n * Enable an item\n * - provider enableItem\n * @param {*} itemRef - something that let you identify the item\n * @fires runner#disableitem\n * @returns {runner} chains\n */\n enableItem: function enableItem(itemRef) {\n var _this7 = this;\n\n if (this.getItemState(itemRef, 'disabled')) {\n providerRun('enableItem', itemRef).then(function () {\n _this7.setItemState(itemRef, 'disabled', false).trigger('enableitem', itemRef);\n }).catch(reportError);\n }\n\n return this;\n },\n\n /**\n * When the test is terminated\n * - provider finish\n * - plugins finsh\n * @fires runner#finish\n * @returns {runner} chains\n */\n finish: function finish() {\n var _this8 = this;\n\n providerRun('finish').then(function () {\n return pluginRun('finish');\n }).then(function () {\n _this8.setState('finish', true).trigger('finish');\n }).catch(reportError);\n return this;\n },\n\n /**\n * Flushes the runner\n * - provider flush\n * - plugins flush\n * @fires runner#flush\n * @returns {runner} chains\n */\n flush: function flush() {\n var _this9 = this;\n\n providerRun('flush').then(function () {\n return pluginRun('flush');\n }).then(function () {\n _this9.setState('flush', true).trigger('flush');\n }).catch(reportError);\n return this;\n },\n\n /**\n * Destroy\n * - provider destroy\n * - plugins destroy\n * @fires runner#destroy\n * @returns {runner} chains\n */\n destroy: function destroy() {\n var _this10 = this;\n\n providerRun('destroy').then(function () {\n return pluginRun('destroy');\n }).then(function () {\n if (proxy) {\n return proxy.destroy();\n }\n }).then(function () {\n _this10.setTestContext({}).setTestMap({}).setState('destroy', true).trigger('destroy');\n }).catch(reportError);\n return this;\n },\n\n /**\n * Get the whole test runner configuration\n * @returns {Object} the config\n */\n getConfig: function getConfig() {\n return config || {};\n },\n\n /**\n * Get the options from the configuration parameters, (feature flags, parameter values, etc.)\n *\n * Alias to getConfig().options\n *\n * In deprecated mode, this is initialized through getTestData (after /init)\n *\n * @returns {Object} the configuration options\n */\n getOptions: function getOptions() {\n return this.getConfig().options || {};\n },\n\n /**\n * Get the runner pugins\n * @returns {plugin[]} the plugins\n */\n getPlugins: function getPlugins() {\n return plugins;\n },\n\n /**\n * Get a plugin\n * @param {String} name - the plugin name\n * @returns {plugin} the plugin\n */\n getPlugin: function getPlugin(name) {\n return plugins[name];\n },\n\n /**\n * Get the configuration of the plugins\n *\n * Alias to getConfig().options.plugins\n *\n * In deprecated mode, this is initialized through getTestData (after /init)\n *\n * @returns {Object} the configuration options\n */\n getPluginsConfig: function getPluginsConfig() {\n return this.getOptions().plugins || {};\n },\n\n /**\n * Get the configuration of a given plugin\n *\n * In deprecated mode, this is initialized through getTestData (after /init)\n *\n * @param {String} pluginName - the name of the plugin\n * @returns {Object} the configuration options of the plugin\n */\n getPluginConfig: function getPluginConfig(pluginName) {\n if (pluginName && plugins[pluginName]) {\n var pluginsConfig = this.getPluginsConfig();\n\n if (pluginsConfig[pluginName]) {\n return pluginsConfig[pluginName];\n }\n }\n\n return {};\n },\n\n /**\n * Get the area broker, load it if not present\n *\n * @returns {areaBroker} the areaBroker\n */\n getAreaBroker: function getAreaBroker() {\n if (!areaBroker) {\n areaBroker = provider.loadAreaBroker.call(this);\n }\n\n return areaBroker;\n },\n\n /**\n * Get the proxy, load it if not present\n *\n * @returns {proxy} the proxy\n */\n getProxy: function getProxy() {\n var _this11 = this;\n\n if (!proxy) {\n if (!_.isFunction(provider.loadProxy)) {\n throw new Error('The provider does not have a loadProxy method');\n }\n\n proxy = provider.loadProxy.call(this);\n proxy.on('error', function (error) {\n return _this11.trigger('error', error);\n });\n proxy.install(this.getDataHolder());\n }\n\n return proxy;\n },\n\n /**\n * Get the probeOverseer, and load it if not present\n *\n * @returns {probeOverseer} the probe overseer\n */\n getProbeOverseer: function getProbeOverseer() {\n if (!probeOverseer && _.isFunction(provider.loadProbeOverseer)) {\n probeOverseer = provider.loadProbeOverseer.call(this);\n }\n\n return probeOverseer;\n },\n\n /**\n * Get the testStore, and load it if not present\n *\n * @returns {testStore} the testStore instance\n */\n getTestStore: function getTestStore() {\n if (!testStore && _.isFunction(provider.loadTestStore)) {\n testStore = provider.loadTestStore.call(this);\n }\n\n return testStore;\n },\n\n /**\n * Get a plugin store.\n * It's a convenience method that calls testStore.getStore\n * @param {String} name - the name of store, usually the plugin name.\n *\n * @returns {Promise} the plugin store\n */\n getPluginStore: function getPluginStore(name) {\n var loadedStore = this.getTestStore();\n\n if (!loadedStore || !_.isFunction(loadedStore.getStore)) {\n return Promise.reject(new Error('Please configure a testStore via loadTestStore to be able to get a plugin store'));\n }\n\n return this.getTestStore().getStore(name);\n },\n\n /**\n * Check a runner state\n *\n * @param {String} name - the state name\n * @returns {Boolean} if active, false if not set\n */\n getState: function getState(name) {\n return !!states[name];\n },\n\n /**\n * Define a runner state\n *\n * @param {String} name - the state name\n * @param {Boolean} active - is the state active\n * @returns {runner} chains\n * @throws {TypeError} if the state name is not a valid string\n */\n setState: function setState(name, active) {\n if (!_.isString(name) || _.isEmpty(name)) {\n throw new TypeError('The state must have a name');\n }\n\n states[name] = !!active;\n return this;\n },\n\n /**\n * Checks a runner persistent state\n * - provider getPersistentState\n *\n * @param {String} name - the state name\n * @returns {Boolean} if active, false if not set\n */\n getPersistentState: function getPersistentState(name) {\n var state;\n\n if (_.isFunction(provider.getPersistentState)) {\n state = provider.getPersistentState.call(runner, name);\n }\n\n return !!state;\n },\n\n /**\n * Defines a runner persistent state\n * - provider setPersistentState\n *\n * @param {String} name - the state name\n * @param {Boolean} active - is the state active\n * @returns {Promise} Returns a promise that:\n * - will be resolved once the state is fully stored\n * - will be rejected if any error occurs or if the state name is not a valid string\n */\n setPersistentState: function setPersistentState(name, active) {\n var stored;\n\n if (!_.isString(name) || _.isEmpty(name)) {\n stored = Promise.reject(new TypeError('The state must have a name'));\n } else {\n stored = providerRun('setPersistentState', name, !!active);\n }\n\n stored.catch(reportError);\n return stored;\n },\n\n /**\n * Check an item state\n *\n * @param {*} itemRef - something that let you identify the item\n * @param {String} name - the state name\n * @returns {Boolean} if active, false if not set\n *\n * @throws {TypeError} if there is no itemRef nor name\n */\n getItemState: function getItemState(itemRef, name) {\n if (_.isEmpty(itemRef) || _.isEmpty(name)) {\n throw new TypeError('The state is identified by an itemRef and a name');\n }\n\n return !!(itemStates[itemRef] && itemStates[itemRef][name]);\n },\n\n /**\n * Check an item state\n *\n * @param {*} itemRef - something that let you identify the item\n * @param {String} name - the state name\n * @param {Boolean} active - is the state active\n * @returns {runner} chains\n *\n * @throws {TypeError} if there is no itemRef nor name\n */\n setItemState: function setItemState(itemRef, name, active) {\n if (_.isEmpty(itemRef) || _.isEmpty(name)) {\n throw new TypeError('The state is identified by an itemRef and a name');\n }\n\n itemStates[itemRef] = itemStates[itemRef] || {\n loaded: false,\n ready: false,\n disabled: false\n };\n itemStates[itemRef][name] = !!active;\n return this;\n },\n\n /**\n * Get the test data/definition\n * @deprecated\n * @returns {Object} the test data\n */\n getTestData: function getTestData() {\n return dataHolder && dataHolder.get('testData');\n },\n\n /**\n * Set the test data/definition\n * @deprecated\n * @param {Object} testData - the test data\n * @returns {runner} chains\n */\n setTestData: function setTestData(testData) {\n if (dataHolder && _.isPlainObject(testData)) {\n dataHolder.set('testData', testData);\n }\n\n return this;\n },\n\n /**\n * Get the test context/state\n * @returns {Object} the test context\n */\n getTestContext: function getTestContext() {\n return dataHolder && dataHolder.get('testContext');\n },\n\n /**\n * Set the test context/state\n * @param {Object} testContext - the context to set\n * @returns {runner} chains\n */\n setTestContext: function setTestContext(testContext) {\n if (dataHolder && _.isPlainObject(testContext)) {\n dataHolder.set('testContext', testContext);\n }\n\n return this;\n },\n\n /**\n * Get the test items map\n * @returns {Object} the test map\n */\n getTestMap: function getTestMap() {\n return dataHolder && dataHolder.get('testMap');\n },\n\n /**\n * Set the test items map\n * @param {Object} testMap - the map to set\n * @returns {runner} chains\n */\n setTestMap: function setTestMap(testMap) {\n if (dataHolder && _.isPlainObject(testMap)) {\n dataHolder.set('testMap', testMap);\n }\n\n return this;\n },\n\n /**\n * Get the data holder\n * @returns {dataHolder}\n */\n getDataHolder: function getDataHolder() {\n if (!dataHolder) {\n if (_.isFunction(provider.loadDataHolder)) {\n dataHolder = provider.loadDataHolder.call(this);\n } else {\n dataHolder = dataHolderFactory();\n }\n }\n\n return dataHolder;\n },\n\n /**\n * Move next alias\n * @param {String|*} [scope] - the movement scope\n * @fires runner#move\n * @returns {runner} chains\n */\n next: function next(scope) {\n if (_.isFunction(provider.next)) {\n return providerRun('next', scope);\n } //backward compat\n\n\n this.trigger('move', 'next', scope);\n return this;\n },\n\n /**\n * Move previous alias\n * @param {String|*} [scope] - the movement scope\n * @fires runner#move\n * @returns {runner} chains\n */\n previous: function previous(scope) {\n if (_.isFunction(provider.previous)) {\n return providerRun('previous', scope);\n } //backward compat\n\n\n this.trigger('move', 'previous', scope);\n return this;\n },\n\n /**\n * Move to alias\n * @param {String|Number} position - where to jump\n * @param {String|*} [scope] - the movement scope\n * @fires runner#move\n * @returns {runner} chains\n */\n jump: function jump(position, scope) {\n if (_.isFunction(provider.jump)) {\n return providerRun('jump', position, scope);\n } //backward compat\n\n\n this.trigger('move', 'jump', scope, position);\n return this;\n },\n\n /**\n * Skip alias\n * @param {String|*} [scope] - the movement scope\n * @param {String|*} [direction] - next/previous/jump\n * @param {Number|*} [ref] - the item ref\n * @fires runner#skip\n * @returns {runner} chains\n */\n skip: function skip(scope, direction, ref) {\n if (_.isFunction(provider.skip)) {\n return providerRun('skip', scope, direction, ref);\n } //backward compat\n\n\n this.trigger('skip', scope, direction, ref);\n return this;\n },\n\n /**\n * Exit the test\n * @param {String|*} [why] - reason the test is exited\n * @fires runner#exit\n * @returns {runner} chains\n */\n exit: function exit(why) {\n if (_.isFunction(provider.exit)) {\n return providerRun('exit', why);\n } //backward compat\n\n\n this.trigger('exit', why);\n return this;\n },\n\n /**\n * Pause the current execution\n * @fires runner#pause\n * @returns {runner} chains\n */\n pause: function pause() {\n if (_.isFunction(provider.pause)) {\n if (!this.getState('pause')) {\n this.setState('pause', true);\n return providerRun('pause');\n }\n\n return Promise.resolve();\n } //backward compat\n\n\n if (!this.getState('pause')) {\n this.setState('pause', true).trigger('pause');\n }\n\n return this;\n },\n\n /**\n * Resume a paused test\n * @fires runner#pause\n * @returns {runner} chains\n */\n resume: function resume() {\n if (_.isFunction(provider.resume)) {\n if (this.getState('pause')) {\n this.setState('pause', false);\n return providerRun('resume');\n }\n\n return Promise.resolve();\n } //backward compat\n\n\n if (this.getState('pause') === true) {\n this.setState('pause', false).trigger('resume');\n }\n\n return this;\n },\n\n /**\n * Notify a test timeout\n * @param {String} scope - The scope where the timeout occurred\n * @param {String} ref - The reference to the place where the timeout occurred\n * @param {Object} [timer] - The timer's descriptor, if any\n * @fires runner#timeout\n * @returns {runner} chains\n */\n timeout: function timeout(scope, ref, timer) {\n if (_.isFunction(provider.timeout)) {\n return providerRun('timeout', scope, ref, timer);\n } //backward compat\n\n\n this.trigger('timeout', scope, ref, timer);\n return this;\n }\n });\n runner.on('move', function () {\n this.trigger.apply(this, arguments);\n }).after('destroy', function destroyCleanUp() {\n if (dataHolder) {\n dataHolder.clear();\n }\n\n areaBroker = null;\n proxy = null;\n probeOverseer = null;\n testStore = null;\n });\n return runner;\n } //bind the provider registration capabilities to the testRunnerFactory\n\n\n var runner = providerRegistry(testRunnerFactory, function validateProvider(provider) {\n //mandatory methods\n if (!_.isFunction(provider.loadAreaBroker)) {\n throw new TypeError('The runner provider MUST have a method that returns an areaBroker');\n }\n\n return true;\n });\n\n return runner;\n\n});\n\n","define('taoTests/runner/proxy',['lodash', 'async', 'core/delegator', 'core/eventifier', 'core/providerRegistry', 'core/tokenHandler', 'core/connectivity'], function (_, async, delegator, eventifier, providerRegistry, tokenHandlerFactory, connectivity) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n async = async && Object.prototype.hasOwnProperty.call(async, 'default') ? async['default'] : async;\n delegator = delegator && Object.prototype.hasOwnProperty.call(delegator, 'default') ? delegator['default'] : delegator;\n eventifier = eventifier && Object.prototype.hasOwnProperty.call(eventifier, 'default') ? eventifier['default'] : eventifier;\n providerRegistry = providerRegistry && Object.prototype.hasOwnProperty.call(providerRegistry, 'default') ? providerRegistry['default'] : providerRegistry;\n tokenHandlerFactory = tokenHandlerFactory && Object.prototype.hasOwnProperty.call(tokenHandlerFactory, 'default') ? tokenHandlerFactory['default'] : tokenHandlerFactory;\n connectivity = connectivity && Object.prototype.hasOwnProperty.call(connectivity, 'default') ? connectivity['default'] : connectivity;\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n var _defaults = {};\n var _slice = [].slice;\n /**\n * Defines a proxy bound to a particular adapter\n *\n * @param {String} proxyName - The name of the proxy adapter to use in the returned proxy instance\n * @param {Object} [config] - Some optional config depending of implementation,\n * this object will be forwarded to the proxy adapter\n * @returns {proxy} - The proxy instance, bound to the selected proxy adapter\n */\n\n function proxyFactory(proxyName, config) {\n var proxy, delegateProxy, communicator, communicatorPromise;\n var testDataHolder;\n var extraCallParams = {};\n var proxyAdapter = proxyFactory.getProvider(proxyName);\n\n var initConfig = _.defaults(config || {}, _defaults);\n\n var tokenHandler = tokenHandlerFactory();\n var middlewares = {};\n var initialized = false;\n var onlineStatus = connectivity.isOnline();\n /**\n * Gets parameters merged with extra parameters\n * @param {Object} [params]\n * @returns {Object}\n */\n\n function getParams(params) {\n var mergedParams = _.merge({}, params, extraCallParams);\n\n extraCallParams = {};\n return mergedParams;\n }\n /**\n * Gets the aggregated list of middlewares for a particular queue name\n * @param {String} queue - The name of the queue to get\n * @returns {Array}\n */\n\n\n function getMiddlewares(queue) {\n var list = middlewares[queue] || [];\n\n if (middlewares.all) {\n list = list.concat(middlewares.all);\n }\n\n return list;\n }\n /**\n * Applies the list of registered middlewares onto the received response\n * @param {Object} request - The request descriptor\n * @param {String} request.command - The name of the requested command\n * @param {Object} request.params - The map of provided parameters\n * @param {Object} response The response descriptor\n * @param {String} response.status The status of the response, can be either 'success' or 'error'\n * @param {Object} response.data The full response data\n * @returns {Promise}\n */\n\n\n function applyMiddlewares(request, response) {\n // wrap each middleware to provide parameters\n var list = _.map(getMiddlewares(request.command), function (middleware) {\n return function (next) {\n middleware(request, response, next);\n };\n }); // apply each middleware in series, then resolve or reject the promise\n\n\n return new Promise(function (resolve, reject) {\n async.series(list, function (err) {\n // handle implicit error from response descriptor\n if (!err && 'error' === response.status) {\n err = response.data;\n }\n\n if (err) {\n reject(err);\n } else {\n proxy.trigger('receive', response.data, 'proxy');\n resolve(response.data);\n }\n });\n });\n }\n /**\n * Delegates the call to the proxy implementation and apply the middleware.\n *\n * @param {String} fnName - The name of the delegated method to call\n * @returns {Promise} - The delegated method must return a promise\n * @private\n * @throws Error\n */\n\n\n function delegate(fnName) {\n var request = {\n command: fnName,\n params: _slice.call(arguments, 1)\n };\n\n if (!initialized && !_.contains(['install', 'init'], fnName)) {\n return Promise.reject(new Error('Proxy is not properly initialized or has been destroyed!'));\n }\n\n return delegateProxy.apply(null, arguments).then(function (data) {\n // If the delegate call succeed the proxy is initialized.\n // Place this set here to avoid to wrap the init() into another promise.\n initialized = true; // handle successful request\n\n return applyMiddlewares(request, {\n status: 'success',\n data: data\n });\n }).catch(function (data) {\n // handle failed request\n return applyMiddlewares(request, {\n status: 'error',\n data: data\n });\n });\n }\n /**\n * Defines the test runner proxy\n * @typedef {proxy}\n */\n\n\n proxy = eventifier({\n /**\n * Add a middleware\n * @param {String} [command] The command queue in which add the middleware (default: 'all')\n * @param {Function...} callback - A middleware callback. Must accept 3 parameters: request, response, next.\n * @returns {proxy}\n */\n use: function use(command) {\n var queue = command && _.isString(command) ? command : 'all';\n var list = middlewares[queue] || [];\n middlewares[queue] = list;\n\n _.each(arguments, function (cb) {\n if (_.isFunction(cb)) {\n list.push(cb);\n }\n });\n\n return this;\n },\n\n /**\n * Install the proxy.\n * This step let's attach some features before the proxy reallys starts (before init).\n *\n * @param {Map} dataHolder - the test runner data holder\n * @returns {*}\n */\n install: function install(dataHolder) {\n if (dataHolder) {\n testDataHolder = dataHolder;\n }\n\n return delegate('install', initConfig);\n },\n\n /**\n * Initializes the proxy\n * @param {Object} [params] - An optional list of parameters\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n * @fires init\n */\n init: function init(params) {\n /**\n * @event proxy#init\n * @param {Promise} promise\n * @param {Object} config\n * @param {Object} params\n */\n return delegate('init', initConfig, getParams(params));\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n * @fires destroy\n */\n destroy: function destroy() {\n /**\n * @event proxy#destroy\n * @param {Promise} promise\n */\n return delegate('destroy').then(function () {\n // The proxy is now destroyed. A call to init() is mandatory to be able to use it again.\n initialized = false; // a communicator has been invoked and...\n\n if (communicatorPromise) {\n return new Promise(function (resolve, reject) {\n function destroyCommunicator() {\n communicator.destroy().then(resolve).catch(reject);\n }\n\n communicatorPromise // ... has been loaded successfully, then destroy it\n .then(function () {\n destroyCommunicator();\n }) // ...has failed to be loaded, maybe no need to destroy it\n .catch(function () {\n if (communicator) {\n destroyCommunicator();\n } else {\n resolve();\n }\n });\n });\n }\n });\n },\n\n /**\n * Get the map that holds the test data\n * @returns {Map|Object} the dataHolder\n */\n getDataHolder: function getDataHolder() {\n return testDataHolder;\n },\n\n /**\n * Set the proxy as online\n * @returns {proxy} chains\n * @fires {proxy#reconnect}\n */\n setOnline: function setOnline() {\n if (this.isOffline()) {\n onlineStatus = true;\n this.trigger('reconnect');\n }\n\n return this;\n },\n\n /**\n * Set the proxy as offline\n * @param {String} [source] - source of the connectivity change\n * @returns {proxy} chains\n * @fires {proxy#disconnect}\n */\n setOffline: function setOffline(source) {\n if (this.isOnline()) {\n onlineStatus = false;\n this.trigger('disconnect', source);\n }\n\n return this;\n },\n\n /**\n * Are we online ?\n * @returns {Boolean}\n */\n isOnline: function isOnline() {\n return onlineStatus;\n },\n\n /**\n * Are we offline\n * @returns {Boolean}\n */\n isOffline: function isOffline() {\n return !onlineStatus;\n },\n\n /**\n * For the proxy a connection error is an error object with\n * source 'network', a 0 code and a false sent attribute.\n *\n * @param {Error|Object} err - the error to verify\n * @returns {Boolean} true if a connection error.\n */\n isConnectivityError: function isConnectivityError(err) {\n return _.isObject(err) && err.source === 'network' && err.code === 0 && err.sent === false;\n },\n\n /**\n * Gets the security token handler\n * @returns {tokenHandler}\n */\n getTokenHandler: function getTokenHandler() {\n return tokenHandler;\n },\n\n /**\n * Checks if a communication channel has been requested.\n * @returns {Boolean}\n */\n hasCommunicator: function hasCommunicator() {\n return !!communicatorPromise;\n },\n\n /**\n * Gets access to the communication channel, load it if not present\n * @returns {Promise} Returns a promise that will resolve the communication channel\n */\n getCommunicator: function getCommunicator() {\n var self = this;\n\n if (!initialized) {\n return Promise.reject(new Error('Proxy is not properly initialized or has been destroyed!'));\n }\n\n if (!communicatorPromise) {\n communicatorPromise = new Promise(function (resolve, reject) {\n if (_.isFunction(proxyAdapter.loadCommunicator)) {\n communicator = proxyAdapter.loadCommunicator.call(self);\n\n if (communicator) {\n communicator.before('error', function (e, err) {\n if (self.isConnectivityError(err)) {\n self.setOffline('communicator');\n }\n }).on('error', function (err) {\n self.trigger('error', err);\n }).on('receive', function (response) {\n self.setOnline();\n self.trigger('receive', response, 'communicator');\n }).init().then(function () {\n return communicator.open().then(function () {\n resolve(communicator);\n }).catch(reject);\n }).catch(reject);\n } else {\n reject(new Error('No communicator has been set up!'));\n }\n } else {\n reject(new Error('The proxy provider does not have a loadCommunicator method'));\n }\n });\n }\n\n return communicatorPromise;\n },\n\n /**\n * Registers a listener on a particular channel\n * @param {String} name - The name of the channel to listen\n * @param {Function} handler - The listener callback\n * @returns {proxy}\n * @throws TypeError if the name is missing or the handler is not a callback\n */\n channel: function channel(name, handler) {\n if (!_.isString(name) || name.length <= 0) {\n throw new TypeError('A channel must have a name');\n }\n\n if (!_.isFunction(handler)) {\n throw new TypeError('A handler must be attached to a channel');\n }\n\n this.getCommunicator().then(function (communicatorInstance) {\n communicatorInstance.channel(name, handler);\n }) // just an empty catch to avoid any error to be displayed in the console when the communicator is not enabled\n .catch(_.noop);\n this.on(\"channel-\".concat(name), handler);\n return this;\n },\n\n /**\n * Sends an messages through the communication implementation.\n * @param {String} channel - The name of the communication channel to use\n * @param {Object} message - The message to send\n * @returns {Promise} The delegated provider's method must return a promise\n */\n send: function send(channel, message) {\n return this.getCommunicator().then(function (communicatorInstance) {\n return communicatorInstance.send(channel, message);\n });\n },\n\n /**\n * Add extra parameters that will be added to the init or the next callTestAction or callItemAction\n * This enables plugins to place parameters for next calls\n * @param {Object} params - the extra parameters\n * @returns {proxy}\n */\n addCallActionParams: function addCallActionParams(params) {\n if (_.isPlainObject(params)) {\n _.merge(extraCallParams, params);\n }\n\n return this;\n },\n\n /**\n * Gets the test definition data\n * @deprecated\n *\n * @returns {Promise} - Returns a promise. The test definition data will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires getTestData\n */\n getTestData: function getTestData() {\n /**\n * @event proxy#getTestData\n * @param {Promise} promise\n */\n return delegate('getTestData');\n },\n\n /**\n * Gets the test context\n * @returns {Promise} - Returns a promise. The context object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestContext: function getTestContext() {\n /**\n * @event proxy#getTestContext\n * @param {Promise} promise\n */\n return delegate('getTestContext');\n },\n\n /**\n * Gets the test map\n * @returns {Promise} - Returns a promise. The test map object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestMap: function getTestMap() {\n /**\n * @event proxy#getTestMap\n * @param {Promise} promise\n */\n return delegate('getTestMap');\n },\n\n /**\n * Sends the test variables\n * @param {Object} variables\n * @param {Boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later (default: false).\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires sendVariables\n */\n sendVariables: function sendVariables(variables, deferred) {\n /**\n * @event proxy#sendVariables\n * @param {Promise} promise\n */\n return delegate('sendVariables', variables, deferred);\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @param {Boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires callTestAction\n */\n callTestAction: function callTestAction(action, params, deferred) {\n /**\n * @event proxy#callTestAction\n * @param {Promise} promise\n * @param {String} action\n * @param {Object} params\n */\n return delegate('callTestAction', action, getParams(params), deferred);\n },\n\n /**\n * Gets an item definition by its URI, also gets its current state\n * @param {String} uri - The URI of the item to get\n * @param {Object} [params] - addtional params to be appended\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires getItem\n */\n getItem: function getItem(uri, params) {\n /**\n * @event proxy#getItem\n * @param {Promise} promise\n * @param {String} uri\n */\n return delegate('getItem', uri, params);\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} uri - The URI of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @param {Object} [params] - addtional params to be appended\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires submitItem\n */\n submitItem: function submitItem(uri, state, response, params) {\n /**\n * @event proxy#submitItem\n * @param {Promise} promise\n * @param {String} uri\n * @param {Object} state\n * @param {Object} response\n */\n return delegate('submitItem', uri, state, response, getParams(params));\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} uri - The URI of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @param {Boolean} deferred whether action can be scheduled (put into queue) to be sent in a bunch of actions later.\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires callItemAction\n */\n callItemAction: function callItemAction(uri, action, params, deferred) {\n /**\n * @event proxy#callItemAction\n * @param {Promise} promise\n * @param {String} uri\n * @param {String} action\n * @param {Object} params\n */\n return delegate('callItemAction', uri, action, getParams(params), deferred);\n },\n\n /**\n * Sends a telemetry signal\n * @param {String} uri - The URI of the item for which sends the telemetry signal\n * @param {String} signal - The name of the signal to send\n * @param {Object} [params] - Some optional parameters to join to the signal\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires telemetry\n */\n telemetry: function telemetry(uri, signal, params) {\n /**\n * @event proxy#telemetry\n * @param {Promise} promise\n * @param {String} uri\n * @param {String} signal\n * @param {Object} params\n */\n return delegate('telemetry', uri, signal, params);\n }\n }); //listen for connectivty changes\n\n connectivity.on('offline', function () {\n proxy.setOffline('device');\n }).on('online', function () {\n proxy.setOnline();\n }); // catch platform messages that come outside of the communicator component, then each is dispatched to the right channel\n\n proxy.on('message', function (channel, message) {\n this.trigger(\"channel-\".concat(channel), message);\n }).use(function (request, response, next) {\n if (response.data && response.data.messages) {\n // receive server messages\n _.forEach(response.data.messages, function (msg) {\n if (msg.channel) {\n proxy.trigger('message', msg.channel, msg.message);\n } else {\n proxy.trigger('message', 'malformed', msg);\n }\n });\n }\n\n next();\n }) //detect failing request and change the online status\n .use(function (request, response, next) {\n if (proxy.isConnectivityError(response.data)) {\n proxy.setOffline('request');\n } else if (response.data && response.data.sent === true) {\n proxy.setOnline();\n }\n\n next();\n });\n delegateProxy = delegator(proxy, proxyAdapter, {\n name: 'proxy',\n wrapper: function pluginWrapper(response) {\n return Promise.resolve(response);\n }\n });\n return proxy;\n }\n\n var proxy = providerRegistry(proxyFactory);\n\n return proxy;\n\n});\n\n","define('taoTests/runner/providerLoader',['core/logger', 'core/providerLoader', 'core/pluginLoader', 'core/communicator', 'taoTests/runner/runner', 'taoTests/runner/proxy', 'taoItems/runner/api/itemRunner'], function (loggerFactory, providerLoader, pluginLoader, _communicator, _runner, _proxy, _itemRunner) { 'use strict';\n\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n providerLoader = providerLoader && Object.prototype.hasOwnProperty.call(providerLoader, 'default') ? providerLoader['default'] : providerLoader;\n pluginLoader = pluginLoader && Object.prototype.hasOwnProperty.call(pluginLoader, 'default') ? pluginLoader['default'] : pluginLoader;\n _communicator = _communicator && Object.prototype.hasOwnProperty.call(_communicator, 'default') ? _communicator['default'] : _communicator;\n _runner = _runner && Object.prototype.hasOwnProperty.call(_runner, 'default') ? _runner['default'] : _runner;\n _proxy = _proxy && Object.prototype.hasOwnProperty.call(_proxy, 'default') ? _proxy['default'] : _proxy;\n _itemRunner = _itemRunner && Object.prototype.hasOwnProperty.call(_itemRunner, 'default') ? _itemRunner['default'] : _itemRunner;\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n var logger = loggerFactory('taoTests/runner/loader');\n /**\n * @typedef {Object} provider - A provider is an object exposing a list of methods with respect to the API managed by the target.\n * @property {String} name - The name of the provider. It should be unique among all.\n * @property {Function} init - Each provider much expose at least a method `init()`\n * @property {Function} ... - Any other method the target is expecting\n */\n\n /**\n * Load the providers that match the registration\n * @param {Object} providers\n * @param {provider|provider[]} providers.runner\n * @param {provider|provider[]} [providers.proxy]\n * @param {provider|provider[]} [providers.communicator]\n * @param {provider|provider[]} [providers.plugins]\n * @param {Boolean} loadFromBundle - does the loader load the modules from the sources (dev mode) or the bundles\n * @returns {Promise} resolves with the loaded providers per provider type\n */\n\n function loadTestRunnerProviders() {\n var providers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var loadFromBundle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n /**\n * Default way to load the modules and register the providers\n * @param {Object[]} providersToLoad - the list of providers\n * @param {Object} target - a provider target (an object that use the providers), it needs to expose registerProvider\n * @returns {Promise} resolves with the target\n * @throws {TypeError} if the target is not a provider target\n */\n var loadAndRegisterProvider = function loadAndRegisterProvider() {\n var providersToLoad = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var target = arguments.length > 1 ? arguments[1] : undefined;\n\n if (!target || typeof target.registerProvider !== 'function') {\n throw new TypeError('Trying to register providers on a target that is not a provider API');\n }\n\n return providerLoader().addList(providersToLoad).load(loadFromBundle).then(function (loadedProviders) {\n loadedProviders.forEach(function (provider) {\n return target.registerProvider(provider.name, provider);\n });\n return target;\n });\n };\n /**\n * Available provider registration\n */\n\n\n var registration = {\n runner: function runner() {\n var runnerProviders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return loadAndRegisterProvider(runnerProviders, _runner);\n },\n itemRunner: function itemRunner() {\n var itemRunnerProviders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return providerLoader().addList(itemRunnerProviders).load(loadFromBundle).then(function (loadedProviders) {\n loadedProviders.forEach(function (provider) {\n return _itemRunner.register(provider.name, provider);\n });\n return _itemRunner;\n });\n },\n communicator: function communicator() {\n var communicatorProviders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return loadAndRegisterProvider(communicatorProviders, _communicator);\n },\n proxy: function proxy() {\n var proxyProviders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return loadAndRegisterProvider(proxyProviders, _proxy);\n },\n plugins: function plugins() {\n var plugins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return pluginLoader().addList(plugins).load(loadFromBundle);\n }\n };\n\n if (!loadFromBundle) {\n logger.warn('All modules will be loaded from sources');\n }\n\n return Promise.all(Object.keys(providers).map(function (providerType) {\n if (typeof registration[providerType] === 'function') {\n logger.debug(\"Start to load and register the '\".concat(providerType, \"' providers\"));\n var providersToLoad = Array.isArray(providers[providerType]) ? providers[providerType] : [providers[providerType]];\n return registration[providerType](providersToLoad).then(function (loaded) {\n logger.debug(\"'\".concat(providerType, \"' providers are loaded and registered\"));\n return _defineProperty({}, providerType, loaded);\n });\n } else {\n logger.warn(\"Ignoring the '\".concat(providerType, \"' providers loading, no registration method found\"));\n }\n })).then(function (results) {\n return results.reduce(function (acc, value) {\n return Object.assign(acc, value);\n }, {});\n }).catch(function (err) {\n logger.error(\"Error in test runner providers and plugins loading : \".concat(err.message));\n throw err;\n });\n }\n\n return loadTestRunnerProviders;\n\n});\n\n","define('taoTests/runner/proxy/sample',[],function () { 'use strict';\n\n /**\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2016-2019 (original work) Open Assessment Technologies SA ;\n */\n\n /**\n * @author Jean-Sébastien Conan \n */\n\n /**\n * Sample proxy definition\n * @type {Object}\n */\n var sampleProxy = {\n /**\n * Initializes the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully initialized on resolve.\n * Any error will be provided if rejected.\n */\n init: function init() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // do initialisation\n // once the proxy has been fully initialized notify the success by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n },\n\n /**\n * Uninstalls the proxy\n * @returns {Promise} - Returns a promise. The proxy will be fully uninstalled on resolve.\n * Any error will be provided if rejected.\n */\n destroy: function destroy() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // do uninstall actions\n // once the proxy has been fully uninstalled notify the success by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n },\n\n /**\n * Gets the test definition data\n * @param {Object} config - The config provided to the proxy factory\n * @returns {Promise} - Returns a promise. The test definition data will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestData: function getTestData() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // get the test definition data\n // once the action has been processed notify the success by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n },\n\n /**\n * Gets the test context\n * @returns {Promise} - Returns a promise. The context object will be provided on resolve.\n * Any error will be provided if rejected.\n */\n getTestContext: function getTestContext() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // get the test context object\n // once the action has been processed notify the success by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n },\n\n /**\n * Calls an action related to the test\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callTestAction: function callTestAction() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // call the action\n // once the action has been processed notify the success by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n },\n\n /**\n * Gets an item definition by its URI, also gets its current state\n * @param {String} uri - The URI of the item to get\n * @returns {Promise} - Returns a promise. The item data will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires getItem\n */\n getItem: function getItem() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // get the definition data and the state of the item\n // once the item data is loaded provide the data by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n },\n\n /**\n * Submits the state and the response of a particular item\n * @param {String} uri - The URI of the item to update\n * @param {Object} state - The state to submit\n * @param {Object} response - The response object to submit\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires submitItem\n */\n submitItem: function submitItem() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // submit the state and the response of the item\n // once the data has been processed notify the success by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n },\n\n /**\n * Calls an action related to a particular item\n * @param {String} uri - The URI of the item for which call the action\n * @param {String} action - The name of the action to call\n * @param {Object} [params] - Some optional parameters to join to the call\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n */\n callItemAction: function callItemAction() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // call the action\n // once the action has been processed notify the success by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n },\n\n /**\n * Sends a telemetry signal\n * @param {String} uri - The URI of the item for which sends the telemetry signal\n * @param {String} signal - The name of the signal to send\n * @param {Object} [params] - Some optional parameters to join to the signal\n * @returns {Promise} - Returns a promise. The result of the request will be provided on resolve.\n * Any error will be provided if rejected.\n * @fires telemetry\n */\n telemetry: function telemetry() {\n // the method must return a promise\n return new Promise(function (resolve) {\n // send the signal\n // once the signal has been processed notify the success by resolving the promise\n resolve(); // you can also notify error by rejecting the promise\n // reject(error);\n });\n }\n };\n\n return sampleProxy;\n\n});\n\n","define('taoTests/runner/runnerComponent',['lodash', 'ui/component', 'taoTests/runner/runner', 'taoTests/runner/providerLoader', 'handlebars'], function (_, component, runnerFactory, providerLoader, Handlebars) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n component = component && Object.prototype.hasOwnProperty.call(component, 'default') ? component['default'] : component;\n runnerFactory = runnerFactory && Object.prototype.hasOwnProperty.call(runnerFactory, 'default') ? runnerFactory['default'] : runnerFactory;\n providerLoader = providerLoader && Object.prototype.hasOwnProperty.call(providerLoader, 'default') ? providerLoader['default'] : providerLoader;\n Handlebars = Handlebars && Object.prototype.hasOwnProperty.call(Handlebars, 'default') ? Handlebars['default'] : Handlebars;\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n var Template = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {\n this.compilerInfo = [4,'>= 1.0.0'];\n helpers = this.merge(helpers, Handlebars.helpers); \n\n\n return \"
\\n\";\n });\n function runnerComponentTpl(data, options, asString) {\n var html = Template(data, options);\n return (asString || true) ? html : $(html);\n }\n\n /**\n * Validate required options from the configuration\n * @param {Object} config\n * @returns {Boolean} true if valid\n * @throws {TypeError} in case of validation failure\n */\n\n function validateTestRunnerConfiguration() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var requiredProperties = ['providers', 'options', 'serviceCallId'];\n\n if (_typeof(config) !== 'object') {\n throw new TypeError(\"The runner configuration must be an object, '\".concat(_typeof(config), \"' received\"));\n }\n\n if (requiredProperties.some(function (property) {\n return typeof config[property] === 'undefined';\n })) {\n throw new TypeError(\"The runner configuration must contains at least the following properties : \".concat(requiredProperties.join(',')));\n }\n\n return true;\n }\n /**\n * Get the selected provider if set or infer it from the providers list\n * @param {String} type - the type of provider (runner, communicator, proxy, etc.)\n * @param {Object} config\n * @returns {String} the selected provider for the given type\n */\n\n\n function getSelectedProvider() {\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'runner';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (config.provider && config.provider[type]) {\n return config.provider[type];\n }\n\n if (config.providers && config.providers[type]) {\n var typeProviders = config.providers[type];\n\n if (_typeof(typeProviders) === 'object' && (typeProviders.id || typeProviders.name)) {\n return typeProviders.id || typeProviders.name;\n }\n\n if (Array.isArray(typeProviders) && typeProviders.length > 0) {\n return typeProviders[0].id || typeProviders[0].name;\n }\n }\n\n return false;\n }\n /**\n * Wraps a test runner into a component\n * @param {jQuery|HTMLElement|String} container - The container in which renders the component\n * @param {Object} config - The component configuration options\n * @param {String} config.serviceCallId - The identifier of the test session\n * @param {Object} config.providers\n * @param {Object} config.options\n * @param {Boolean} [config.loadFromBundle=false] - do we load the modules from the bundles\n * @param {Boolean} [config.replace] - When the component is appended to its container, clears the place before\n * @param {Number|String} [config.width] - The width in pixels, or 'auto' to use the container's width\n * @param {Number|String} [config.height] - The height in pixels, or 'auto' to use the container's height\n * @param {Function} [template] - An optional template for the component\n * @returns {runnerComponent}\n */\n\n\n function runnerComponentFactory() {\n var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var template = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : runnerComponentTpl;\n var runner = null;\n var plugins = [];\n\n if (!container) {\n throw new TypeError('A container element must be defined to contain the runnerComponent');\n }\n\n validateTestRunnerConfiguration(config);\n /**\n * @typedef {runner} runnerComponent\n */\n\n var runnerComponent = component({\n /**\n * Gets the option's value\n * @param {String} name - the option key\n * @returns {*}\n */\n getOption: function getOption(name) {\n return this.config.options[name];\n },\n\n /**\n * Gets the test runner\n * @returns {runner}\n */\n getRunner: function getRunner() {\n return runner;\n }\n }).setTemplate(template).on('init', function () {\n var _this = this;\n\n //load the defined providers for the runner, the proxy, the communicator, the plugins, etc.\n return providerLoader(config.providers, config.loadFromBundle).then(function (results) {\n if (results && results.plugins) {\n plugins = results.plugins;\n }\n\n _this.render(container);\n\n _this.hide();\n }).catch(function (err) {\n return _this.trigger('error', err);\n });\n }).on('render', function () {\n var _this2 = this;\n\n var runnerConfig = Object.assign(_.omit(this.config, ['providers']), {\n renderTo: this.getElement()\n });\n runnerConfig.provider = Object.keys(this.config.providers).reduce(function (acc, providerType) {\n if (!acc[providerType] && providerType !== 'plugins') {\n acc[providerType] = getSelectedProvider(providerType, _this2.config);\n }\n\n return acc;\n }, runnerConfig.provider || {});\n runner = runnerFactory(runnerConfig.provider.runner, plugins, runnerConfig).on('ready', function () {\n _.defer(function () {\n _this2.setState('ready').trigger('ready', runner).show();\n });\n }).on('destroy', function () {\n return runner = null;\n }).spread(this, 'error').init();\n }).on('destroy', function () {\n var destroying = runner && runner.destroy();\n runner = null;\n return destroying;\n }).after('destroy', function () {\n this.removeAllListeners();\n });\n return runnerComponent.init(config);\n }\n\n return runnerComponentFactory;\n\n});\n\n","define('taoTests/runner/testStore',['lodash', 'core/store', 'core/logger'], function (_, store, loggerFactory) { 'use strict';\n\n _ = _ && Object.prototype.hasOwnProperty.call(_, 'default') ? _['default'] : _;\n store = store && Object.prototype.hasOwnProperty.call(store, 'default') ? store['default'] : store;\n loggerFactory = loggerFactory && Object.prototype.hasOwnProperty.call(loggerFactory, 'default') ? loggerFactory['default'] : loggerFactory;\n\n /*\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * as published by the Free Software Foundation; under version 2\n * of the License (non-upgradable).\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n *\n * Copyright (c) 2017-2019 (original work) Open Assessment Technologies SA\n *\n */\n /**\n * The test store logger\n * @type {core/logger}\n */\n\n var logger = loggerFactory('taoQtiTest/runner/provider/testStore');\n /**\n * Database name prefix (suffixed by the test identifier)\n * to check if we use the fragmented mode\n * or the unified mode.\n * @type {String[]}\n */\n\n var legacyPrefixes = ['actions-', 'duration-', 'test-probe', 'timer-'];\n /**\n * List the available modes\n */\n\n var modes = {\n unified: 'unified',\n //one db per test, new mode\n fragmented: 'fragmented' //mutliple dbs per test, legacy mode\n\n };\n /**\n * Check and select the store mode.\n * If any of the \"legacyPrefixes\" store is found, we used the fragmented mode\n * otherwise we'll use the unified mode.\n * @param {String} testId\n * @param {Object} [preselectedBackend] - the storage backend\n * @returns {Promise} resolves with the mode of the current test\n */\n\n var selectStoreMode = function selectStoreMode(testId, preselectedBackend) {\n return store.getAll(function validate(storeName) {\n return _.some(legacyPrefixes, function (prefix) {\n return !_.isEmpty(storeName) && prefix + testId === storeName;\n });\n }, preselectedBackend).then(function (foundStores) {\n if (_.isArray(foundStores) && foundStores.length > 0) {\n return modes.fragmented;\n }\n\n return modes.unified;\n });\n };\n /**\n * Get the store for the given test\n *\n * @param {String} testId - unique test instance id\n * @returns {testStore} a 'wrapped' store instance\n * @param {Object} [preselectedBackend] - the storage backend (automatically selected by default)\n * @throws {TypeError} without a testId\n */\n\n\n function testStoreLoader(testId, preselectedBackend) {\n var storeNames = [];\n var volatiles = [];\n var changeTracking = {};\n var testMode;\n /**\n * Is the test using a unified store mode ?\n * @returns {Promise} true if unified\n */\n\n var isStoreModeUnified = function isStoreModeUnified() {\n if (_.isUndefined(testMode)) {\n return selectStoreMode(testId, preselectedBackend).then(function (result) {\n if (result && typeof modes[result] !== 'undefined') {\n testMode = result;\n } else {\n //use the unified mode by default\n testMode = modes.unified;\n }\n\n logger.debug(\"Test store mode \".concat(result, \" for \").concat(testId));\n return result === modes.unified;\n });\n }\n\n return Promise.resolve(testMode === modes.unified);\n };\n\n if (_.isEmpty(testId)) {\n throw new TypeError('The store must be identified with a unique test identifier');\n }\n /**\n * Wraps a store and add the support of \"volatile\" storages\n * @typedef {Object} testStore\n */\n\n\n return {\n /**\n * Get a wrapped store instance, that let's you use multiple stores inside one store...\n * (or in multiple stores if the test is in legacy mode)\n * @param {String} storeName - the name of the sub store\n * @returns {Promise}\n */\n getStore: function getStore(storeName) {\n //call when the current storge has been changed\n //only if the store is set to track changes\n var trackChange = function trackChange() {\n if (_.isBoolean(changeTracking[storeName])) {\n changeTracking[storeName] = true;\n }\n };\n\n if (_.isEmpty(storeName)) {\n throw new TypeError('A store name must be provided to get the store');\n }\n\n if (!_.contains(storeNames, storeName)) {\n storeNames.push(storeName);\n }\n\n return isStoreModeUnified().then(function (isUnified) {\n var loadStore;\n\n if (isUnified) {\n loadStore = store(testId, preselectedBackend);\n } else {\n loadStore = store(\"\".concat(storeName, \"-\").concat(testId), preselectedBackend);\n }\n\n return loadStore.then(function (loadedStore) {\n var keyPattern = new RegExp(\"^\".concat(storeName, \"__\"));\n\n var storeKey = function storeKey(key) {\n return isUnified ? \"\".concat(storeName, \"__\").concat(key) : key;\n };\n /**\n * The wrapped storage\n * @type {Object}\n */\n\n\n return {\n /**\n * Get an item with the given key\n * @param {String} key\n * @returns {Promise<*>} with the result in resolve, undefined if nothing\n */\n getItem: function getItem(key) {\n return loadedStore.getItem(storeKey(key));\n },\n\n /**\n * Get all store items\n * @returns {Promise} with a collection of items\n */\n getItems: function getItems() {\n if (isUnified) {\n return loadedStore.getItems().then(function (entries) {\n return _.transform(entries, function (acc, entry, key) {\n if (keyPattern.test(key)) {\n acc[key.replace(keyPattern, '')] = entry;\n }\n\n return acc;\n }, {});\n });\n } else {\n return loadedStore.getItems();\n }\n },\n\n /**\n * Set an item with the given key\n * @param {String} key - the item key\n * @param {*} value - the item value\n * @returns {Promise} with true in resolve if added/updated\n */\n setItem: function setItem(key, value) {\n trackChange();\n return loadedStore.setItem(storeKey(key), value);\n },\n\n /**\n * Remove an item with the given key\n * @param {String} key - the item key\n * @returns {Promise} with true in resolve if removed\n */\n removeItem: function removeItem(key) {\n trackChange();\n return loadedStore.removeItem(storeKey(key));\n },\n\n /**\n * Clear the current store\n * @returns {Promise} with true in resolve once cleared\n */\n clear: function clear() {\n trackChange();\n\n if (isUnified) {\n return loadedStore.getItems().then(function (entries) {\n _.forEach(entries, function (entry, key) {\n if (keyPattern.test(key)) {\n loadedStore.removeItem(key);\n }\n });\n });\n } else {\n return loadedStore.clear();\n }\n }\n };\n });\n });\n },\n\n /**\n * Define the given store as \"volatile\".\n * It means the store data can be revoked\n * if the user change browser for example\n * @param {String} storeName - the name of the store to set as volatile\n * @returns {testStore} chains\n */\n setVolatile: function setVolatile(storeName) {\n if (!_.contains(volatiles, storeName)) {\n volatiles.push(storeName);\n }\n\n return this;\n },\n\n /**\n * Check the given storeId. If different from the current stored identifier\n * we initiate the invalidation of the volatile data.\n * @param {String} storeId - the id to check\n * @returns {Promise} true if cleared\n */\n clearVolatileIfStoreChange: function clearVolatileIfStoreChange(storeId) {\n var self = this;\n var shouldClear = false;\n return store.getIdentifier(preselectedBackend).then(function (savedStoreId) {\n if (!_.isEmpty(storeId) && !_.isEmpty(savedStoreId) && savedStoreId !== storeId) {\n logger.info(\"Storage change detected (\".concat(savedStoreId, \" != \").concat(storeId, \") => volatiles data wipe out !\"));\n shouldClear = true;\n }\n\n return shouldClear;\n }).then(function (clear) {\n if (clear) {\n return self.clearVolatileStores();\n }\n\n return false;\n });\n },\n\n /**\n * Clear the storages marked as volatile\n * @returns {Promise} true if cleared\n */\n clearVolatileStores: function clearVolatileStores() {\n var self = this;\n var clearing = volatiles.map(function (storeName) {\n return self.getStore(storeName).then(function (storeInstance) {\n return storeInstance.clear();\n });\n });\n return Promise.all(clearing).then(function (results) {\n return results && results.length === volatiles.length;\n });\n },\n\n /**\n * Observe changes on the given store\n *\n * @param {String} storeName - the name of the store to observe\n * @returns {testStore} chains\n */\n startChangeTracking: function startChangeTracking(storeName) {\n changeTracking[storeName] = false;\n return this;\n },\n\n /**\n * Has the store some changes\n *\n * @param {String} storeName - the name of the store to set as volatile\n * @returns {Boolean} true if the given store has some changes\n */\n hasChanges: function hasChanges(storeName) {\n return changeTracking[storeName] === true;\n },\n\n /**\n * Reset the change listening\n *\n * @param {String} storeName - the name of the store\n * @returns {testStore} chains\n */\n resetChanges: function resetChanges(storeName) {\n if (_.isBoolean(changeTracking[storeName])) {\n changeTracking[storeName] = false;\n }\n\n return this;\n },\n\n /**\n * Remove the whole store\n * @returns {Promise} true if done\n */\n remove: function remove() {\n var legacyStoreExp = new RegExp(\"-\".concat(testId, \"$\"));\n return isStoreModeUnified().then(function (isUnified) {\n if (isUnified) {\n return store(testId, preselectedBackend).then(function (storeInstance) {\n return storeInstance.removeStore();\n });\n }\n\n return store.removeAll(function (storeName) {\n return legacyStoreExp.test(storeName);\n }, preselectedBackend);\n });\n },\n\n /**\n * Wraps the identifier retrieval\n * @returns {Promise} the current store id\n */\n getStorageIdentifier: function getStorageIdentifier() {\n return store.getIdentifier(preselectedBackend);\n }\n };\n }\n\n return testStoreLoader;\n\n});\n\n","\ndefine(\"taoTests/loader/taoTestsRunner.bundle\", function(){});\n","define(\"taoTests/loader/taoTestsRunner.min\", [\"taoItems/loader/taoItems.min\"], function(){});\n"]}