expo-file-system
Version:
Provides access to the local file system on the device.
66 lines (55 loc) • 1.55 kB
text/typescript
import type { FileHandle } from './ExpoFileSystem.types';
export class FileSystemReadableStreamSource implements UnderlyingByteSource {
handle: FileHandle;
size: number = 1024;
type = 'bytes' as const;
constructor(handle: FileHandle) {
this.handle = handle;
}
cancel() {
this.handle.close();
}
pull(controller: ReadableByteStreamController) {
const theView = controller.byobRequest?.view;
if (!theView) {
const bytes = this.handle.readBytes(this.size);
if (bytes.length === 0) {
controller.close();
return;
}
controller.enqueue(bytes);
return;
}
// TODO: Optimize by adding a native method that can write into a TypedArray at a given offset.
const bytes = this.handle.readBytes(theView.byteLength - theView.byteOffset);
if (bytes.length === 0) {
controller.close();
controller.byobRequest.respond(0);
return;
}
if (theView instanceof Uint8Array) {
theView.set(bytes, theView.byteOffset);
} else {
const array = new Uint8Array(theView.buffer);
for (let i = 0; i < bytes.length; i++) {
array[i + theView.byteOffset] = bytes[i];
}
}
controller.byobRequest.respond(bytes.length);
}
}
export class FileSystemWritableSink implements UnderlyingSink {
handle: FileHandle;
constructor(handle: FileHandle) {
this.handle = handle;
}
abort() {
this.close();
}
close() {
this.handle.close();
}
write(chunk: Uint8Array) {
this.handle.writeBytes(chunk);
}
}