1 from functools import wraps
12 def prepare(g: Generator[O, I, R]) -> Generator[O, I, R]:
17 def w(*args, **kwargs):
18 return prepare(f(*args, **kwargs))
25 def decode(cls) -> Generator[Optional[object], bytes, None]:
30 def encode(self) -> bytes:
40 def __init__(self, buf: bytes) -> None:
44 def underflow(self) -> bytes:
45 return self._buf[self._ptr:]
47 def skip(self, n: int) -> None:
51 ret = self._buf[self._ptr]
55 def u8_array(self, n: int) -> bytes:
56 ret = self._buf[self._ptr:self._ptr + n]
66 def u16_be(self) -> int:
76 ret |= self.u8() << 16
77 ret |= self.u8() << 24
80 def u32_be(self) -> int:
82 ret |= self.u8() << 24
83 ret |= self.u8() << 16
88 def f32(self) -> float:
90 return struct.unpack("<f", self.u8_array(4))[0]
92 def string(self) -> str:
99 return arr.decode(UTF_8)
108 self._buf: List[bytes] = []
111 return b"".join(self._buf)
113 def u8(self, it: int) -> "ByteWriter":
114 self._buf.append(it.to_bytes(1, "little"))
117 def u16(self, it: int) -> "ByteWriter":
118 self._buf.append(it.to_bytes(2, "little"))
121 def u16_be(self, it: int) -> "ByteWriter":
122 self._buf.append(it.to_bytes(2, "big"))
125 def u32(self, it: int) -> "ByteWriter":
126 self._buf.append(it.to_bytes(4, "little"))
129 def u32_be(self, it: int) -> "ByteWriter":
130 self._buf.append(it.to_bytes(4, "big"))
133 def f32(self, it: float) -> "ByteWriter":
135 self._buf.append(struct.pack("<f", it))
138 def string(self, it: str) -> "ByteWriter":
139 self._buf.append(it.encode(UTF_8))
140 self._buf.append(b"\x00")
144 Connection = Tuple[str, int]
146 HEADER = b"\xFF\xFF\xFF\xFF"
149 def infostring_decode(s: str) -> dict:
150 parts = s.split("\\")[1:]
151 pairs = zip(*[iter(parts)] * 2)
155 def infostring_encode(d: dict) -> str:
156 return "".join(f"\\{k}\\{v}" for k, v in d.items())