(self, request: EmscriptenRequest)
| 227 | self.js_worker_ready_promise = js.globalThis.Promise.new(promise_resolver) |
| 228 | |
| 229 | def send(self, request: EmscriptenRequest) -> EmscriptenResponse: |
| 230 | headers = { |
| 231 | k: v for k, v in request.headers.items() if k not in HEADERS_TO_IGNORE |
| 232 | } |
| 233 | |
| 234 | body = request.body |
| 235 | fetch_data = {"headers": headers, "body": to_js(body), "method": request.method} |
| 236 | # start the request off in the worker |
| 237 | timeout = int(1000 * request.timeout) if request.timeout > 0 else None |
| 238 | js_shared_buffer = js.SharedArrayBuffer.new(1048576) |
| 239 | js_int_buffer = js.Int32Array.new(js_shared_buffer) |
| 240 | js_byte_buffer = js.Uint8Array.new(js_shared_buffer, 8) |
| 241 | |
| 242 | js.Atomics.store(js_int_buffer, 0, ERROR_TIMEOUT) |
| 243 | js.Atomics.notify(js_int_buffer, 0) |
| 244 | js_absolute_url = js.URL.new(request.url, js.location).href |
| 245 | self.js_worker.postMessage( |
| 246 | _obj_from_dict( |
| 247 | { |
| 248 | "buffer": js_shared_buffer, |
| 249 | "url": js_absolute_url, |
| 250 | "fetchParams": fetch_data, |
| 251 | } |
| 252 | ) |
| 253 | ) |
| 254 | # wait for the worker to send something |
| 255 | js.Atomics.wait(js_int_buffer, 0, ERROR_TIMEOUT, timeout) |
| 256 | if js_int_buffer[0] == ERROR_TIMEOUT: |
| 257 | raise _TimeoutError( |
| 258 | "Timeout connecting to streaming request", |
| 259 | request=request, |
| 260 | response=None, |
| 261 | ) |
| 262 | elif js_int_buffer[0] == SUCCESS_HEADER: |
| 263 | # got response |
| 264 | # header length is in second int of intBuffer |
| 265 | string_len = js_int_buffer[1] |
| 266 | # decode the rest to a JSON string |
| 267 | js_decoder = js.TextDecoder.new() |
| 268 | # this does a copy (the slice) because decode can't work on shared array |
| 269 | # for some silly reason |
| 270 | json_str = js_decoder.decode(js_byte_buffer.slice(0, string_len)) |
| 271 | # get it as an object |
| 272 | response_obj = json.loads(json_str) |
| 273 | return EmscriptenResponse( |
| 274 | request=request, |
| 275 | status_code=response_obj["status"], |
| 276 | headers=response_obj["headers"], |
| 277 | body=_ReadStream( |
| 278 | js_int_buffer, |
| 279 | js_byte_buffer, |
| 280 | request.timeout, |
| 281 | self.js_worker, |
| 282 | response_obj["connectionID"], |
| 283 | request, |
| 284 | ), |
| 285 | ) |
| 286 | elif js_int_buffer[0] == ERROR_EXCEPTION: |
no test coverage detected