package peergos.shared.user.fs;
import jsinterop.annotations.*;
import java.util.concurrent.*;
@JsType
public interface AsyncReader extends AutoCloseable {
CompletableFuture<AsyncReader> seek(int high32, int low32);
/**
*
* @param res array to store data in
* @param offset initial index to store data in res
* @param length number of bytes to read
* @return number of bytes read
*/
CompletableFuture<Integer> readIntoArray(byte[] res, int offset, int length);
/**
* reset to original starting position
* @return
*/
CompletableFuture<AsyncReader> reset();
/**
* Close and dispose of any resources
*/
void close();
class ArrayBacked implements AsyncReader {
private final byte[] data;
private int index = 0;
public ArrayBacked(byte[] data) {
this.data = data;
}
@Override
public CompletableFuture<AsyncReader> seek(int high32, int low32) {
if (high32 != 0)
throw new IllegalArgumentException("Cannot have arrays larger than 4GiB!");
index += low32;
return CompletableFuture.completedFuture(this);
}
@Override
public CompletableFuture<Integer> readIntoArray(byte[] res, int offset, int length) {
System.arraycopy(data, index, res, offset, length);
index += length;
return CompletableFuture.completedFuture(length);
}
@Override
public CompletableFuture<AsyncReader> reset() {
index = 0;
return CompletableFuture.completedFuture(this);
}
@Override
public void close() {
}
}
}