MCPcopy
hub / github.com/pyodide/pyodide / NodeSocketTransport

Class NodeSocketTransport

src/py/pyodide/_nodesock_transport.py:12–191  ·  view source on GitHub ↗

asyncio Transport backed by a NodeSockFS socket.

Source from the content-addressed store, hash-verified

10
11
12class NodeSocketTransport(asyncio.Transport):
13 """asyncio Transport backed by a NodeSockFS socket."""
14
15 def __init__(
16 self,
17 loop: asyncio.AbstractEventLoop,
18 sock: Any, # socket.socket
19 protocol: asyncio.BaseProtocol,
20 waiter: asyncio.Future[None] | None = None,
21 extra: dict[str, Any] | None = None,
22 ):
23 super().__init__(extra)
24 self._loop = loop
25 self._sock = sock
26 self._sock_fd = sock.fileno()
27 self._protocol = protocol
28 self._closed = False
29 self._paused = True # start paused; resume_reading() will kick off reads
30 self._read_task: asyncio.Task[None] | None = None
31
32 # self._extra is used in `get_extra_info` function.
33 # We just swallow exceptions following the _SelectorTransport implementation in CPython
34 # https://github.com/python/cpython/blob/fbfc6ccb0abf362a0ecdc02cd0aa2d16c1a4ce44/Lib/asyncio/selector_events.py#L780-L787
35 self._extra.setdefault("socket", sock) # type: ignore[attr-defined]
36 try:
37 self._extra.setdefault("sockname", sock.getsockname()) # type: ignore[attr-defined]
38 except Exception:
39 pass
40 try:
41 self._extra.setdefault("peername", sock.getpeername()) # type: ignore[attr-defined]
42 except Exception:
43 pass
44 loop.call_soon(self._protocol.connection_made, self)
45 if waiter is not None:
46 loop.call_soon(self._resolve_waiter, waiter)
47 loop.call_soon(self._start_reading)
48
49 @staticmethod
50 def _resolve_waiter(waiter: asyncio.Future[None]) -> None:
51 if not waiter.done():
52 waiter.set_result(None)
53
54 # ------------------------------------------------------------------
55 # BaseTransport
56 # ------------------------------------------------------------------
57
58 def is_closing(self) -> bool:
59 # We don't separate _closing and _closed state
60 # because the buffer is managed by Node.js not Python
61 # so no drain is handled by Python
62 return self._closed
63
64 def close(self) -> None:
65 self._force_close(None)
66
67 def abort(self) -> None:
68 self._force_close(None)
69

Callers 1

create_connectionMethod · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…