wasmagic
Version:
WASM compiled version of libmagic
133 lines • 6.36 kB
JavaScript
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
;