32 lines
851 B
JavaScript
32 lines
851 B
JavaScript
import { BaseSource } from './basesource.js';
|
|
|
|
class FileReaderSource extends BaseSource {
|
|
constructor(file) {
|
|
super();
|
|
this.file = file;
|
|
}
|
|
|
|
async fetchSlice(slice, signal) {
|
|
return new Promise((resolve, reject) => {
|
|
const blob = this.file.slice(slice.offset, slice.offset + slice.length);
|
|
const reader = new FileReader();
|
|
reader.onload = (event) => resolve(event.target.result);
|
|
reader.onerror = reject;
|
|
reader.onabort = reject;
|
|
reader.readAsArrayBuffer(blob);
|
|
|
|
if (signal) {
|
|
signal.addEventListener('abort', () => reader.abort());
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create a new source from a given file/blob.
|
|
* @param {Blob} file The file or blob to read from.
|
|
* @returns The constructed source
|
|
*/
|
|
export function makeFileReaderSource(file) {
|
|
return new FileReaderSource(file);
|
|
}
|