import asyncio import os from asyncio import StreamReader, StreamWriter def rotate_13( s: str ) -> str: ss = '' def f( c: str ) -> str: return chr( ( ord( c ) + 13 - 97 ) % 26 + 97 ) for c in s: ss += f( c ) return ss async def handle_client( reader: StreamReader, writer: StreamWriter ) -> None: while True: data = await reader.read( 10 ) if not data: break response = data.decode( 'utf8' ) print( 'server received', response ) msg = rotate_13( response ) print( 'server sending', msg ) writer.write( msg.encode( 'utf8' ) ) await writer.drain() print( 'closing connection to server' ) writer.close() async def client( msg: str, path: str ) -> str: reader, writer = await asyncio.open_unix_connection( path ) print( "client sending", msg ) writer.write( msg.encode() ) if msg == 'world': await asyncio.sleep( 1 ) data_ = await reader.read( 10 ) data = data_.decode() print( "client received", data ) print( "closing" ) writer.close() return data async def unix_rot( path: str ) -> list[ str ]: server = await asyncio.start_unix_server( handle_client, path ) data = await asyncio.gather( client( 'hello', path ), client( 'world', path ) ) server.close() await server.wait_closed() os.unlink( path ) return list( data )