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