UNPKG

hakojs

Version:

A secure, embeddable JavaScript engine that runs untrusted code inside WebAssembly sandboxes with fine-grained permissions and resource limits

196 lines (194 loc) 5.56 kB
// src/etc/types.ts import { PrimJSError } from "../etc/errors"; var LEPUS_EXCEPTION = -1; var LEPUS_FALSE = 0; var LEPUS_TRUE = 1; function LEPUS_BOOLToBoolean(value) { switch (value) { case LEPUS_FALSE: return false; case LEPUS_TRUE: return true; default: throw new PrimJSError(`Invalid LEPUS_BOOL value: ${value}`); } } var INTRINSIC_BASE_OBJECTS = 1 << 0; var INTRINSIC_DATE = 1 << 1; var INTRINSIC_EVAL = 1 << 2; var INTRINSIC_STRING_NORMALIZE = 1 << 3; var INTRINSIC_REGEXP = 1 << 4; var INTRINSIC_REGEXP_COMPILER = 1 << 5; var INTRINSIC_JSON = 1 << 6; var INTRINSIC_PROXY = 1 << 7; var INTRINSIC_MAP_SET = 1 << 8; var INTRINSIC_TYPED_ARRAYS = 1 << 9; var INTRINSIC_PROMISE = 1 << 10; var INTRINSIC_BIGINT = 1 << 11; var INTRINSIC_BIGFLOAT = 1 << 12; var INTRINSIC_BIGDECIMAL = 1 << 13; var INTRINSIC_OPERATOR_OVERLOADING = 1 << 14; var INTRINSIC_BIGNUM_EXT = 1 << 15; var INTRINSIC_PERFORMANCE = 1 << 16; var INTRINSIC_CRYPTO = 1 << 17; var INTRINSIC_FLAG_MAP = { BaseObjects: INTRINSIC_BASE_OBJECTS, Date: INTRINSIC_DATE, Eval: INTRINSIC_EVAL, StringNormalize: INTRINSIC_STRING_NORMALIZE, RegExp: INTRINSIC_REGEXP, RegExpCompiler: INTRINSIC_REGEXP_COMPILER, JSON: INTRINSIC_JSON, Proxy: INTRINSIC_PROXY, MapSet: INTRINSIC_MAP_SET, TypedArrays: INTRINSIC_TYPED_ARRAYS, Promise: INTRINSIC_PROMISE, BigInt: INTRINSIC_BIGINT, BigFloat: INTRINSIC_BIGFLOAT, BigDecimal: INTRINSIC_BIGDECIMAL, OperatorOverloading: INTRINSIC_OPERATOR_OVERLOADING, BignumExt: INTRINSIC_BIGNUM_EXT, Performance: INTRINSIC_PERFORMANCE, Crypto: INTRINSIC_CRYPTO }; var DefaultIntrinsics = Object.freeze({ BaseObjects: true, Date: true, Eval: true, StringNormalize: true, RegExp: true, JSON: true, Proxy: true, MapSet: true, TypedArrays: true, Promise: true }); function intrinsicsToFlags(intrinsics) { return Object.entries(intrinsics).reduce((result, [key, enabled]) => { if (enabled && key in INTRINSIC_FLAG_MAP) { return result | INTRINSIC_FLAG_MAP[key]; } return result; }, 0); } var EVAL_FLAG_GLOBAL = 0; var EVAL_FLAG_MODULE = 1 << 0; var EVAL_FLAG_DIRECT = 2 << 0; var EVAL_FLAG_INDIRECT = 3 << 0; var EVAL_FLAG_TYPE_MASK = 3 << 0; var EVAL_FLAG_STRICT = 1 << 3; var EVAL_FLAG_RESERVED = 1 << 4; var EVAL_FLAG_COMPILE_ONLY = 1 << 5; var EVAL_FLAG_DEBUGGER_NO_PERSIST_SCRIPT = 1 << 6; var JS_STRIP_SOURCE = 1 << 0; var JS_STRIP_DEBUG = 1 << 1; function evalOptionsToFlags(evalOptions) { if (typeof evalOptions === "number") { return evalOptions; } if (evalOptions === undefined) { return EVAL_FLAG_GLOBAL; } if (evalOptions.type !== undefined && evalOptions.type !== "global" && evalOptions.type !== "module") { throw new PrimJSError(`Invalid eval type: ${evalOptions.type}. Must be "global" or "module".`); } const { type, strict, compileOnly, noPersist } = evalOptions; let flags = 0; if (type === "global") flags |= EVAL_FLAG_GLOBAL; if (type === "module") flags |= EVAL_FLAG_MODULE; if (strict) flags |= EVAL_FLAG_STRICT; if (compileOnly) flags |= EVAL_FLAG_COMPILE_ONLY; if (noPersist) flags |= EVAL_FLAG_DEBUGGER_NO_PERSIST_SCRIPT; return flags; } var PROPERTY_ENUM_STRING = 1 << 0; var PROPERTY_ENUM_SYMBOL = 1 << 1; var PROPERTY_ENUM_PRIVATE = 1 << 2; var PROPERTY_ENUM_ENUMERABLE = 1 << 4; var PROPERTY_ENUM_NON_ENUMERABLE = 1 << 5; var PROPERTY_ENUM_CONFIGURABLE = 1 << 6; var PROPERTY_ENUM_NON_CONFIGURABLE = 1 << 7; var PROPERTY_ENUM_NUMBER = 1 << 14; var PROPERTY_ENUM_COMPLIANT = 1 << 15; function hasOptionsWithCause(error) { return "options" in error && error.options !== null && typeof error.options === "object" && "cause" in error.options; } function detectCircularReferences(obj, path = "root") { const seen = new Set; function traverse(value, currentPath) { if (typeof value !== "object" || value === null) { return; } if (seen.has(value)) { throw new TypeError(`Circular reference detected at ${currentPath}`); } seen.add(value); if (Array.isArray(value)) { for (let i = 0;i < value.length; i++) { traverse(value[i], `${currentPath}[${i}]`); } } else { for (const key of Object.keys(value)) { traverse(value[key], `${currentPath}.${key}`); } } seen.delete(value); } traverse(obj, path); } export { intrinsicsToFlags, hasOptionsWithCause, evalOptionsToFlags, detectCircularReferences, PROPERTY_ENUM_SYMBOL, PROPERTY_ENUM_STRING, PROPERTY_ENUM_PRIVATE, PROPERTY_ENUM_NUMBER, PROPERTY_ENUM_NON_ENUMERABLE, PROPERTY_ENUM_NON_CONFIGURABLE, PROPERTY_ENUM_ENUMERABLE, PROPERTY_ENUM_CONFIGURABLE, PROPERTY_ENUM_COMPLIANT, LEPUS_TRUE, LEPUS_FALSE, LEPUS_EXCEPTION, LEPUS_BOOLToBoolean, JS_STRIP_SOURCE, JS_STRIP_DEBUG, INTRINSIC_TYPED_ARRAYS, INTRINSIC_STRING_NORMALIZE, INTRINSIC_REGEXP_COMPILER, INTRINSIC_REGEXP, INTRINSIC_PROXY, INTRINSIC_PROMISE, INTRINSIC_PERFORMANCE, INTRINSIC_OPERATOR_OVERLOADING, INTRINSIC_MAP_SET, INTRINSIC_JSON, INTRINSIC_EVAL, INTRINSIC_DATE, INTRINSIC_CRYPTO, INTRINSIC_BIGNUM_EXT, INTRINSIC_BIGINT, INTRINSIC_BIGFLOAT, INTRINSIC_BIGDECIMAL, INTRINSIC_BASE_OBJECTS, EVAL_FLAG_TYPE_MASK, EVAL_FLAG_STRICT, EVAL_FLAG_RESERVED, EVAL_FLAG_MODULE, EVAL_FLAG_INDIRECT, EVAL_FLAG_GLOBAL, EVAL_FLAG_DIRECT, EVAL_FLAG_DEBUGGER_NO_PERSIST_SCRIPT, EVAL_FLAG_COMPILE_ONLY, DefaultIntrinsics }; //# debugId=0ACA7959221DC63D64756E2164756E21 //# sourceMappingURL=types.js.map