-
Notifications
You must be signed in to change notification settings - Fork 0
/
minnojs.pavlovia.plugin.min.js
1 lines (1 loc) · 6.54 KB
/
minnojs.pavlovia.plugin.min.js
1
define(function(){var version="3.0.0";var _config={};var _serverMsg={};function Pavlovia(){_init();var logger={type:"csv",send:function(name,serialized,settings,ctx){return _finish(serialized)}};var finish={type:"postCsv"};return{logger:logger,finish:finish}}return Pavlovia;function xhr(options){return new Promise(function(resolve,reject){var request=new XMLHttpRequest;request.open(options.method||"POST",options.url,true);request.setRequestHeader("Content-Type",options.contentType||"application/json; charset=UTF-8");request.onreadystatechange=function(){if(request.readyState===4){if(request.status>=200&&request.status<400)resolve(request.responseText);else reject(new Error('Failed sending to: "'+options.url+'". '+request.statusText+" ("+request.status+")"))}};request.send(options.body)})}function _init(configURL){if(arguments.length<1)configURL="config.json";return _configure(configURL).then(function(response){_config=response;_log("init | _configure.response=",response);return _openSession()}).then(function(response){_log("init | _openSession.response=",response)}).catch(function(err){console.error("init | failed",err)})}function _finish(data){return _save(data).then(function(response){_log("finish | _save.response=",response);return _closeSession(true,false)}).then(function(response){_log("finish | _closeSession.response=",response)}).catch(function(err){console.error("finish | failed",err)})}function _configure(configURL){var response={origin:"_configure",context:"when configuring the plugin"};return _getConfiguration(configURL).then(function(config){if(!("experiment"in config))throw"missing experiment block in configuration";if(!("name"in config.experiment))throw"missing name in experiment block in configuration";if(!("fullpath"in config.experiment))throw"missing fullpath in experiment block in configuration";if(!("pavlovia"in config))throw"missing pavlovia block in configuration";if(!("URL"in config.pavlovia))throw"missing URL in pavlovia block in configuration";var urlQuery=window.location.search.slice(1);var urlParameters=new URLSearchParams(urlQuery);urlParameters.forEach((value,key)=>{if(key.indexOf("__")===0)_serverMsg[key]=value});return config}).catch(function(err){throw Object.assign({error:err},response)})}function _getConfiguration(configURL){var response={origin:"_getConfiguration",context:"when reading the configuration file: "+configURL};return xhr({url:configURL,method:"get"}).then(JSON.parse).catch(function(err){return{error:err}}).then(function(config){return Object.assign(response,config)})}function _openSession(){var url=_config.pavlovia.URL+"/api/v2/experiments/"+encodeURIComponent(_config.experiment.fullpath)+"/sessions";var response={origin:"_openSession",context:"when opening a session for experiment: "+_config.experiment.fullpath};var formData=null;if("__pilotToken"in _serverMsg)formData="pilotToken="+encodeURIComponent(_serverMsg.__pilotToken);return xhr({url:url,method:"post",body:formData,contentType:"application/x-www-form-urlencoded"}).then(JSON.parse).then(function(data){console.log(data);if(!("token"in data)){reject(Object.assign(response,{error:"unexpected answer from server: no token"}))}if(!("experiment"in data)){reject(Object.assign(response,{error:"unexpected answer from server: no experiment"}))}_config.session={token:data.token,status:"OPEN"};_config.experiment.status=data.experiment.status2;_config.experiment.saveFormat=data.experiment.saveFormat;_config.experiment.saveIncompleteResults=data.experiment.saveIncompleteResults;_config.experiment.license=data.experiment.license;_config.runMode=data.experiment.runMode;return Object.assign(response,{token:data.token,status:data.status})}).catch(function(err){console.error("error: ",err.error);return Promise.reject(Object.assign(response,{error:err}))})}function _closeSession(isCompleted,sync){if(arguments.length<1)isCompleted=true;if(arguments.length<2)sync=false;var response={origin:"_closeSession",context:"when closing the session for experiment: "+_config.experiment.fullpath};var url=_config.pavlovia.URL+"/api/v2/experiments/"+encodeURIComponent(_config.experiment.fullpath)+"/sessions/"+_config.session.token;if(sync&&navigator.sendBeacon){var formData=new FormData;formData.append("isCompleted",isCompleted);navigator.sendBeacon(url+"/delete",formData);_config.session.status="CLOSED";return Promise.resolved(response)}var body="isCompleted="+isCompleted;return xhr({url:url,method:"delete",body:body,contentType:"application/x-www-form-urlencoded"}).then(JSON.parse).then(function(data){_config.session.status="CLOSED";return Object.assign(response,{data:data})}).catch(function(err){console.error("error: ",err.error);return Promise.reject(Object.assign(response,{error:err}))})}function _save(data,sync){if(arguments.length<2)sync=false;var date=new Date;var dateString=date.getFullYear()+"-"+("0"+(1+date.getMonth())).slice(-2)+"-"+("0"+date.getDate()).slice(-2)+"_";dateString+=("0"+date.getHours()).slice(-2)+"h"+("0"+date.getMinutes()).slice(-2)+"."+("0"+date.getSeconds()).slice(-2)+"."+date.getMilliseconds();var key=_config.experiment.name+"_"+"SESSION"+"_"+dateString+".csv";if(_config.experiment.status==="RUNNING"&&!_serverMsg.__pilotToken)return _uploadData(key,data,sync);_offerDataForDownload(key,data,"text/csv");return Promise.resolve({origin:"_save",context:"when saving results for experiment: "+_config.experiment.fullpath,message:"offered the .csv file for download"})}function _uploadData(key,value,sync=false){var url=_config.pavlovia.URL+"/api/v2/experiments/"+encodeURIComponent(_config.experiment.fullpath)+"/sessions/"+_config.session.token+"/results";var response={origin:"_uploadData",context:"when uploading participant' results for experiment: "+_config.experiment.fullpath};if(sync&&navigator.sendBeacon){var formData=new FormData;formData.append("key",key);formData.append("value",value);navigator.sendBeacon(url,formData);return}var formKey="key="+encodeURIComponent(key);var formValue="value="+encodeURIComponent(value);var body=formKey+"&"+formValue;return xhr({url:url,method:"post",body:body,contentType:"application/x-www-form-urlencoded"}).then(JSON.parse).catch(function(err){return{error:err}}).then(function(serverData){return Object.assign(response,serverData)})}function _log(a,b){console.log("[pavlovia "+version+"]",a,b)}function _offerDataForDownload(filename,data,type){var blob=new Blob([data],{type:type});if(window.navigator.msSaveOrOpenBlob)window.navigator.msSaveBlob(blob,filename);else{var elem=window.document.createElement("a");elem.href=window.URL.createObjectURL(blob);elem.download=filename;document.body.appendChild(elem);elem.click();document.body.removeChild(elem)}}});