@catamphetamine/id3js
Version:
A modern ID3 parser written completely in JavaScript, making use of typed arrays and the HTML5 File API
73 lines (72 loc) • 2.19 kB
JavaScript
import * as fs from 'fs';
import { Reader } from './reader/reader.js';
/**
* Provides read access to the local file system
*/
export class LocalReader extends Reader {
/**
* @param {string} path Path of the local file
*/
constructor(path) {
super();
this._path = path;
}
/** @inheritdoc */
async open() {
return new Promise((resolve, reject) => {
fs.stat(this._path, (err, stat) => {
if (err) {
reject(err);
return;
}
this.size = stat.size;
fs.open(this._path, 'r', (openErr, fd) => {
if (openErr) {
reject(err);
return;
}
this._fd = fd;
resolve();
});
});
});
}
/** @inheritdoc */
async close() {
return new Promise((resolve, reject) => {
if (this._fd === undefined) {
reject(new Error('Resource not yet open'));
return;
}
fs.close(this._fd, (err) => {
if (err) {
reject(err);
}
else {
resolve();
}
});
});
}
/** @inheritdoc */
async read(length, position) {
const buffer = Buffer.alloc(length);
return new Promise((resolve, reject) => {
if (this._fd === undefined) {
reject(new Error('Resource not yet open'));
return;
}
fs.read(this._fd, buffer, 0, length, position, (err, _bytesRead, buffer) => {
if (err) {
return reject(err);
}
const ab = new ArrayBuffer(buffer.length);
const view = new Uint8Array(ab);
for (let i = 0; i < buffer.length; i++) {
view[i] = buffer[i];
}
resolve(ab);
});
});
}
}