UNPKG

wasmagic

Version:

WASM compiled version of libmagic

133 lines 6.36 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.WASMagic = exports.WASMagicFlags = void 0; const libmagic_wrapper_1 = __importDefault(require("./libmagic-wrapper")); var WASMagicFlags; (function (WASMagicFlags) { /** No flags */ WASMagicFlags[WASMagicFlags["NONE"] = 0] = "NONE"; /** Turn on debugging */ WASMagicFlags[WASMagicFlags["DEBUG"] = 1] = "DEBUG"; /** Follow symlinks */ WASMagicFlags[WASMagicFlags["SYMLINK"] = 2] = "SYMLINK"; /** Check inside compressed files */ WASMagicFlags[WASMagicFlags["COMPRESS"] = 4] = "COMPRESS"; /** Look at the contents of devices */ WASMagicFlags[WASMagicFlags["DEVICES"] = 8] = "DEVICES"; /** Return the MIME type */ WASMagicFlags[WASMagicFlags["MIME_TYPE"] = 16] = "MIME_TYPE"; /** Return all matches */ WASMagicFlags[WASMagicFlags["CONTINUE"] = 32] = "CONTINUE"; /** Print warnings to stderr */ WASMagicFlags[WASMagicFlags["CHECK"] = 64] = "CHECK"; /** Restore access time on exit */ WASMagicFlags[WASMagicFlags["PRESERVE_ATIME"] = 128] = "PRESERVE_ATIME"; /** Don't convert unprintable chars */ WASMagicFlags[WASMagicFlags["RAW"] = 256] = "RAW"; /** Handle ENOENT etc as real errors */ WASMagicFlags[WASMagicFlags["ERROR"] = 512] = "ERROR"; /** Return the MIME encoding */ WASMagicFlags[WASMagicFlags["MIME_ENCODING"] = 1024] = "MIME_ENCODING"; /** Return the Apple creator/type */ WASMagicFlags[WASMagicFlags["APPLE"] = 2048] = "APPLE"; /** Return a /-separated list of extensions */ WASMagicFlags[WASMagicFlags["EXTENSION"] = 16777216] = "EXTENSION"; /** Check inside compressed files but not report compression */ WASMagicFlags[WASMagicFlags["COMPRESS_TRANSP"] = 33554432] = "COMPRESS_TRANSP"; /** Don't allow decompression that needs to fork */ WASMagicFlags[WASMagicFlags["NO_COMPRESS_FORK"] = 67108864] = "NO_COMPRESS_FORK"; /** Don't check for compressed files */ WASMagicFlags[WASMagicFlags["NO_CHECK_COMPRESS"] = 4096] = "NO_CHECK_COMPRESS"; /** Don't check for tar files */ WASMagicFlags[WASMagicFlags["NO_CHECK_TAR"] = 8192] = "NO_CHECK_TAR"; /** Don't check magic entries */ WASMagicFlags[WASMagicFlags["NO_CHECK_SOFT"] = 16384] = "NO_CHECK_SOFT"; /** Don't check application type */ WASMagicFlags[WASMagicFlags["NO_CHECK_APPTYPE"] = 32768] = "NO_CHECK_APPTYPE"; /** Don't check for elf details */ WASMagicFlags[WASMagicFlags["NO_CHECK_ELF"] = 65536] = "NO_CHECK_ELF"; /** Don't check for text files */ WASMagicFlags[WASMagicFlags["NO_CHECK_TEXT"] = 131072] = "NO_CHECK_TEXT"; /** Don't check for cdf files */ WASMagicFlags[WASMagicFlags["NO_CHECK_CDF"] = 262144] = "NO_CHECK_CDF"; /** Don't check for CSV files */ WASMagicFlags[WASMagicFlags["NO_CHECK_CSV"] = 524288] = "NO_CHECK_CSV"; /** Don't check tokens */ WASMagicFlags[WASMagicFlags["NO_CHECK_TOKENS"] = 1048576] = "NO_CHECK_TOKENS"; /** Don't check text encodings */ WASMagicFlags[WASMagicFlags["NO_CHECK_ENCODING"] = 2097152] = "NO_CHECK_ENCODING"; /** Don't check for JSON files */ WASMagicFlags[WASMagicFlags["NO_CHECK_JSON"] = 4194304] = "NO_CHECK_JSON"; /** Don't check for SIMH tape files */ WASMagicFlags[WASMagicFlags["NO_CHECK_SIMH"] = 8388608] = "NO_CHECK_SIMH"; })(WASMagicFlags || (exports.WASMagicFlags = WASMagicFlags = {})); const defaultWASMagicOptions = Object.freeze({ flags: WASMagicFlags.MIME_TYPE, loadDefaultMagicfile: true, magicFiles: [], stdio: (_stdioName, _text) => { }, }); class WASMagic { static create() { return __awaiter(this, arguments, void 0, function* (options = defaultWASMagicOptions) { const Module = yield (0, libmagic_wrapper_1.default)(); return new WASMagic(Module, options); }); } constructor(Module, inputOptions) { const options = Object.assign({}, defaultWASMagicOptions, inputOptions); Module.printOverride = options.stdio; Module.FS.chdir("/magic"); const magicPaths = []; // Write each magic file to the internal WASM filesystem for (let i = 0; i < options.magicFiles.length; i++) { Module.FS.writeFile(`/magic/${i}`, options.magicFiles[i]); magicPaths.push(`${i}`); } if (options.loadDefaultMagicfile) { magicPaths.push("magic.mgc"); } const loadErr = Module.ccall("magic_wrapper_load", "string", ["number", "string"], [options.flags, magicPaths.join(":")]); if (loadErr !== "") { throw new Error(`WASMagic Load Error: ${loadErr}`); } // Remove each magic file from the internal WASM filesystem // This frees available memory for (let i = 0; i < options.magicFiles.length; i++) { Module.FS.unlink(`/magic/${i}`); } Module.FS.unlink("/magic/magic.mgc"); this.Module = Module; this.detectFromWasm = Module.cwrap("magic_wrapper_detect", "string", [ "number", "number", ]); } detect(buf) { const ptr = this.Module._malloc(buf.length); this.Module.HEAPU8.set(buf, ptr); const result = this.detectFromWasm(ptr, buf.length); this.Module._free(ptr); return result; } /** * @deprecated Use {@link WASMagic#detect} instead */ getMime(buf) { return this.detect(buf); } } exports.WASMagic = WASMagic; //# sourceMappingURL=index.js.map