UNPKG

elflib

Version:
71 lines (70 loc) 2.47 kB
import * as fs from 'fs'; function bufferRead(state, length, position) { let updatepos = false; const { array } = state; if (!array) return Promise.reject('state.array must be defined'); if (!length) return Promise.reject('Length must be specified'); if (!position) { position = state.position; updatepos = true; } if (position <= state.size) { if (position + length > state.size) length = state.size - position; if (length < 0) length = 0; if (updatepos) state.position += length; // return Promise.resolve(new Uint8Array(array, state.offset + position, length)); return Promise.resolve(array instanceof ArrayBuffer ? new Uint8Array(array) : array); } else { return Promise.reject('read past end of file'); } } function createView(from) { return new DataView(from.buffer, from.byteOffset, from.byteLength); } export function buffer(buffer) { const state = { array: buffer, offset: buffer instanceof Uint8Array ? buffer.byteOffset : 0, position: 0, size: buffer.byteLength }; return { open: () => Promise.resolve(), size: () => state.size, close: () => Promise.resolve(), read: (length, position) => bufferRead(state, length, position), view: (length, position) => bufferRead(state, length, position).then(createView), }; } export function array(array) { return buffer(Uint8Array.from(array)); } export async function fileHandle(fh) { await fh.stat(); return buffer(Uint8Array.from(await fh.readFile())); } export function fileDescriptor(handle) { fs.fstatSync(handle); return buffer(Uint8Array.from(fs.readFileSync(handle))); } export function filePath(path) { fs.accessSync(path, fs.constants.R_OK); return buffer(Uint8Array.from(fs.readFileSync(path))); } export function HelperDataView(view, bigEndian) { view.readUInt8 = view.getUint8.bind(view); view.readUInt16 = (ix) => view.getUint16(ix, !bigEndian); view.readUInt32 = (ix) => view.getUint32(ix, !bigEndian); view.readUInt64 = (ix) => view.getBigUint64(ix, !bigEndian); view.readSInt8 = (ix) => view.getInt8(ix); view.readSInt16 = (ix) => view.getInt16(ix, !bigEndian); view.readSInt32 = (ix) => view.getInt32(ix, !bigEndian); view.readSInt64 = (ix) => view.getBigInt64(ix, !bigEndian); return view; }