| 134 | |
| 135 | |
| 136 | class NodeDriver: |
| 137 | import subprocess |
| 138 | |
| 139 | def __init__(self, hostname, port): |
| 140 | self.process = subprocess.Popen( |
| 141 | [shutil.which("script"), "-c", shutil.which("node")], |
| 142 | stdin=subprocess.PIPE, |
| 143 | shell=False, |
| 144 | bufsize=0, |
| 145 | ) |
| 146 | print(self.process) |
| 147 | time.sleep(0.1) # wait for node to start |
| 148 | self.hostname = hostname |
| 149 | self.port = port |
| 150 | self.last_ret_code = None |
| 151 | |
| 152 | def load_pyodide(self, dist_dir): |
| 153 | self.execute_js( |
| 154 | f""" |
| 155 | const {{ loadPyodide }} = require('{dist_dir}/pyodide.js'); |
| 156 | let pyodide = await loadPyodide(); |
| 157 | """ |
| 158 | ) |
| 159 | |
| 160 | def clear_logs(self): |
| 161 | pass # we don't handle logs for node |
| 162 | |
| 163 | def write_stdin(self, buffer): |
| 164 | # because we use unbuffered IO for |
| 165 | # stdout, stdin.write is also unbuffered |
| 166 | # so might under-run on writes |
| 167 | while len(buffer) > 0 and self.process.poll() is None: |
| 168 | written = self.process.stdin.write(buffer) |
| 169 | if written == len(buffer): |
| 170 | break |
| 171 | elif written == 0: |
| 172 | # full buffer - wait |
| 173 | time.sleep(0.01) |
| 174 | else: |
| 175 | buffer = buffer[written:] |
| 176 | |
| 177 | def execute_js(self, code, wait_for_terminate=True): |
| 178 | self.write_stdin((code + "\n").encode("utf-8")) |
| 179 | |
| 180 | def load_arrow(self): |
| 181 | self.execute_js(f"await pyodide.loadPackage('{PYARROW_WHEEL_PATH}');") |
| 182 | |
| 183 | def execute_python(self, code, wait_for_terminate=True): |
| 184 | js_code = f""" |
| 185 | python = `{code}`; |
| 186 | await pyodide.loadPackagesFromImports(python); |
| 187 | python_output = await pyodide.runPythonAsync(python); |
| 188 | """ |
| 189 | self.last_ret_code = self.execute_js(js_code, wait_for_terminate) |
| 190 | return self.last_ret_code |
| 191 | |
| 192 | def wait_for_done(self): |
| 193 | # in node we just let it run above |
no outgoing calls
no test coverage detected