taglib-wasm
Version:
TagLib-Wasm is the universal tagging library for TypeScript/JavaScript platforms: Browsers, Node.js, Deno, Bun, Cloudflare Workers, and Electron apps
67 lines (66 loc) • 1.65 kB
JavaScript
import { FileOperationError } from "../errors/classes.js";
function mapOpenFlags(options) {
if (options.create && options.truncate) return "w+";
if (options.create) return "a+";
if (options.write) return "r+";
return "r";
}
function createNodeFileHandle(fs, fd) {
let position = 0;
return {
readSync(target) {
const n = fs.readSync(fd, target, 0, target.length, position);
if (n === 0) return null;
position += n;
return n;
},
writeSync(data) {
const n = fs.writeSync(fd, data, 0, data.length, position);
position += n;
return n;
},
seekSync(offset, whence) {
if (whence === 0) {
position = offset;
} else if (whence === 1) {
position += offset;
} else {
const stat = fs.fstatSync(fd);
position = stat.size + offset;
}
if (position < 0) {
throw new FileOperationError(
"read",
`Invalid seek position: ${position}`
);
}
return position;
},
truncateSync(size) {
fs.ftruncateSync(fd, size);
},
close() {
fs.closeSync(fd);
}
};
}
async function createNodeFsProvider() {
const fs = await import("node:fs");
const fsp = await import("node:fs/promises");
return {
openSync(path, options) {
const flags = mapOpenFlags(options);
const fd = fs.openSync(path, flags);
return createNodeFileHandle(fs, fd);
},
async readFile(path) {
return new Uint8Array(await fsp.readFile(path));
},
isNotFoundError(error) {
return error?.code === "ENOENT";
}
};
}
export {
createNodeFsProvider
};