// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
if (!globalThis.Deno) {
  globalThis.Deno = {
    core: {
      ops: {},
      asyncOps: {},
    },
  };
}

Deno.__op__console = function (callConsole, console) {
  Deno.core.callConsole = callConsole;
  Deno.core.console = console;
};

Deno.__op__registerOp = function (isAsync, op, opName) {
  const core = Deno.core;
  if (isAsync) {
    if (core.ops[opName] !== undefined) {
      return;
    }
    core.asyncOps[opName] = op;
    core.ops[opName] = function (...args) {
      if (this !== core.ops) {
        // deno-lint-ignore prefer-primordials
        throw new Error(
          "An async stub cannot be separated from Deno.core.ops. Use ???",
        );
      }
      return core.asyncStub(opName, args);
    };
  } else {
    core.ops[opName] = op;
  }
};

Deno.__op__unregisterOp = function (isAsync, opName) {
  if (isAsync) {
    delete Deno.core.asyncOps[opName];
  }
  delete Deno.core.ops[opName];
};

Deno.__op__cleanup = function () {
  delete Deno.__op__console;
  delete Deno.__op__registerOp;
  delete Deno.__op__unregisterOp;
  delete Deno.__op__cleanup;
};