| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import fs from 'fs';
- import { BaseSource } from './basesource.js';
- function closeAsync(fd) {
- return new Promise((resolve, reject) => {
- fs.close(fd, (err) => {
- if (err) {
- reject(err);
- } else {
- resolve();
- }
- });
- });
- }
- function openAsync(path, flags, mode = undefined) {
- return new Promise((resolve, reject) => {
- fs.open(path, flags, mode, (err, fd) => {
- if (err) {
- reject(err);
- } else {
- resolve(fd);
- }
- });
- });
- }
- function readAsync(...args) {
- return new Promise((resolve, reject) => {
- fs.read(...args, (err, bytesRead, buffer) => {
- if (err) {
- reject(err);
- } else {
- resolve({ bytesRead, buffer });
- }
- });
- });
- }
- class FileSource extends BaseSource {
- constructor(path) {
- super();
- this.path = path;
- this.openRequest = openAsync(path, 'r');
- }
- async fetchSlice(slice) {
- // TODO: use `signal`
- const fd = await this.openRequest;
- const { buffer } = await readAsync(
- fd,
- Buffer.alloc(slice.length),
- 0,
- slice.length,
- slice.offset,
- );
- return buffer.buffer;
- }
- async close() {
- const fd = await this.openRequest;
- await closeAsync(fd);
- }
- }
- export function makeFileSource(path) {
- return new FileSource(path);
- }
|