uploadStream method
Implementation
Future<void> uploadStream(
String path,
Stream<Uint8List> chunks, {
bool overwrite = false,
int chunkSize = 64 * 1024,
int? size,
String? name,
String? mimeType,
}) async {
final resolvedName = _defaultUploadName(path, name: name);
final input = _StorageUploadInputStream(
path: path,
overwrite: overwrite,
chunks: chunks,
chunkSize: chunkSize,
size: size,
name: resolvedName,
mimeType: _defaultUploadMimeType(resolvedName, mimeType: mimeType),
);
final output = await room.invoke(toolkit: "storage", tool: "upload", input: ToolStreamInput(input.inputStream()));
if (output is! ToolStreamOutput) {
input.close();
throw _unexpectedResponseError("upload");
}
try {
await for (final chunk in output.stream) {
if (chunk is ErrorContent) {
throw RoomServerException(chunk.text, code: chunk.code);
}
if (chunk is ControlContent) {
if (chunk.method == "close") {
return;
}
throw _unexpectedResponseError("upload");
}
if (chunk is! BinaryContent || chunk.headers["kind"] != "pull") {
throw _unexpectedResponseError("upload");
}
final rawChunkSize = chunk.headers["chunk_size"];
input.requestNext(rawChunkSize is int && rawChunkSize > 0 ? rawChunkSize : null);
}
} finally {
input.close();
}
}