17db96d56Sopenharmony_ciclass StdinBuffer {
27db96d56Sopenharmony_ci    constructor() {
37db96d56Sopenharmony_ci        this.sab = new SharedArrayBuffer(128 * Int32Array.BYTES_PER_ELEMENT)
47db96d56Sopenharmony_ci        this.buffer = new Int32Array(this.sab)
57db96d56Sopenharmony_ci        this.readIndex = 1;
67db96d56Sopenharmony_ci        this.numberOfCharacters = 0;
77db96d56Sopenharmony_ci        this.sentNull = true
87db96d56Sopenharmony_ci    }
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci    prompt() {
117db96d56Sopenharmony_ci        this.readIndex = 1
127db96d56Sopenharmony_ci        Atomics.store(this.buffer, 0, -1)
137db96d56Sopenharmony_ci        postMessage({
147db96d56Sopenharmony_ci            type: 'stdin',
157db96d56Sopenharmony_ci            buffer: this.sab
167db96d56Sopenharmony_ci        })
177db96d56Sopenharmony_ci        Atomics.wait(this.buffer, 0, -1)
187db96d56Sopenharmony_ci        this.numberOfCharacters = this.buffer[0]
197db96d56Sopenharmony_ci    }
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci    stdin = () => {
227db96d56Sopenharmony_ci        if (this.numberOfCharacters + 1 === this.readIndex) {
237db96d56Sopenharmony_ci            if (!this.sentNull) {
247db96d56Sopenharmony_ci                // Must return null once to indicate we're done for now.
257db96d56Sopenharmony_ci                this.sentNull = true
267db96d56Sopenharmony_ci                return null
277db96d56Sopenharmony_ci            }
287db96d56Sopenharmony_ci            this.sentNull = false
297db96d56Sopenharmony_ci            this.prompt()
307db96d56Sopenharmony_ci        }
317db96d56Sopenharmony_ci        const char = this.buffer[this.readIndex]
327db96d56Sopenharmony_ci        this.readIndex += 1
337db96d56Sopenharmony_ci        // How do I send an EOF??
347db96d56Sopenharmony_ci        return char
357db96d56Sopenharmony_ci    }
367db96d56Sopenharmony_ci}
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ciconst stdout = (charCode) => {
397db96d56Sopenharmony_ci    if (charCode) {
407db96d56Sopenharmony_ci        postMessage({
417db96d56Sopenharmony_ci            type: 'stdout',
427db96d56Sopenharmony_ci            stdout: charCode,
437db96d56Sopenharmony_ci        })
447db96d56Sopenharmony_ci    } else {
457db96d56Sopenharmony_ci        console.log(typeof charCode, charCode)
467db96d56Sopenharmony_ci    }
477db96d56Sopenharmony_ci}
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ciconst stderr = (charCode) => {
507db96d56Sopenharmony_ci    if (charCode) {
517db96d56Sopenharmony_ci        postMessage({
527db96d56Sopenharmony_ci            type: 'stderr',
537db96d56Sopenharmony_ci            stderr: charCode,
547db96d56Sopenharmony_ci        })
557db96d56Sopenharmony_ci    } else {
567db96d56Sopenharmony_ci        console.log(typeof charCode, charCode)
577db96d56Sopenharmony_ci    }
587db96d56Sopenharmony_ci}
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ciconst stdinBuffer = new StdinBuffer()
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_civar Module = {
637db96d56Sopenharmony_ci    noInitialRun: true,
647db96d56Sopenharmony_ci    stdin: stdinBuffer.stdin,
657db96d56Sopenharmony_ci    stdout: stdout,
667db96d56Sopenharmony_ci    stderr: stderr,
677db96d56Sopenharmony_ci    onRuntimeInitialized: () => {
687db96d56Sopenharmony_ci        postMessage({type: 'ready', stdinBuffer: stdinBuffer.sab})
697db96d56Sopenharmony_ci    }
707db96d56Sopenharmony_ci}
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_cionmessage = (event) => {
737db96d56Sopenharmony_ci    if (event.data.type === 'run') {
747db96d56Sopenharmony_ci        // TODO: Set up files from event.data.files
757db96d56Sopenharmony_ci        const ret = callMain(event.data.args)
767db96d56Sopenharmony_ci        postMessage({
777db96d56Sopenharmony_ci            type: 'finished',
787db96d56Sopenharmony_ci            returnCode: ret
797db96d56Sopenharmony_ci        })
807db96d56Sopenharmony_ci    }
817db96d56Sopenharmony_ci}
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ciimportScripts('python.js')
84