Skip to content

Commit c29f50b

Browse files
committed
Use shorter field names when serializing file transmission commands to reduce overhead
1 parent d30ba96 commit c29f50b

File tree

1 file changed

+34
-19
lines changed

1 file changed

+34
-19
lines changed

kitty/file_transmission.py

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from kitty.fast_data_types import (
2929
FILE_TRANSFER_CODE, OSC, add_timer, get_boss, get_options
3030
)
31+
from kitty.types import run_once
3132

3233
from .utils import log_error, sanitize_control_codes
3334

@@ -233,24 +234,40 @@ def as_ftc(self, request_id: str) -> 'FileTransmissionCommand':
233234
)
234235

235236

237+
@run_once
238+
def name_to_serialized_map() -> Dict[str, str]:
239+
ans: Dict[str, str] = {}
240+
for k in fields(FileTransmissionCommand):
241+
ans[k.name] = k.metadata.get('sname', k.name)
242+
return ans
243+
244+
245+
@run_once
246+
def serialized_to_field_map() -> Dict[bytes, Field[Any]]:
247+
ans: Dict[bytes, Field[Any]] = {}
248+
for k in fields(FileTransmissionCommand):
249+
ans[k.metadata.get('sname', k.name).encode('ascii')] = k
250+
return ans
251+
252+
236253
@dataclass
237254
class FileTransmissionCommand:
238255

239-
action: Action = Action.invalid
240-
compression: Compression = Compression.none
241-
ftype: FileType = FileType.regular
242-
ttype: TransmissionType = TransmissionType.simple
256+
action: Action = field(default=Action.invalid, metadata={'sname': 'ac'})
257+
compression: Compression = field(default=Compression.none, metadata={'sname': 'zip'})
258+
ftype: FileType = field(default=FileType.regular, metadata={'sname': 'ft'})
259+
ttype: TransmissionType = field(default=TransmissionType.simple, metadata={'sname': 'tt'})
243260
id: str = ''
244-
file_id: str = ''
245-
bypass: str = field(default='', metadata={'base64': True})
246-
quiet: int = 0
247-
mtime: int = -1
248-
permissions: int = -1
249-
size: int = -1
250-
name: str = field(default='', metadata={'base64': True})
251-
status: str = field(default='', metadata={'base64': True})
252-
parent: str = field(default='', metadata={'base64': True})
253-
data: bytes = field(default=b'', repr=False)
261+
file_id: str = field(default='', metadata={'sname': 'fid'})
262+
bypass: str = field(default='', metadata={'base64': True, 'sname': 'pw'})
263+
quiet: int = field(default=0, metadata={'sname': 'q'})
264+
mtime: int = field(default=-1, metadata={'sname': 'mod'})
265+
permissions: int = field(default=-1, metadata={'sname': 'prm'})
266+
size: int = field(default=-1, metadata={'sname': 'sz'})
267+
name: str = field(default='', metadata={'base64': True, 'sname': 'n'})
268+
status: str = field(default='', metadata={'base64': True, 'sname': 'st'})
269+
parent: str = field(default='', metadata={'base64': True, 'sname': 'pr'})
270+
data: bytes = field(default=b'', repr=False, metadata={'sname': 'd'})
254271

255272
def __repr__(self) -> str:
256273
ans = []
@@ -274,6 +291,7 @@ def asdict(self, keep_defaults: bool = False) -> Dict[str, Union[str, int, bytes
274291
return ans
275292

276293
def get_serialized_fields(self, prefix_with_osc_code: bool = False) -> Iterator[Union[str, bytes]]:
294+
nts = name_to_serialized_map()
277295
found = False
278296
if prefix_with_osc_code:
279297
yield ftc_prefix
@@ -288,7 +306,7 @@ def get_serialized_fields(self, prefix_with_osc_code: bool = False) -> Iterator[
288306
yield ';'
289307
else:
290308
found = True
291-
yield name
309+
yield nts[name]
292310
yield '='
293311
if issubclass(k.type, Enum):
294312
yield val.name
@@ -310,10 +328,7 @@ def serialize(self, prefix_with_osc_code: bool = False) -> str:
310328
@classmethod
311329
def deserialize(cls, data: Union[str, bytes, memoryview]) -> 'FileTransmissionCommand':
312330
ans = FileTransmissionCommand()
313-
fmap: Dict[bytes, 'Field[Union[str, int, bytes, Enum]]'] = getattr(cls, 'fmap', None)
314-
if not fmap:
315-
fmap = {k.name.encode('ascii'): k for k in fields(cls)}
316-
setattr(cls, 'fmap', fmap)
331+
fmap = serialized_to_field_map()
317332
from kittens.transfer.rsync import decode_utf8_buffer, parse_ftc
318333

319334
def handle_item(key: memoryview, val: memoryview, has_semicolons: bool) -> None:

0 commit comments

Comments
 (0)