write static method
Streams data into key without holding it in memory. Replaces the entry atomically.
Implementation
static Future<int> write(
String key,
Stream<List<int>> data, {
UStorageBucket bucket = UStorageBucket.support,
Duration? expireIn,
String? mimeType,
Map<String, String>? tags,
UHashAlgorithm? hash,
}) async {
await _ensure();
_writable(bucket);
final String path = _pathFor(bucket, key);
final String staging = "$path.${DateTime.now().microsecondsSinceEpoch}.tmp";
final UStorageSink sink = bucket == UStorageBucket.vault ? await (await vaultKeys).create(staging) : await _backend.open(staging, truncate: true);
final UHasher? hasher = hash == null ? null : UHasher(hash);
int length = 0;
try {
await for (final List<int> chunk in data) {
hasher?.add(chunk);
await sink.writeAt(length, chunk);
length += chunk.length;
}
if (sink is UVaultWriter) await sink.finish(length);
await sink.close();
await _backend.move(staging, path);
} catch (_) {
await sink.close();
await _backend.delete(staging);
rethrow;
}
await _record(key, bucket, length, expireIn: expireIn, mimeType: mimeType, tags: tags, sha256: hash == UHashAlgorithm.sha256 ? hasher?.closeHex() : null);
return length;
}