import { validateFunction, validateString, validateUint32 } from "__wasm_rquickjs_builtin/internal/validators";
import { normalizeEncoding, slowCases } from "__wasm_rquickjs_builtin/internal/normalize_encoding";
export { normalizeEncoding, slowCases };
export const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom");
export const kEnumerableProperty = Object.create(null);
kEnumerableProperty.enumerable = true;
export function once(callback) {
let called = false;
return function (...args) {
if (called) return;
called = true;
Reflect.apply(callback, this, args);
};
}
export function createDeferredPromise() {
let resolve;
let reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return { promise, resolve, reject };
}
let sleepState = null;
function getSleepState() {
if (sleepState !== null) {
return sleepState;
}
if (typeof SharedArrayBuffer === "function" &&
typeof Atomics === "object" &&
Atomics !== null &&
typeof Atomics.wait === "function") {
sleepState = new Int32Array(new SharedArrayBuffer(4));
}
return sleepState;
}
export function sleep(msec) {
validateUint32(msec, "msec");
if (msec === 0) {
return;
}
const state = getSleepState();
if (state !== null) {
Atomics.wait(state, 0, 0, msec);
return;
}
const start = Date.now();
while (Date.now() - start < msec) {
}
}
const codesWarned = new Set();
const experimentalWarnings = new Set();
export function emitExperimentalWarning(feature) {
validateString(feature, "feature");
if (experimentalWarnings.has(feature)) {
return;
}
experimentalWarnings.add(feature);
process.emitWarning(
`${feature} is an experimental feature and might change at any time`,
"ExperimentalWarning",
);
}
export function deprecate(fn, msg, code) {
if (code !== undefined) {
validateString(code, "code");
}
let warned = false;
function deprecated(...args) {
if (!warned) {
warned = true;
if (code !== undefined) {
if (!codesWarned.has(code)) {
process.emitWarning(msg, "DeprecationWarning", code, deprecated);
codesWarned.add(code);
}
} else {
process.emitWarning(msg, "DeprecationWarning", deprecated);
}
}
if (new.target) {
return Reflect.construct(fn, args, new.target);
}
return Reflect.apply(fn, this, args);
}
Object.setPrototypeOf(deprecated, fn);
if (fn.prototype) {
deprecated.prototype = fn.prototype;
}
return deprecated;
}
export const kCustomPromisifiedSymbol = Symbol.for("nodejs.util.promisify.custom");
const kCustomPromisifyArgsSymbol = Symbol.for(
"nodejs.util.promisify.customArgs",
);
export const customPromisifyArgs = kCustomPromisifyArgsSymbol;
export function promisify(
original,
) {
validateFunction(original, "original");
if (original[kCustomPromisifiedSymbol]) {
const fn = original[kCustomPromisifiedSymbol];
validateFunction(fn, "util.promisify.custom");
return Object.defineProperty(fn, kCustomPromisifiedSymbol, {
value: fn,
enumerable: false,
writable: false,
configurable: true,
});
}
const argumentNames = original[kCustomPromisifyArgsSymbol];
function fn(...args) {
return new Promise((resolve, reject) => {
args.push((err, ...values) => {
if (err) {
return reject(err);
}
if (argumentNames !== undefined && values.length > 1) {
const obj = {};
for (let i = 0; i < argumentNames.length; i++) {
obj[argumentNames[i]] = values[i];
}
resolve(obj);
} else {
resolve(values[0]);
}
});
try {
Reflect.apply(original, this, args);
} catch (err) {
return reject(err);
}
});
}
Object.setPrototypeOf(fn, Object.getPrototypeOf(original));
Object.defineProperty(fn, kCustomPromisifiedSymbol, {
value: fn,
enumerable: false,
writable: false,
configurable: true,
});
return Object.defineProperties(
fn,
Object.getOwnPropertyDescriptors(original),
);
}
promisify.custom = kCustomPromisifiedSymbol;
const colorRegExp = /\u001b\[\d\d?m/g;
export function removeColors(str) {
return String.prototype.replace(str, colorRegExp, '');
}
export function isError(e) {
return e instanceof Error ||
(e !== null && typeof e === 'object' && Object.prototype.toString.call(e) === '[object Error]');
}
export const kEmptyObject = Object.freeze(Object.create(null));
export function lazyDOMException(msg, name) {
let e = new Error(msg)
e.name = name;
return e;
}
export function filterDuplicateStrings(items, low) {
const map = new SafeMap();
for (let i = 0; i < items.length; i++) {
const item = items[i];
const key = String.prototype.toLowerCase.call(item);
if (low) {
map.set(key, key);
} else {
map.set(key, item);
}
}
return Array.prototype.sort.call(Array.from(map.values()));
}
export function cachedResult(fn) {
let result;
return () => {
if (result === undefined)
result = fn();
return Array.prototype.slice.call(result);
};
}
export default {
createDeferredPromise,
customInspectSymbol,
kEnumerableProperty,
normalizeEncoding,
sleep,
once,
deprecate,
emitExperimentalWarning,
promisify,
removeColors,
isError,
kEmptyObject,
cachedResult,
filterDuplicateStrings
};