Implementation
Future<TextStreamWriter> streamText(StreamTextOptions? options) async {
final streamId = options?.streamId ?? Uuid().v4();
final timestamp = DateTime.timestamp().millisecondsSinceEpoch;
final info = TextStreamInfo(
id: streamId,
mimeType: 'text/plain',
timestamp: timestamp,
topic: options?.topic ?? '',
size: options?.totalSize ?? 0,
replyToStreamId: options?.replyToStreamId,
attachedStreamIds: options?.attachedStreamIds ?? [],
version: options?.version,
generated: options?.generated ?? false,
operationType: options?.type,
sendingParticipantIdentity: identity,
);
final header = lk_models.DataStream_Header(
streamId: streamId,
mimeType: info.mimeType,
topic: info.topic,
timestamp: Int64(timestamp),
totalLength: Int64(options?.totalSize ?? 0),
attributes: options?.attributes.entries,
textHeader: lk_models.DataStream_TextHeader(
version: options?.version,
attachedStreamIds: options?.attachedStreamIds,
replyToStreamId: options?.replyToStreamId,
generated: options?.generated ?? false,
operationType: options?.type?.toPBType(),
),
);
final destinationIdentities = options?.destinationIdentities;
final packet = lk_models.DataPacket(
kind: lk_models.DataPacket_Kind.RELIABLE,
destinationIdentities: destinationIdentities,
streamHeader: header,
);
await room.engine.sendDataPacket(packet, reliability: Reliability.reliable);
final writableStream =
WritableStream<String>(destinationIdentities: destinationIdentities!, engine: room.engine, streamId: streamId);
onEngineClose() async {
await writableStream.close();
}
final cancelFun = room.engine.events.once<EngineClosingEvent>((_) => onEngineClose);
final writer = TextStreamWriter(writableStream: writableStream, info: info, onClose: cancelFun);
return writer;
}