summaryrefslogtreecommitdiffstats
path: root/assets/javascript/utils
diff options
context:
space:
mode:
Diffstat (limited to 'assets/javascript/utils')
-rw-r--r--assets/javascript/utils/execute.js91
1 files changed, 91 insertions, 0 deletions
diff --git a/assets/javascript/utils/execute.js b/assets/javascript/utils/execute.js
new file mode 100644
index 0000000..ba4192d
--- /dev/null
+++ b/assets/javascript/utils/execute.js
@@ -0,0 +1,91 @@
+define(function(){
+ var evalJS = function(code, callback) {
+ var ready = false;
+ var finished = false;
+
+ var finish = function() {
+ if(finished) {
+ return console.error('Already finished');
+ }
+ finished = true;
+ return callback.apply(null, arguments);
+ };
+
+ var jsrepl;
+
+ // Handles all our events
+ var eventHandler = function(data, eventType) {
+ console.log([eventType, data]);
+ switch(eventType) {
+ case 'progress':
+ // Update UI loading bar
+ break;
+ case 'timeout':
+ finish(new Error(data));
+ break;
+ case 'result':
+ finish(null, {
+ value: data,
+ type: 'result'
+ });
+ break;
+ case 'error':
+ if(ready) {
+ return finish(null, {
+ value: data,
+ type: 'error'
+ });
+ }
+ return finish(new Error(data));
+ break
+ case 'ready':
+ // We're good to get results and stuff back now
+ ready = true;
+ // Eval our code now that the runtime is ready
+ jsrepl.eval(code);
+ break;
+ default:
+ console.log('Unhandled event =', eventType, 'data =', data);
+ }
+ };
+
+ jsrepl = new JSREPL({
+ input: eventHandler,
+ output: eventHandler,
+ result: eventHandler,
+ error: eventHandler,
+ progress: eventHandler,
+ timeout: {
+ time: 30000,
+ callback: eventHandler
+ }
+ });
+
+ jsrepl.loadLanguage('javascript', eventHandler);
+ };
+
+
+ var ass = "function assert(condition, message) { \nif (!condition) { \n throw message || \"Assertion failed\"; \n } \n }\n";
+
+ var code = {
+ "base": "var firstName = \"John\";\nvar middleName = \"James\";\nvar lastName = \"Smith\";\n\nvar fullName =",
+ "solution": "var firstName = \"John\";\nvar middleName = \"James\";\nvar lastName = \"Smith\";\n\nvar fullName = firstName + \" \" + middleName + \" \" + lastName;",
+ "validation": "console.log(fullName); assert(fullName == 'John James Smith');"
+ };
+
+ var execute = function(solution, validation, callback) {
+ evalJS(solution + ass + validation, function(err, res) {
+ if(err) {
+ return callback(err);
+ }
+ console.log('validation =', res);
+ if (res.type == "error") {
+ callback(new Error(res.value));
+ } else {
+ callback(null, res.value);
+ }
+ });
+ };
+
+ return execute;
+}); \ No newline at end of file