write static method

Future<int> write(
  1. String key,
  2. Stream<List<int>> data, {
  3. UStorageBucket bucket = UStorageBucket.support,
  4. Duration? expireIn,
  5. String? mimeType,
  6. Map<String, String>? tags,
  7. UHashAlgorithm? hash,
})

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;
}