import {
performance,
PerformanceEntry,
PerformanceObserver as WebPerformanceObserver,
PerformanceObserverEntryList,
} from "ext:deno_web/15_performance.js";
import { EldHistogram } from "ext:core/ops";
import { ERR_INVALID_ARG_TYPE } from "ext:deno_node/internal/errors.ts";
const constants = {
NODE_PERFORMANCE_ENTRY_TYPE_NODE: 0,
NODE_PERFORMANCE_ENTRY_TYPE_MARK: 1,
NODE_PERFORMANCE_ENTRY_TYPE_MEASURE: 2,
NODE_PERFORMANCE_ENTRY_TYPE_GC: 3,
NODE_PERFORMANCE_ENTRY_TYPE_FUNCTION: 4,
NODE_PERFORMANCE_ENTRY_TYPE_HTTP2: 5,
NODE_PERFORMANCE_ENTRY_TYPE_HTTP: 6,
NODE_PERFORMANCE_ENTRY_TYPE_DNS: 7,
NODE_PERFORMANCE_ENTRY_TYPE_NET: 8,
};
class PerformanceObserver extends WebPerformanceObserver {
constructor(callback) {
if (typeof callback !== "function") {
throw new ERR_INVALID_ARG_TYPE("callback", "Function", callback);
}
super(callback);
}
observe(options) {
if (typeof options !== "object" || options === null) {
throw new ERR_INVALID_ARG_TYPE("options", "Object", options);
}
if (
options.entryTypes !== undefined && !Array.isArray(options.entryTypes)
) {
throw new ERR_INVALID_ARG_TYPE(
"options.entryTypes",
"string[]",
options.entryTypes,
);
}
return super.observe(options);
}
static get supportedEntryTypes() {
return WebPerformanceObserver.supportedEntryTypes;
}
}
const eventLoopUtilization = () => {
return { idle: 0, active: 0, utilization: 0 };
};
performance.eventLoopUtilization = eventLoopUtilization;
performance.nodeTiming = {};
const timerify = (fn, options = {}) => {
if (typeof fn !== "function") {
throw new ERR_INVALID_ARG_TYPE("fn", "function", fn);
}
if (
options !== undefined && (typeof options !== "object" || options === null)
) {
throw new ERR_INVALID_ARG_TYPE("options", "Object", options);
}
if (options?.histogram !== undefined) {
if (
typeof options.histogram !== "object" ||
options.histogram === null ||
typeof options.histogram.record !== "function"
) {
throw new ERR_INVALID_ARG_TYPE(
"options.histogram",
"RecordableHistogram",
options.histogram,
);
}
}
function timerified(...args) {
return new.target ? new fn(...args) : fn.apply(this, args);
}
Object.defineProperty(timerified, "name", {
value: `timerified ${fn.name}`,
configurable: true,
});
Object.defineProperty(timerified, "length", {
value: fn.length,
configurable: true,
});
return timerified;
};
performance.timerify = timerify;
performance.markResourceTiming = () => {};
function monitorEventLoopDelay(options = {}) {
const { resolution = 10 } = options;
return new EldHistogram(resolution);
}
export default {
performance,
PerformanceObserver,
PerformanceObserverEntryList,
PerformanceEntry,
monitorEventLoopDelay,
eventLoopUtilization,
timerify,
constants,
};
export {
constants,
eventLoopUtilization,
monitorEventLoopDelay,
performance,
PerformanceEntry,
PerformanceObserver,
PerformanceObserverEntryList,
timerify,
};