From ff8aa7bff3093831c0fcace64d8559929f08fe3d Mon Sep 17 00:00:00 2001 From: lukasIO Date: Fri, 17 Jan 2025 19:15:29 +0100 Subject: [PATCH] bump rust-ffi and split utf8 string properly --- livekit-rtc/livekit/rtc/_utils.py | 12 +++++++++ livekit-rtc/livekit/rtc/participant.py | 35 +++++++++++++++++++++++++- livekit-rtc/rust-sdks | 2 +- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/livekit-rtc/livekit/rtc/_utils.py b/livekit-rtc/livekit/rtc/_utils.py index a5231e71..c7fbc092 100644 --- a/livekit-rtc/livekit/rtc/_utils.py +++ b/livekit-rtc/livekit/rtc/_utils.py @@ -130,3 +130,15 @@ def generate_random_base62(length=12): """ global _base62_characters return "".join(random.choice(_base62_characters) for _ in range(length)) + + +# adapted from https://stackoverflow.com/a/6043797 +def split_utf8(s: str, n: int): + """Split UTF-8 s into chunks of maximum length n.""" + while len(s) > n: + k = n + while (ord(s[k]) & 0xC0) == 0x80: + k -= 1 + yield s[:k] + s = s[k:] + yield s diff --git a/livekit-rtc/livekit/rtc/participant.py b/livekit-rtc/livekit/rtc/participant.py index 63f4945d..601899f6 100644 --- a/livekit-rtc/livekit/rtc/participant.py +++ b/livekit-rtc/livekit/rtc/participant.py @@ -32,7 +32,7 @@ from ._proto.room_pb2 import ( TranscriptionSegment as ProtoTranscriptionSegment, ) -from ._utils import BroadcastQueue +from ._utils import BroadcastQueue, split_utf8 from .track import LocalTrack from .track_publication import ( LocalTrackPublication, @@ -555,19 +555,48 @@ async def stream_text( topic: str = "", extensions: Dict[str, str] = {}, reply_to_id: str | None = None, + total_size: int | None = None, ) -> TextStreamWriter: + """ + Returns a TextStreamWriter that allows to write individual chunks of text to a text stream. + In most cases where you want to simply send a text message use send_text() instead. + """ writer = TextStreamWriter( self, topic=topic, extensions=extensions, reply_to_id=reply_to_id, destination_identities=destination_identities, + total_size=total_size, ) await writer._send_header() return writer + async def send_text( + self, + text: str, + destination_identities: List[str] = [], + topic: str = "", + extensions: Dict[str, str] = {}, + reply_to_id: str | None = None, + ): + total_size = len(text.encode()) + writer = await self.stream_text( + destination_identities=destination_identities, + topic=topic, + extensions=extensions, + reply_to_id=reply_to_id, + total_size=total_size, + ) + + for chunk in split_utf8(text, STREAM_CHUNK_SIZE): + await writer.write(chunk) + await writer.close() + + return writer.info + async def stream_file( self, file_name: str, @@ -577,6 +606,10 @@ async def stream_file( stream_id: str | None = None, destination_identities: List[str] = [], ) -> FileStreamWriter: + """ + Returns a FileStreamWriter that allows to write individual chunks of bytes to a file stream. + In cases where you want to simply send a file from the file system use send_file() instead. + """ writer = FileStreamWriter( self, file_name=file_name, diff --git a/livekit-rtc/rust-sdks b/livekit-rtc/rust-sdks index 3eb79a73..b41861c7 160000 --- a/livekit-rtc/rust-sdks +++ b/livekit-rtc/rust-sdks @@ -1 +1 @@ -Subproject commit 3eb79a736ac190da29e78797482abf583be9d21a +Subproject commit b41861c7b71762d5d85b3de07ae67ffcae7c3fa2