mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	This is useful for implementing proper `input()`. It requires the JavaScript engine to support the wasm JSPI spec which is now stage 4. It is supported on Chrome since version 137 and on Firefox and node behind a flag. We override the `__wasi_fd_read()` syscall with our own variant that checks for a readAsync operation. If it has it, we use our own async variant of `fd_read()`, otherwise we use the original `fd_read()`. We also add a variant of `FS.createDevice()` called `FS.createAsyncInputDevice()`. Finally, if JSPI is available, we wrap the `main()` symbol with `WebAssembly.promising()` so that we can stack switch from `fd_read()`. If JSPI is not available, attempting to read from an AsyncInputDevice will raise an `OSError`.
		
			
				
	
	
		
			25 lines
		
	
	
	
		
			849 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			25 lines
		
	
	
	
		
			849 B
		
	
	
	
		
			Python
		
	
	
	
	
	
import unittest
 | 
						|
from test.support import is_emscripten
 | 
						|
 | 
						|
if not is_emscripten:
 | 
						|
    raise unittest.SkipTest("Emscripten-only test")
 | 
						|
 | 
						|
from _testinternalcapi import emscripten_set_up_async_input_device
 | 
						|
from pathlib import Path
 | 
						|
 | 
						|
 | 
						|
class EmscriptenAsyncInputDeviceTest(unittest.TestCase):
 | 
						|
    def test_emscripten_async_input_device(self):
 | 
						|
        jspi_supported = emscripten_set_up_async_input_device()
 | 
						|
        p = Path("/dev/blah")
 | 
						|
        self.addCleanup(p.unlink)
 | 
						|
        if not jspi_supported:
 | 
						|
            with open(p, "r") as f:
 | 
						|
                self.assertRaises(OSError, f.readline)
 | 
						|
            return
 | 
						|
 | 
						|
        with open(p, "r") as f:
 | 
						|
            for _ in range(10):
 | 
						|
                self.assertEqual(f.readline().strip(), "ab")
 | 
						|
                self.assertEqual(f.readline().strip(), "fi")
 | 
						|
                self.assertEqual(f.readline().strip(), "xy")
 |