feat: code sandbox

[deploy]
This commit is contained in:
2023-08-01 02:09:27 +02:00
parent 4cc9462655
commit aa1d4787f5
8 changed files with 445 additions and 0 deletions

42
static/sandbox.html Normal file
View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<title>iFrame Sandbox</title>
<script>
let ongoingRequest
let resolveRequest
let source
async function post(channel, args) {
while (ongoingRequest) {
await ongoingRequest
}
ongoingRequest = new Promise(resolve => {
resolveRequest = resolve
source.postMessage([channel, args], "*")
})
ongoingRequest.then(() => {
ongoingRequest = undefined
})
return ongoingRequest
}
window.addEventListener('message', event => {
if ("response" in event.data) {
resolveRequest(event.data.response)
} else {
source = event.source
var Action = event.data.actionCodes
Object.assign(Action, Object.fromEntries(Object.values(event.data.actionCodes).filter(it => !!it.id).map(it => [it.id, it])))
var Chara = {}
for (const fn of event.data.charaChannels) {
Chara[fn] = (...args) => post(fn, args)
}
eval(`(async function(){${event.data.script}})()`)
}
})
</script>
</head>
</html>