readBlob method

  1. @override
Future<BlobReadResult?> readBlob(
  1. BlobReadRequest request
)
override

Stream blob bytes; return null when missing.

Implementation

@override
Future<BlobReadResult?> readBlob(BlobReadRequest request) async {
  _ensureOpen();
  final collectionMap = _storage[request.collection];
  if (collectionMap == null) {
    return null;
  }
  final entry = collectionMap[request.id];
  if (entry == null) {
    return null;
  }

  Uint8List payload;
  int? rangeStart;
  int? rangeEnd;

  if (request.rangeStart != null || request.rangeEnd != null) {
    final start = request.rangeStart ?? 0;
    final end = request.rangeEnd;
    if (start < 0 || (end != null && end <= start)) {
      return null;
    }
    rangeStart = start;
    rangeEnd = end;

    final actualEnd = end != null
        ? min(end, entry.payload.length)
        : entry.payload.length;
    if (start >= entry.payload.length) {
      payload = Uint8List(0);
    } else {
      payload = Uint8List.sublistView(entry.payload, start, actualEnd);
    }
  } else {
    payload = entry.payload;
  }

  return BlobReadResult(
    descriptor: entry.descriptor,
    bytes: _chunkedPayload(payload),
    rangeStart: rangeStart,
    rangeEnd: rangeEnd,
  );
}