streamBytes method

Future<ByteStreamWriter> streamBytes(
  1. StreamBytesOptions? options
)

Implementation

Future<ByteStreamWriter> streamBytes(StreamBytesOptions? options) async {
  final streamId = options?.streamId ?? Uuid().v4();
  final timestamp = DateTime.timestamp().millisecondsSinceEpoch;

  final info = ByteStreamInfo(
    name: options?.name ?? 'unknown',
    id: streamId,
    mimeType: options?.mimeType ?? 'application/octet-stream',
    timestamp: timestamp,
    topic: options?.topic ?? '',
    size: options?.totalSize ?? 0,
    attributes: options?.attributes ?? {},
    sendingParticipantIdentity: identity,
  );

  final header = lk_models.DataStream_Header(
    totalLength: Int64(info.size),
    mimeType: info.mimeType,
    streamId: streamId,
    topic: options?.topic,
    encryptionType: options?.encryptionType,
    timestamp: Int64(timestamp),
    byteHeader: lk_models.DataStream_ByteHeader(
      name: info.name,
    ),
    attributes: options?.attributes.entries,
  );

  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<Uint8List>(
    destinationIdentities: destinationIdentities,
    streamId: streamId,
    engine: room.engine,
  );

  onEngineClose() async {
    await writableStream.close();
  }

  final cancelFun = room.engine.events.once<EngineClosingEvent>((_) => onEngineClose);

  final byteWriter = ByteStreamWriter(
    writableStream: writableStream,
    info: info,
    onClose: cancelFun,
  );

  return byteWriter;
}