-
Notifications
You must be signed in to change notification settings - Fork 596
/
Copy pathgh-pages-sim.js
124 lines (115 loc) · 3.22 KB
/
gh-pages-sim.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/**
* Loads the compile assets/js/binary.js file and executes it
* in a #simframe iframe
*/
(function () {
var code = "";
var isReady = false;
var simState = {}
var simStateChanged = false
var started = false;
var meta = undefined;
// hide scrollbar
window.scrollTo(0, 1);
// init runtime
initSimState();
fetchCode();
// helpers
function fetchCode() {
sendReq("./assets/js/binary.js", function (c, status) {
if (status != 200)
return;
code = c;
// find metadata
code.replace(/^\/\/\s+meta=([^\n]+)\n/m, function (m, metasrc) {
meta = JSON.parse(metasrc);
})
// load simulator with correct version
document.getElementById("simframe")
.setAttribute("src", meta.simUrl);
})
}
function startSim() {
if (!code || !isReady || started)
return
setState("run");
started = true;
const runMsg = {
type: "run",
parts: [],
code: code,
partDefinitions: {},
cdnUrl: meta.cdnUrl,
version: meta.target,
storedState: simState,
frameCounter: 1,
options: {
"theme": "green",
"player": ""
},
id: "green-" + Math.random()
}
postMessage(runMsg);
}
function stopSim() {
setState("stopped");
postMessage({
type: "stop"
});
started = false;
}
window.addEventListener('message', function (ev) {
var d = ev.data
if (d.type == "ready") {
var loader = document.getElementById("loader");
if (loader)
loader.remove();
isReady = true;
startSim();
} else if (d.type == "simulator") {
switch (d.command) {
case "restart":
stopSim();
startSim();
break;
case "setstate":
simState[d.stateKey] = d.stateValue
simStateChanged = true
break;
}
}
}, false);
// helpers
function setState(st) {
var r = document.getElementById("root");
if (r)
r.setAttribute("data-state", st);
}
function postMessage(msg) {
const frame = document.getElementById("simframe");
if (frame)
frame.contentWindow.postMessage(msg, meta.simUrl);
}
function sendReq(url, cb) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (xhttp.readyState == 4) {
cb(xhttp.responseText, xhttp.status)
}
};
xhttp.open("GET", url, true);
xhttp.send();
}
function initSimState() {
try {
simState = JSON.parse(localStorage["simstate"])
} catch (e) {
simState = {}
}
setInterval(function () {
if (simStateChanged)
localStorage["simstate"] = JSON.stringify(simState)
simStateChanged = false
}, 200)
}
})();