"use strict";
((window) => {
const {
ArrayPrototypeMap,
ArrayPrototypePush,
Error,
FunctionPrototypeBind,
ObjectAssign,
ObjectFreeze,
ObjectFromEntries,
ObjectKeys,
ObjectHasOwn,
Proxy,
SymbolFor,
TypeError,
setQueueMicrotask,
} = window.__bootstrap.primordials;
const {
ops,
getPromise,
hasPromise,
promiseIdSymbol,
} = window.Deno.core;
let unhandledPromiseRejectionHandler = () => false;
let timerDepth = 0;
const macrotaskCallbacks = [];
const nextTickCallbacks = [];
function setMacrotaskCallback(cb) {
ArrayPrototypePush(macrotaskCallbacks, cb);
}
function setNextTickCallback(cb) {
ArrayPrototypePush(nextTickCallbacks, cb);
}
function eventLoopTick() {
for (let i = 0; i < arguments.length - 3; i += 2) {
const promiseId = arguments[i];
const res = arguments[i + 1];
const promise = getPromise(promiseId);
promise.resolve(res);
}
if (arguments[arguments.length - 1]) {
for (let i = 0; i < nextTickCallbacks.length; i++) {
nextTickCallbacks[i]();
}
} else {
op_run_microtasks();
}
for (let i = 0; i < macrotaskCallbacks.length; i++) {
const cb = macrotaskCallbacks[i];
while (true) {
const res = cb();
if (res === undefined) {
break;
}
op_run_microtasks();
if (res === true) {
break;
}
}
}
const timers = arguments[arguments.length - 2];
if (timers) {
for (let i = 0; i < timers.length; i += 2) {
timerDepth = timers[i];
timers[i + 1]();
}
timerDepth = 0;
}
const rejections = arguments[arguments.length - 3];
if (rejections) {
for (let i = 0; i < rejections.length; i += 2) {
const handled = unhandledPromiseRejectionHandler(
rejections[i],
rejections[i + 1],
);
if (!handled) {
const err = rejections[i + 1];
op_dispatch_exception(err, true);
}
}
}
}
function refOp(promiseId) {
if (!hasPromise(promiseId)) {
return;
}
op_ref_op(promiseId);
}
function unrefOp(promiseId) {
if (!hasPromise(promiseId)) {
return;
}
op_unref_op(promiseId);
}
function refOpPromise(promise) {
refOp(promise[promiseIdSymbol]);
}
function unrefOpPromise(promise) {
unrefOp(promise[promiseIdSymbol]);
}
function resources() {
return ObjectFromEntries(op_resources());
}
function metrics() {
return {
opsDispatched: 0,
opsDispatchedSync: 0,
opsDispatchedAsync: 0,
opsDispatchedAsyncUnref: 0,
opsCompleted: 0,
opsCompletedSync: 0,
opsCompletedAsync: 0,
opsCompletedAsyncUnref: 0,
bytesSentControl: 0,
bytesSentData: 0,
bytesReceived: 0,
ops: {},
};
}
let reportExceptionCallback = undefined;
function setReportExceptionCallback(cb) {
if (typeof cb != "function") {
throw new TypeError("expected a function");
}
reportExceptionCallback = cb;
}
function queueMicrotask(cb) {
if (typeof cb != "function") {
throw new TypeError("expected a function");
}
return op_queue_microtask(() => {
try {
cb();
} catch (error) {
if (reportExceptionCallback) {
reportExceptionCallback(error);
} else {
throw error;
}
}
});
}
class BadResource extends Error {
constructor(msg) {
super(msg);
this.name = "BadResource";
}
}
const BadResourcePrototype = BadResource.prototype;
class Interrupted extends Error {
constructor(msg) {
super(msg);
this.name = "Interrupted";
}
}
const InterruptedPrototype = Interrupted.prototype;
const promiseHooks = [
[], [], [], [], ];
function setPromiseHooks(init, before, after, resolve) {
const hooks = [init, before, after, resolve];
for (let i = 0; i < hooks.length; i++) {
const hook = hooks[i];
if (hook == null) {
continue;
}
if (typeof hook !== "function") {
throw new TypeError(`Expected function at position ${i}`);
}
ArrayPrototypePush(promiseHooks[i], hook);
}
const wrappedHooks = ArrayPrototypeMap(promiseHooks, (hooks) => {
switch (hooks.length) {
case 0:
return undefined;
case 1:
return hooks[0];
case 2:
return create2xHookWrapper(hooks[0], hooks[1]);
case 3:
return create3xHookWrapper(hooks[0], hooks[1], hooks[2]);
default:
return createHookListWrapper(hooks);
}
function create2xHookWrapper(hook1, hook2) {
return function (promise, parent) {
hook1(promise, parent);
hook2(promise, parent);
};
}
function create3xHookWrapper(hook1, hook2, hook3) {
return function (promise, parent) {
hook1(promise, parent);
hook2(promise, parent);
hook3(promise, parent);
};
}
function createHookListWrapper(hooks) {
return function (promise, parent) {
for (let i = 0; i < hooks.length; i++) {
const hook = hooks[i];
hook(promise, parent);
}
};
}
});
op_set_promise_hooks(
wrappedHooks[0],
wrappedHooks[1],
wrappedHooks[2],
wrappedHooks[3],
);
}
function ensureFastOps(keep) {
return new Proxy({}, {
get(_target, opName) {
const op = ops[opName];
if (ops[opName] === undefined) {
op_panic(`Unknown or disabled op '${opName}'`);
}
if (keep !== true) {
delete ops[opName];
}
return op;
},
});
}
const {
op_close: close,
op_try_close: tryClose,
op_read: read,
op_read_all: readAll,
op_write: write,
op_write_all: writeAll,
op_write_type_error: writeTypeError,
op_read_sync: readSync,
op_write_sync: writeSync,
op_shutdown: shutdown,
} = ensureFastOps(true);
const callSiteRetBuf = new Uint32Array(2);
const callSiteRetBufU8 = new Uint8Array(callSiteRetBuf.buffer);
function currentUserCallSite() {
const fileName = op_current_user_call_site(callSiteRetBufU8);
const lineNumber = callSiteRetBuf[0];
const columnNumber = callSiteRetBuf[1];
return { fileName, lineNumber, columnNumber };
}
const hostObjectBrand = SymbolFor("Deno.core.hostObject");
function wrapConsole(customConsole, consoleFromV8) {
const callConsole = window.Deno.core.callConsole;
const keys = ObjectKeys(consoleFromV8);
for (let i = 0; i < keys.length; ++i) {
const key = keys[i];
if (ObjectHasOwn(customConsole, key)) {
customConsole[key] = FunctionPrototypeBind(
callConsole,
customConsole,
consoleFromV8[key],
customConsole[key],
);
} else {
customConsole[key] = consoleFromV8[key];
}
}
}
class CoreConsole {
#stringify = (arg) => {
if (
typeof arg === "string" || typeof arg === "boolean" ||
typeof arg === "number" || arg === null || arg === undefined
) {
return arg;
}
return JSON.stringify(arg, undefined, 2);
};
log = (...args) => {
const stringifiedArgs = args.map(this.#stringify);
op_print(`${stringifiedArgs.join(" ")}\n`, false);
};
debug = (...args) => {
const stringifiedArgs = args.map(this.#stringify);
op_print(`${stringifiedArgs.join(" ")}\n`, false);
};
warn = (...args) => {
const stringifiedArgs = args.map(this.#stringify);
op_print(`${stringifiedArgs.join(" ")}\n`, false);
};
error = (...args) => {
const stringifiedArgs = args.map(this.#stringify);
op_print(`${stringifiedArgs.join(" ")}\n`, true);
};
}
const v8Console = globalThis.console;
const coreConsole = new CoreConsole();
globalThis.console = coreConsole;
wrapConsole(coreConsole, v8Console);
const {
op_abort_wasm_streaming,
op_current_user_call_site,
op_decode,
op_deserialize,
op_destructure_error,
op_dispatch_exception,
op_encode,
op_eval_context,
op_event_loop_has_more_work,
op_get_promise_details,
op_get_proxy_details,
op_has_tick_scheduled,
op_memory_usage,
op_op_names,
op_panic,
op_print,
op_queue_microtask,
op_ref_op,
op_resources,
op_run_microtasks,
op_serialize,
op_set_handled_promise_rejection_handler,
op_set_has_tick_scheduled,
op_set_promise_hooks,
op_set_wasm_streaming_callback,
op_str_byte_length,
op_timer_cancel,
op_timer_queue,
op_timer_ref,
op_timer_unref,
op_unref_op,
op_is_any_array_buffer,
op_is_arguments_object,
op_is_array_buffer,
op_is_array_buffer_view,
op_is_async_function,
op_is_big_int_object,
op_is_boolean_object,
op_is_boxed_primitive,
op_is_data_view,
op_is_date,
op_is_generator_function,
op_is_generator_object,
op_is_map,
op_is_map_iterator,
op_is_module_namespace_object,
op_is_native_error,
op_is_number_object,
op_is_promise,
op_is_proxy,
op_is_reg_exp,
op_is_set,
op_is_set_iterator,
op_is_shared_array_buffer,
op_is_string_object,
op_is_symbol_object,
op_is_typed_array,
op_is_weak_map,
op_is_weak_set,
} = ensureFastOps();
const core = ObjectAssign(globalThis.Deno.core, {
ensureFastOps,
resources,
metrics,
eventLoopTick,
BadResource,
BadResourcePrototype,
Interrupted,
InterruptedPrototype,
refOpPromise,
unrefOpPromise,
setReportExceptionCallback,
setPromiseHooks,
close,
tryClose,
read,
readAll,
write,
writeAll,
writeTypeError,
readSync,
writeSync,
shutdown,
print: (msg, isErr) => op_print(msg, isErr),
setMacrotaskCallback,
setNextTickCallback,
runMicrotasks: () => op_run_microtasks(),
hasTickScheduled: () => op_has_tick_scheduled(),
setHasTickScheduled: (bool) => op_set_has_tick_scheduled(bool),
evalContext: (
source,
specifier,
) => op_eval_context(source, specifier),
hostObjectBrand,
encode: (text) => op_encode(text),
decode: (buffer) => op_decode(buffer),
serialize: (
value,
options,
errorCallback,
) => op_serialize(value, options, errorCallback),
deserialize: (buffer, options) => op_deserialize(buffer, options),
getPromiseDetails: (promise) => op_get_promise_details(promise),
getProxyDetails: (proxy) => op_get_proxy_details(proxy),
isAnyArrayBuffer: (value) => op_is_any_array_buffer(value),
isArgumentsObject: (value) => op_is_arguments_object(value),
isArrayBuffer: (value) => op_is_array_buffer(value),
isArrayBufferView: (value) => op_is_array_buffer_view(value),
isAsyncFunction: (value) => op_is_async_function(value),
isBigIntObject: (value) => op_is_big_int_object(value),
isBooleanObject: (value) => op_is_boolean_object(value),
isBoxedPrimitive: (value) => op_is_boxed_primitive(value),
isDataView: (value) => op_is_data_view(value),
isDate: (value) => op_is_date(value),
isGeneratorFunction: (value) => op_is_generator_function(value),
isGeneratorObject: (value) => op_is_generator_object(value),
isMap: (value) => op_is_map(value),
isMapIterator: (value) => op_is_map_iterator(value),
isModuleNamespaceObject: (value) => op_is_module_namespace_object(value),
isNativeError: (value) => op_is_native_error(value),
isNumberObject: (value) => op_is_number_object(value),
isPromise: (value) => op_is_promise(value),
isProxy: (value) => op_is_proxy(value),
isRegExp: (value) => op_is_reg_exp(value),
isSet: (value) => op_is_set(value),
isSetIterator: (value) => op_is_set_iterator(value),
isSharedArrayBuffer: (value) => op_is_shared_array_buffer(value),
isStringObject: (value) => op_is_string_object(value),
isSymbolObject: (value) => op_is_symbol_object(value),
isTypedArray: (value) => op_is_typed_array(value),
isWeakMap: (value) => op_is_weak_map(value),
isWeakSet: (value) => op_is_weak_set(value),
memoryUsage: () => op_memory_usage(),
setWasmStreamingCallback: (fn) => op_set_wasm_streaming_callback(fn),
abortWasmStreaming: (
rid,
error,
) => op_abort_wasm_streaming(rid, error),
destructureError: (error) => op_destructure_error(error),
opNames: () => op_op_names(),
eventLoopHasMoreWork: () => op_event_loop_has_more_work(),
byteLength: (str) => op_str_byte_length(str),
setHandledPromiseRejectionHandler: (handler) =>
op_set_handled_promise_rejection_handler(handler),
setUnhandledPromiseRejectionHandler: (handler) =>
unhandledPromiseRejectionHandler = handler,
reportUnhandledException: (e) => op_dispatch_exception(e, false),
reportUnhandledPromiseRejection: (e) => op_dispatch_exception(e, true),
queueTimer: (depth, repeat, timeout, task) =>
op_timer_queue(depth, repeat, timeout, task),
cancelTimer: (id) => op_timer_cancel(id),
refTimer: (id) => op_timer_ref(id),
unrefTimer: (id) => op_timer_unref(id),
getTimerDepth: () => timerDepth,
currentUserCallSite,
wrapConsole,
v8Console,
});
const internals = {};
ObjectAssign(globalThis.__bootstrap, { core, internals });
ObjectAssign(globalThis.Deno, { core });
ObjectFreeze(globalThis.__bootstrap.core);
ObjectAssign(globalThis, { queueMicrotask });
setQueueMicrotask(queueMicrotask);
})(globalThis);