streamCallWithBuffer function

StreamBufferFetchResult? streamCallWithBuffer(
  1. StreamBufferCallback fn, {
  2. int? maxSize,
  3. int? initialSize,
})

Like callWithBuffer for stream fetch callbacks that also return hasMore.

Implementation

StreamBufferFetchResult? streamCallWithBuffer(
  StreamBufferCallback fn, {
  int? maxSize,
  int? initialSize,
}) {
  final limit = maxSize ?? maxBufferSize;
  var size = initialSize ?? initialBufferSize;
  while (size <= limit) {
    final buf = malloc<ffi.Uint8>(size);
    final outWritten = malloc<ffi.Uint32>()..value = 0;
    final hasMore = malloc<ffi.Uint8>()..value = 0;
    try {
      final code = fn(buf, size, outWritten, hasMore);
      if (code == 0) {
        final n = outWritten.value;
        final more = hasMore.value != 0;
        malloc
          ..free(outWritten)
          ..free(hasMore);
        final data = n > 0
            ? materializeFfiBytes(
                buf,
                n,
                transferOwnership: true,
                allowZeroCopy: isZeroCopyResultBufferAvailable,
              )
            : null;
        return StreamBufferFetchResult(data: data, hasMore: more);
      }
      if (code == -2) {
        final requested = outWritten.value;
        malloc
          ..free(buf)
          ..free(outWritten)
          ..free(hasMore);
        size = requested > size ? requested : size * 2;
        continue;
      }
      malloc
        ..free(buf)
        ..free(outWritten)
        ..free(hasMore);
      return null;
    } on Object {
      malloc
        ..free(buf)
        ..free(outWritten)
        ..free(hasMore);
      rethrow;
    }
  }
  return null;
}