wasmexec = fetch('https://cdn.jsdelivr.net/gh/golang/go/lib/wasm/wasm_exec.js')
.then(x => x.text()).then(s => {
const body = s.trimEnd().match(/\(\(\)\s*=>\s*{([^]+)}\)\(\);$/)[1]
const fn = new Function(body)
for (let k of ['Go', 'fs', 'process', 'path']) {
delete globalThis[k]
}
fn()
globalThis.process.cwd = () => '/'
const outbufs = {}
const decoder = new TextDecoder('utf-8')
let exitCode = null
globalThis.fs.writeSync = (fd, buf) => {
console.warn('writeSync', fd, buf)
if (!(fd in outbufs)) {
outbufs[fd] = []
}
const dest = outbufs[fd]
dest.push(decoder.decode(buf))
return buf.length
}
const fdtable = [null, null, null]
function enosys() {
const err = new Error('unimp')
err.code = 'ENOSYS'
return err
}
globalThis.fs.open = (path, flags, mode, callback) => {
const desc = {path, flags, mode}
const fd = fdtable.length
fdtable.push(desc)
if (path == '/XXX.ts') {
desc.content = new TextEncoder().encode(TS_SOURCE)
}
callback(null, fd)
}
globalThis.fs.read = (fd, buffer, offset, length, position, callback) => {
if (fdtable[fd]?.content) {
fdtable[fd].offset ??= 0
const slice = fdtable[fd].content.slice(fdtable[fd].offset, fdtable[fd].offset + length)
buffer.set(slice, offset)
fdtable[fd].offset += slice.length
return callback(null, slice.length)
}
callback(enosys())
}
return {
Go: globalThis.Go,
outbufs,
fdtable,
init: () => { fdtable.length = 3; delete outbufs[1]; delete outbufs[2]; delete outbufs[4] },
}
})