1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 07:14:47 -05:00

refactor: remove dispatch_json.js from cli/rt and cli/tsc (#7521)

Instead use Deno.core.jsonOpSync and Deno.core.jsonOpAsync
This commit is contained in:
Bartek Iwańczuk 2020-09-16 22:22:43 +02:00 committed by GitHub
parent 104aebdfb5
commit 6c4da0e429
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
31 changed files with 177 additions and 373 deletions

View file

@ -1,83 +0,0 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => {
const core = window.Deno.core;
const util = window.__bootstrap.util;
// Using an object without a prototype because `Map` was causing GC problems.
const promiseTable = Object.create(null);
let _nextPromiseId = 1;
function nextPromiseId() {
return _nextPromiseId++;
}
function decode(ui8) {
return JSON.parse(core.decode(ui8));
}
function encode(args) {
return core.encode(JSON.stringify(args));
}
function unwrapResponse(res) {
if (res.err != null) {
throw new (core.getErrorClass(res.err.className))(res.err.message);
}
util.assert(res.ok != null);
return res.ok;
}
function asyncMsgFromRust(resUi8) {
const res = decode(resUi8);
util.assert(res.promiseId != null);
const promise = promiseTable[res.promiseId];
util.assert(promise != null);
delete promiseTable[res.promiseId];
promise.resolve(res);
}
function sendSync(
opName,
args = {},
...zeroCopy
) {
util.log("sendSync", opName);
const argsUi8 = encode(args);
const resUi8 = core.dispatchByName(opName, argsUi8, ...zeroCopy);
util.assert(resUi8 != null);
const res = decode(resUi8);
util.assert(res.promiseId == null);
return unwrapResponse(res);
}
async function sendAsync(
opName,
args = {},
...zeroCopy
) {
util.log("sendAsync", opName);
const promiseId = nextPromiseId();
args = Object.assign(args, { promiseId });
const promise = util.createResolvable();
const argsUi8 = encode(args);
const buf = core.dispatchByName(opName, argsUi8, ...zeroCopy);
if (buf != null) {
// Sync result.
const res = decode(buf);
promise.resolve(res);
} else {
// Async result.
promiseTable[promiseId] = promise;
}
const res = await promise;
return unwrapResponse(res);
}
window.__bootstrap.dispatchJson = {
asyncMsgFromRust,
sendSync,
sendAsync,
};
})(this);

View file

@ -1,7 +1,7 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendSync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
const { assert } = window.__bootstrap.util; const { assert } = window.__bootstrap.util;
function getRandomValues(typedArray) { function getRandomValues(typedArray) {
@ -12,7 +12,7 @@
typedArray.byteOffset, typedArray.byteOffset,
typedArray.byteLength, typedArray.byteLength,
); );
sendSync("op_get_random_values", {}, ui8); core.jsonOpSync("op_get_random_values", {}, ui8);
return typedArray; return typedArray;
} }

View file

@ -1,10 +1,10 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const sendSync = window.__bootstrap.dispatchJson.sendSync; const core = window.Deno.core;
function resources() { function resources() {
const res = sendSync("op_resources"); const res = core.jsonOpSync("op_resources");
const resources = {}; const resources = {};
for (const resourceTuple of res) { for (const resourceTuple of res) {
resources[resourceTuple[0]] = resourceTuple[1]; resources[resourceTuple[0]] = resourceTuple[1];
@ -13,7 +13,7 @@
} }
function close(rid) { function close(rid) {
sendSync("op_close", { rid }); core.jsonOpSync("op_close", { rid });
} }
window.__bootstrap.resources = { window.__bootstrap.resources = {

View file

@ -2,18 +2,18 @@
((window) => { ((window) => {
const assert = window.__bootstrap.util.assert; const assert = window.__bootstrap.util.assert;
const dispatchJson = window.__bootstrap.dispatchJson; const core = window.Deno.core;
function opStopGlobalTimer() { function opStopGlobalTimer() {
dispatchJson.sendSync("op_global_timer_stop"); core.jsonOpSync("op_global_timer_stop");
} }
async function opStartGlobalTimer(timeout) { async function opStartGlobalTimer(timeout) {
await dispatchJson.sendAsync("op_global_timer", { timeout }); await core.jsonOpAsync("op_global_timer", { timeout });
} }
function opNow() { function opNow() {
return dispatchJson.sendSync("op_now"); return core.jsonOpSync("op_now");
} }
// Derived from https://github.com/vadimg/js_bintrees. MIT Licensed. // Derived from https://github.com/vadimg/js_bintrees. MIT Licensed.

View file

@ -1,9 +1,9 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const core = window.Deno.core;
const { getRandomValues } = window.__bootstrap.crypto; const { getRandomValues } = window.__bootstrap.crypto;
const { customInspect } = window.__bootstrap.console; const { customInspect } = window.__bootstrap.console;
const { sendSync } = window.__bootstrap.dispatchJson;
const { isIterable, requiredArguments } = window.__bootstrap.webUtil; const { isIterable, requiredArguments } = window.__bootstrap.webUtil;
/** https://url.spec.whatwg.org/#idna */ /** https://url.spec.whatwg.org/#idna */
@ -11,7 +11,7 @@
domain, domain,
{ beStrict = false } = {}, { beStrict = false } = {},
) { ) {
return sendSync("op_domain_to_ascii", { domain, beStrict }); return core.jsonOpSync("op_domain_to_ascii", { domain, beStrict });
} }
function decodeSearchParam(p) { function decodeSearchParam(p) {

View file

@ -2,8 +2,8 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
((window) => { ((window) => {
const core = window.Deno.core;
const { log } = window.__bootstrap.util; const { log } = window.__bootstrap.util;
const { sendSync, sendAsync } = window.__bootstrap.dispatchJson;
/* /*
import { blobURLMap } from "./web/url.ts"; import { blobURLMap } from "./web/url.ts";
*/ */
@ -15,7 +15,7 @@
useDenoNamespace, useDenoNamespace,
name, name,
) { ) {
return sendSync("op_create_worker", { return core.jsonOpSync("op_create_worker", {
specifier, specifier,
hasSourceCode, hasSourceCode,
sourceCode, sourceCode,
@ -25,15 +25,15 @@
} }
function hostTerminateWorker(id) { function hostTerminateWorker(id) {
sendSync("op_host_terminate_worker", { id }); core.jsonOpSync("op_host_terminate_worker", { id });
} }
function hostPostMessage(id, data) { function hostPostMessage(id, data) {
sendSync("op_host_post_message", { id }, data); core.jsonOpSync("op_host_post_message", { id }, data);
} }
function hostGetMessage(id) { function hostGetMessage(id) {
return sendAsync("op_host_get_message", { id }); return core.jsonOpAsync("op_host_get_message", { id });
} }
const encoder = new TextEncoder(); const encoder = new TextEncoder();

View file

@ -1,12 +1,12 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const core = window.Deno.core;
const { notImplemented } = window.__bootstrap.util; const { notImplemented } = window.__bootstrap.util;
const { getHeaderValueParams, isTypedArray } = window.__bootstrap.webUtil; const { getHeaderValueParams, isTypedArray } = window.__bootstrap.webUtil;
const { Blob, bytesSymbol: blobBytesSymbol } = window.__bootstrap.blob; const { Blob, bytesSymbol: blobBytesSymbol } = window.__bootstrap.blob;
const { read } = window.__bootstrap.io; const { read } = window.__bootstrap.io;
const { close } = window.__bootstrap.resources; const { close } = window.__bootstrap.resources;
const { sendSync, sendAsync } = window.__bootstrap.dispatchJson;
const Body = window.__bootstrap.body; const Body = window.__bootstrap.body;
const { ReadableStream } = window.__bootstrap.streams; const { ReadableStream } = window.__bootstrap.streams;
const { MultipartBuilder } = window.__bootstrap.multipart; const { MultipartBuilder } = window.__bootstrap.multipart;
@ -17,7 +17,7 @@
} }
function opCreateHttpClient(args) { function opCreateHttpClient(args) {
return sendSync("op_create_http_client", args); return core.jsonOpSync("op_create_http_client", args);
} }
class HttpClient { class HttpClient {
@ -35,7 +35,7 @@
zeroCopy = new Uint8Array(body.buffer, body.byteOffset, body.byteLength); zeroCopy = new Uint8Array(body.buffer, body.byteOffset, body.byteLength);
} }
return sendAsync("op_fetch", args, ...(zeroCopy ? [zeroCopy] : [])); return core.jsonOpAsync("op_fetch", args, ...(zeroCopy ? [zeroCopy] : []));
} }
const NULL_BODY_STATUS = [101, 204, 205, 304]; const NULL_BODY_STATUS = [101, 204, 205, 304];

View file

@ -1,7 +1,7 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendAsync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
const { close } = window.__bootstrap.resources; const { close } = window.__bootstrap.resources;
const { requiredArguments } = window.__bootstrap.webUtil; const { requiredArguments } = window.__bootstrap.webUtil;
const CONNECTING = 0; const CONNECTING = 0;
@ -47,7 +47,7 @@
); );
} }
sendAsync("op_ws_create", { core.jsonOpAsync("op_ws_create", {
url: wsURL.href, url: wsURL.href,
protocols: protocols.join("; "), protocols: protocols.join("; "),
}).then((create) => { }).then((create) => {
@ -57,7 +57,7 @@
this.#protocol = create.protocol; this.#protocol = create.protocol;
if (this.#readyState === CLOSING) { if (this.#readyState === CLOSING) {
sendAsync("op_ws_close", { core.jsonOpAsync("op_ws_close", {
rid: this.#rid, rid: this.#rid,
}).then(() => { }).then(() => {
this.#readyState = CLOSED; this.#readyState = CLOSED;
@ -172,7 +172,7 @@
const sendTypedArray = (ta) => { const sendTypedArray = (ta) => {
this.#bufferedAmount += ta.size; this.#bufferedAmount += ta.size;
sendAsync("op_ws_send", { core.jsonOpAsync("op_ws_send", {
rid: this.#rid, rid: this.#rid,
}, ta).then(() => { }, ta).then(() => {
this.#bufferedAmount -= ta.size; this.#bufferedAmount -= ta.size;
@ -198,7 +198,7 @@
const encoder = new TextEncoder(); const encoder = new TextEncoder();
const d = encoder.encode(string); const d = encoder.encode(string);
this.#bufferedAmount += d.size; this.#bufferedAmount += d.size;
sendAsync("op_ws_send", { core.jsonOpAsync("op_ws_send", {
rid: this.#rid, rid: this.#rid,
text: string, text: string,
}).then(() => { }).then(() => {
@ -228,7 +228,7 @@
} else if (this.#readyState === OPEN) { } else if (this.#readyState === OPEN) {
this.#readyState = CLOSING; this.#readyState = CLOSING;
sendAsync("op_ws_close", { core.jsonOpAsync("op_ws_close", {
rid: this.#rid, rid: this.#rid,
code, code,
reason, reason,
@ -249,7 +249,10 @@
async #eventLoop() { async #eventLoop() {
if (this.#readyState === OPEN) { if (this.#readyState === OPEN) {
const message = await sendAsync("op_ws_next_event", { rid: this.#rid }); const message = await core.jsonOpAsync(
"op_ws_next_event",
{ rid: this.#rid },
);
if (message.type === "string" || message.type === "binary") { if (message.type === "string" || message.type === "binary") {
let data; let data;

View file

@ -1,9 +1,9 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const core = window.Deno.core;
const { close } = window.__bootstrap.resources; const { close } = window.__bootstrap.resources;
const { read, readSync, write, writeSync } = window.__bootstrap.io; const { read, readSync, write, writeSync } = window.__bootstrap.io;
const { sendSync, sendAsync } = window.__bootstrap.dispatchJson;
const { pathFromURL } = window.__bootstrap.util; const { pathFromURL } = window.__bootstrap.util;
function seekSync( function seekSync(
@ -11,7 +11,7 @@
offset, offset,
whence, whence,
) { ) {
return sendSync("op_seek_sync", { rid, offset, whence }); return core.jsonOpSync("op_seek_sync", { rid, offset, whence });
} }
function seek( function seek(
@ -19,7 +19,7 @@
offset, offset,
whence, whence,
) { ) {
return sendAsync("op_seek_async", { rid, offset, whence }); return core.jsonOpAsync("op_seek_async", { rid, offset, whence });
} }
function openSync( function openSync(
@ -28,7 +28,7 @@
) { ) {
checkOpenOptions(options); checkOpenOptions(options);
const mode = options?.mode; const mode = options?.mode;
const rid = sendSync( const rid = core.jsonOpSync(
"op_open_sync", "op_open_sync",
{ path: pathFromURL(path), options, mode }, { path: pathFromURL(path), options, mode },
); );
@ -42,7 +42,7 @@
) { ) {
checkOpenOptions(options); checkOpenOptions(options);
const mode = options?.mode; const mode = options?.mode;
const rid = await sendAsync( const rid = await core.jsonOpAsync(
"op_open_async", "op_open_async",
{ path: pathFromURL(path), options, mode }, { path: pathFromURL(path), options, mode },
); );

View file

@ -1,16 +1,16 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendSync, sendAsync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
const { pathFromURL } = window.__bootstrap.util; const { pathFromURL } = window.__bootstrap.util;
const build = window.__bootstrap.build.build; const build = window.__bootstrap.build.build;
function chmodSync(path, mode) { function chmodSync(path, mode) {
sendSync("op_chmod_sync", { path: pathFromURL(path), mode }); core.jsonOpSync("op_chmod_sync", { path: pathFromURL(path), mode });
} }
async function chmod(path, mode) { async function chmod(path, mode) {
await sendAsync("op_chmod_async", { path: pathFromURL(path), mode }); await core.jsonOpAsync("op_chmod_async", { path: pathFromURL(path), mode });
} }
function chownSync( function chownSync(
@ -18,7 +18,7 @@
uid, uid,
gid, gid,
) { ) {
sendSync("op_chown_sync", { path: pathFromURL(path), uid, gid }); core.jsonOpSync("op_chown_sync", { path: pathFromURL(path), uid, gid });
} }
async function chown( async function chown(
@ -26,14 +26,17 @@
uid, uid,
gid, gid,
) { ) {
await sendAsync("op_chown_async", { path: pathFromURL(path), uid, gid }); await core.jsonOpAsync(
"op_chown_async",
{ path: pathFromURL(path), uid, gid },
);
} }
function copyFileSync( function copyFileSync(
fromPath, fromPath,
toPath, toPath,
) { ) {
sendSync("op_copy_file_sync", { core.jsonOpSync("op_copy_file_sync", {
from: pathFromURL(fromPath), from: pathFromURL(fromPath),
to: pathFromURL(toPath), to: pathFromURL(toPath),
}); });
@ -43,34 +46,34 @@
fromPath, fromPath,
toPath, toPath,
) { ) {
await sendAsync("op_copy_file_async", { await core.jsonOpAsync("op_copy_file_async", {
from: pathFromURL(fromPath), from: pathFromURL(fromPath),
to: pathFromURL(toPath), to: pathFromURL(toPath),
}); });
} }
function cwd() { function cwd() {
return sendSync("op_cwd"); return core.jsonOpSync("op_cwd");
} }
function chdir(directory) { function chdir(directory) {
sendSync("op_chdir", { directory }); core.jsonOpSync("op_chdir", { directory });
} }
function makeTempDirSync(options = {}) { function makeTempDirSync(options = {}) {
return sendSync("op_make_temp_dir_sync", options); return core.jsonOpSync("op_make_temp_dir_sync", options);
} }
function makeTempDir(options = {}) { function makeTempDir(options = {}) {
return sendAsync("op_make_temp_dir_async", options); return core.jsonOpAsync("op_make_temp_dir_async", options);
} }
function makeTempFileSync(options = {}) { function makeTempFileSync(options = {}) {
return sendSync("op_make_temp_file_sync", options); return core.jsonOpSync("op_make_temp_file_sync", options);
} }
function makeTempFile(options = {}) { function makeTempFile(options = {}) {
return sendAsync("op_make_temp_file_async", options); return core.jsonOpAsync("op_make_temp_file_async", options);
} }
function mkdirArgs(path, options) { function mkdirArgs(path, options) {
@ -87,14 +90,14 @@
} }
function mkdirSync(path, options) { function mkdirSync(path, options) {
sendSync("op_mkdir_sync", mkdirArgs(path, options)); core.jsonOpSync("op_mkdir_sync", mkdirArgs(path, options));
} }
async function mkdir( async function mkdir(
path, path,
options, options,
) { ) {
await sendAsync("op_mkdir_async", mkdirArgs(path, options)); await core.jsonOpAsync("op_mkdir_async", mkdirArgs(path, options));
} }
function res(response) { function res(response) {
@ -102,13 +105,18 @@
} }
function readDirSync(path) { function readDirSync(path) {
return res(sendSync("op_read_dir_sync", { path: pathFromURL(path) }))[ return res(
core.jsonOpSync("op_read_dir_sync", { path: pathFromURL(path) }),
)[
Symbol.iterator Symbol.iterator
](); ]();
} }
function readDir(path) { function readDir(path) {
const array = sendAsync("op_read_dir_async", { path: pathFromURL(path) }) const array = core.jsonOpAsync(
"op_read_dir_async",
{ path: pathFromURL(path) },
)
.then( .then(
res, res,
); );
@ -120,26 +128,26 @@
} }
function readLinkSync(path) { function readLinkSync(path) {
return sendSync("op_read_link_sync", { path }); return core.jsonOpSync("op_read_link_sync", { path });
} }
function readLink(path) { function readLink(path) {
return sendAsync("op_read_link_async", { path }); return core.jsonOpAsync("op_read_link_async", { path });
} }
function realPathSync(path) { function realPathSync(path) {
return sendSync("op_realpath_sync", { path }); return core.jsonOpSync("op_realpath_sync", { path });
} }
function realPath(path) { function realPath(path) {
return sendAsync("op_realpath_async", { path }); return core.jsonOpAsync("op_realpath_async", { path });
} }
function removeSync( function removeSync(
path, path,
options = {}, options = {},
) { ) {
sendSync("op_remove_sync", { core.jsonOpSync("op_remove_sync", {
path: pathFromURL(path), path: pathFromURL(path),
recursive: !!options.recursive, recursive: !!options.recursive,
}); });
@ -149,18 +157,18 @@
path, path,
options = {}, options = {},
) { ) {
await sendAsync("op_remove_async", { await core.jsonOpAsync("op_remove_async", {
path: pathFromURL(path), path: pathFromURL(path),
recursive: !!options.recursive, recursive: !!options.recursive,
}); });
} }
function renameSync(oldpath, newpath) { function renameSync(oldpath, newpath) {
sendSync("op_rename_sync", { oldpath, newpath }); core.jsonOpSync("op_rename_sync", { oldpath, newpath });
} }
async function rename(oldpath, newpath) { async function rename(oldpath, newpath) {
await sendAsync("op_rename_async", { oldpath, newpath }); await core.jsonOpAsync("op_rename_async", { oldpath, newpath });
} }
function parseFileInfo(response) { function parseFileInfo(response) {
@ -189,15 +197,15 @@
} }
function fstatSync(rid) { function fstatSync(rid) {
return parseFileInfo(sendSync("op_fstat_sync", { rid })); return parseFileInfo(core.jsonOpSync("op_fstat_sync", { rid }));
} }
async function fstat(rid) { async function fstat(rid) {
return parseFileInfo(await sendAsync("op_fstat_async", { rid })); return parseFileInfo(await core.jsonOpAsync("op_fstat_async", { rid }));
} }
async function lstat(path) { async function lstat(path) {
const res = await sendAsync("op_stat_async", { const res = await core.jsonOpAsync("op_stat_async", {
path: pathFromURL(path), path: pathFromURL(path),
lstat: true, lstat: true,
}); });
@ -205,7 +213,7 @@
} }
function lstatSync(path) { function lstatSync(path) {
const res = sendSync("op_stat_sync", { const res = core.jsonOpSync("op_stat_sync", {
path: pathFromURL(path), path: pathFromURL(path),
lstat: true, lstat: true,
}); });
@ -213,7 +221,7 @@
} }
async function stat(path) { async function stat(path) {
const res = await sendAsync("op_stat_async", { const res = await core.jsonOpAsync("op_stat_async", {
path: pathFromURL(path), path: pathFromURL(path),
lstat: false, lstat: false,
}); });
@ -221,7 +229,7 @@
} }
function statSync(path) { function statSync(path) {
const res = sendSync("op_stat_sync", { const res = core.jsonOpSync("op_stat_sync", {
path: pathFromURL(path), path: pathFromURL(path),
lstat: false, lstat: false,
}); });
@ -237,31 +245,31 @@
} }
function ftruncateSync(rid, len) { function ftruncateSync(rid, len) {
sendSync("op_ftruncate_sync", { rid, len: coerceLen(len) }); core.jsonOpSync("op_ftruncate_sync", { rid, len: coerceLen(len) });
} }
async function ftruncate(rid, len) { async function ftruncate(rid, len) {
await sendAsync("op_ftruncate_async", { rid, len: coerceLen(len) }); await core.jsonOpAsync("op_ftruncate_async", { rid, len: coerceLen(len) });
} }
function truncateSync(path, len) { function truncateSync(path, len) {
sendSync("op_truncate_sync", { path, len: coerceLen(len) }); core.jsonOpSync("op_truncate_sync", { path, len: coerceLen(len) });
} }
async function truncate(path, len) { async function truncate(path, len) {
await sendAsync("op_truncate_async", { path, len: coerceLen(len) }); await core.jsonOpAsync("op_truncate_async", { path, len: coerceLen(len) });
} }
function umask(mask) { function umask(mask) {
return sendSync("op_umask", { mask }); return core.jsonOpSync("op_umask", { mask });
} }
function linkSync(oldpath, newpath) { function linkSync(oldpath, newpath) {
sendSync("op_link_sync", { oldpath, newpath }); core.jsonOpSync("op_link_sync", { oldpath, newpath });
} }
async function link(oldpath, newpath) { async function link(oldpath, newpath) {
await sendAsync("op_link_async", { oldpath, newpath }); await core.jsonOpAsync("op_link_async", { oldpath, newpath });
} }
function toUnixTimeFromEpoch(value) { function toUnixTimeFromEpoch(value) {
@ -290,7 +298,7 @@
atime, atime,
mtime, mtime,
) { ) {
sendSync("op_futime_sync", { core.jsonOpSync("op_futime_sync", {
rid, rid,
atime: toUnixTimeFromEpoch(atime), atime: toUnixTimeFromEpoch(atime),
mtime: toUnixTimeFromEpoch(mtime), mtime: toUnixTimeFromEpoch(mtime),
@ -302,7 +310,7 @@
atime, atime,
mtime, mtime,
) { ) {
await sendAsync("op_futime_async", { await core.jsonOpAsync("op_futime_async", {
rid, rid,
atime: toUnixTimeFromEpoch(atime), atime: toUnixTimeFromEpoch(atime),
mtime: toUnixTimeFromEpoch(mtime), mtime: toUnixTimeFromEpoch(mtime),
@ -314,7 +322,7 @@
atime, atime,
mtime, mtime,
) { ) {
sendSync("op_utime_sync", { core.jsonOpSync("op_utime_sync", {
path, path,
atime: toUnixTimeFromEpoch(atime), atime: toUnixTimeFromEpoch(atime),
mtime: toUnixTimeFromEpoch(mtime), mtime: toUnixTimeFromEpoch(mtime),
@ -326,7 +334,7 @@
atime, atime,
mtime, mtime,
) { ) {
await sendAsync("op_utime_async", { await core.jsonOpAsync("op_utime_async", {
path, path,
atime: toUnixTimeFromEpoch(atime), atime: toUnixTimeFromEpoch(atime),
mtime: toUnixTimeFromEpoch(mtime), mtime: toUnixTimeFromEpoch(mtime),
@ -338,7 +346,7 @@
newpath, newpath,
options, options,
) { ) {
sendSync("op_symlink_sync", { oldpath, newpath, options }); core.jsonOpSync("op_symlink_sync", { oldpath, newpath, options });
} }
async function symlink( async function symlink(
@ -346,23 +354,23 @@
newpath, newpath,
options, options,
) { ) {
await sendAsync("op_symlink_async", { oldpath, newpath, options }); await core.jsonOpAsync("op_symlink_async", { oldpath, newpath, options });
} }
function fdatasyncSync(rid) { function fdatasyncSync(rid) {
sendSync("op_fdatasync_sync", { rid }); core.jsonOpSync("op_fdatasync_sync", { rid });
} }
async function fdatasync(rid) { async function fdatasync(rid) {
await sendAsync("op_fdatasync_async", { rid }); await core.jsonOpAsync("op_fdatasync_async", { rid });
} }
function fsyncSync(rid) { function fsyncSync(rid) {
sendSync("op_fsync_sync", { rid }); core.jsonOpSync("op_fsync_sync", { rid });
} }
async function fsync(rid) { async function fsync(rid) {
await sendAsync("op_fsync_async", { rid }); await core.jsonOpAsync("op_fsync_async", { rid });
} }
window.__bootstrap.fs = { window.__bootstrap.fs = {

View file

@ -1,10 +1,10 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendSync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
function metrics() { function metrics() {
return sendSync("op_metrics"); return core.jsonOpSync("op_metrics");
} }
window.__bootstrap.metrics = { window.__bootstrap.metrics = {

View file

@ -1,10 +1,10 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const core = window.Deno.core;
const { errors } = window.__bootstrap.errors; const { errors } = window.__bootstrap.errors;
const { read, write } = window.__bootstrap.io; const { read, write } = window.__bootstrap.io;
const { close } = window.__bootstrap.resources; const { close } = window.__bootstrap.resources;
const { sendSync, sendAsync } = window.__bootstrap.dispatchJson;
const ShutdownMode = { const ShutdownMode = {
// See http://man7.org/linux/man-pages/man2/shutdown.2.html // See http://man7.org/linux/man-pages/man2/shutdown.2.html
@ -18,7 +18,7 @@
}; };
function shutdown(rid, how) { function shutdown(rid, how) {
sendSync("op_shutdown", { rid, how }); core.jsonOpSync("op_shutdown", { rid, how });
return Promise.resolve(); return Promise.resolve();
} }
@ -26,15 +26,15 @@
rid, rid,
transport, transport,
) { ) {
return sendAsync("op_accept", { rid, transport }); return core.jsonOpAsync("op_accept", { rid, transport });
} }
function opListen(args) { function opListen(args) {
return sendSync("op_listen", args); return core.jsonOpSync("op_listen", args);
} }
function opConnect(args) { function opConnect(args) {
return sendAsync("op_connect", args); return core.jsonOpAsync("op_connect", args);
} }
function opReceive( function opReceive(
@ -42,11 +42,15 @@
transport, transport,
zeroCopy, zeroCopy,
) { ) {
return sendAsync("op_datagram_receive", { rid, transport }, zeroCopy); return core.jsonOpAsync(
"op_datagram_receive",
{ rid, transport },
zeroCopy,
);
} }
function opSend(args, zeroCopy) { function opSend(args, zeroCopy) {
return sendAsync("op_datagram_send", args, zeroCopy); return core.jsonOpAsync("op_datagram_send", args, zeroCopy);
} }
class Conn { class Conn {

View file

@ -1,52 +1,52 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const sendSync = window.__bootstrap.dispatchJson.sendSync; const core = window.Deno.core;
function loadavg() { function loadavg() {
return sendSync("op_loadavg"); return core.jsonOpSync("op_loadavg");
} }
function hostname() { function hostname() {
return sendSync("op_hostname"); return core.jsonOpSync("op_hostname");
} }
function osRelease() { function osRelease() {
return sendSync("op_os_release"); return core.jsonOpSync("op_os_release");
} }
function systemMemoryInfo() { function systemMemoryInfo() {
return sendSync("op_system_memory_info"); return core.jsonOpSync("op_system_memory_info");
} }
function exit(code = 0) { function exit(code = 0) {
sendSync("op_exit", { code }); core.jsonOpSync("op_exit", { code });
throw new Error("Code not reachable"); throw new Error("Code not reachable");
} }
function setEnv(key, value) { function setEnv(key, value) {
sendSync("op_set_env", { key, value }); core.jsonOpSync("op_set_env", { key, value });
} }
function getEnv(key) { function getEnv(key) {
return sendSync("op_get_env", { key })[0]; return core.jsonOpSync("op_get_env", { key })[0];
} }
function deleteEnv(key) { function deleteEnv(key) {
sendSync("op_delete_env", { key }); core.jsonOpSync("op_delete_env", { key });
} }
const env = { const env = {
get: getEnv, get: getEnv,
toObject() { toObject() {
return sendSync("op_env"); return core.jsonOpSync("op_env");
}, },
set: setEnv, set: setEnv,
delete: deleteEnv, delete: deleteEnv,
}; };
function execPath() { function execPath() {
return sendSync("op_exec_path"); return core.jsonOpSync("op_exec_path");
} }
window.__bootstrap.os = { window.__bootstrap.os = {

View file

@ -3,17 +3,17 @@
// This file contains the runtime APIs which will dispatch work to the internal // This file contains the runtime APIs which will dispatch work to the internal
// compiler within Deno. // compiler within Deno.
((window) => { ((window) => {
const core = window.Deno.core;
const util = window.__bootstrap.util; const util = window.__bootstrap.util;
const { sendAsync } = window.__bootstrap.dispatchJson;
function opCompile(request) { function opCompile(request) {
return sendAsync("op_compile", request); return core.jsonOpAsync("op_compile", request);
} }
function opTranspile( function opTranspile(
request, request,
) { ) {
return sendAsync("op_transpile", request); return core.jsonOpAsync("op_transpile", request);
} }
function checkRelative(specifier) { function checkRelative(specifier) {

View file

@ -3,17 +3,17 @@
((window) => { ((window) => {
// Some of the code here is adapted directly from V8 and licensed under a BSD // Some of the code here is adapted directly from V8 and licensed under a BSD
// style license available here: https://github.com/v8/v8/blob/24886f2d1c565287d33d71e4109a53bf0b54b75c/LICENSE.v8 // style license available here: https://github.com/v8/v8/blob/24886f2d1c565287d33d71e4109a53bf0b54b75c/LICENSE.v8
const core = window.Deno.core;
const colors = window.__bootstrap.colors; const colors = window.__bootstrap.colors;
const assert = window.__bootstrap.util.assert; const assert = window.__bootstrap.util.assert;
const internals = window.__bootstrap.internals; const internals = window.__bootstrap.internals;
const dispatchJson = window.__bootstrap.dispatchJson;
function opFormatDiagnostics(diagnostics) { function opFormatDiagnostics(diagnostics) {
return dispatchJson.sendSync("op_format_diagnostic", diagnostics); return core.jsonOpSync("op_format_diagnostic", diagnostics);
} }
function opApplySourceMap(location) { function opApplySourceMap(location) {
const res = dispatchJson.sendSync("op_apply_source_map", location); const res = core.jsonOpSync("op_apply_source_map", location);
return { return {
fileName: res.fileName, fileName: res.fileName,
lineNumber: res.lineNumber, lineNumber: res.lineNumber,

View file

@ -1,7 +1,7 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendSync, sendAsync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
const { errors } = window.__bootstrap.errors; const { errors } = window.__bootstrap.errors;
const { close } = window.__bootstrap.resources; const { close } = window.__bootstrap.resources;
@ -10,7 +10,7 @@
constructor(paths, options) { constructor(paths, options) {
const { recursive } = options; const { recursive } = options;
this.#rid = sendSync("op_fs_events_open", { recursive, paths }); this.#rid = core.jsonOpSync("op_fs_events_open", { recursive, paths });
} }
get rid() { get rid() {
@ -19,7 +19,7 @@
async next() { async next() {
try { try {
return await sendAsync("op_fs_events_poll", { return await core.jsonOpAsync("op_fs_events_poll", {
rid: this.rid, rid: this.rid,
}); });
} catch (error) { } catch (error) {

View file

@ -1,18 +1,18 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendSync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
function opQuery(desc) { function opQuery(desc) {
return sendSync("op_query_permission", desc).state; return core.jsonOpSync("op_query_permission", desc).state;
} }
function opRevoke(desc) { function opRevoke(desc) {
return sendSync("op_revoke_permission", desc).state; return core.jsonOpSync("op_revoke_permission", desc).state;
} }
function opRequest(desc) { function opRequest(desc) {
return sendSync("op_request_permission", desc).state; return core.jsonOpSync("op_request_permission", desc).state;
} }
class PermissionStatus { class PermissionStatus {

View file

@ -1,10 +1,10 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendSync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
function openPlugin(filename) { function openPlugin(filename) {
return sendSync("op_open_plugin", { filename }); return core.jsonOpSync("op_open_plugin", { filename });
} }
window.__bootstrap.plugins = { window.__bootstrap.plugins = {

View file

@ -1,23 +1,23 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const core = window.Deno.core;
const { File } = window.__bootstrap.files; const { File } = window.__bootstrap.files;
const { close } = window.__bootstrap.resources; const { close } = window.__bootstrap.resources;
const { readAll } = window.__bootstrap.buffer; const { readAll } = window.__bootstrap.buffer;
const { sendSync, sendAsync } = window.__bootstrap.dispatchJson;
const { assert, pathFromURL } = window.__bootstrap.util; const { assert, pathFromURL } = window.__bootstrap.util;
function opKill(pid, signo) { function opKill(pid, signo) {
sendSync("op_kill", { pid, signo }); core.jsonOpSync("op_kill", { pid, signo });
} }
function opRunStatus(rid) { function opRunStatus(rid) {
return sendAsync("op_run_status", { rid }); return core.jsonOpAsync("op_run_status", { rid });
} }
function opRun(request) { function opRun(request) {
assert(request.cmd.length > 0); assert(request.cmd.length > 0);
return sendSync("op_run", request); return core.jsonOpSync("op_run", request);
} }
async function runStatus(rid) { async function runStatus(rid) {

View file

@ -4,16 +4,15 @@
const core = window.Deno.core; const core = window.Deno.core;
const exit = window.__bootstrap.os.exit; const exit = window.__bootstrap.os.exit;
const version = window.__bootstrap.version.version; const version = window.__bootstrap.version.version;
const dispatchJson = window.__bootstrap.dispatchJson;
const close = window.__bootstrap.resources.close; const close = window.__bootstrap.resources.close;
const inspectArgs = window.__bootstrap.console.inspectArgs; const inspectArgs = window.__bootstrap.console.inspectArgs;
function opStartRepl(historyFile) { function opStartRepl(historyFile) {
return dispatchJson.sendSync("op_repl_start", { historyFile }); return core.jsonOpSync("op_repl_start", { historyFile });
} }
function opReadline(rid, prompt) { function opReadline(rid, prompt) {
return dispatchJson.sendAsync("op_repl_readline", { rid, prompt }); return core.jsonOpAsync("op_repl_readline", { rid, prompt });
} }
function replLog(...args) { function replLog(...args) {

View file

@ -1,19 +1,19 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendSync, sendAsync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
const { build } = window.__bootstrap.build; const { build } = window.__bootstrap.build;
function bindSignal(signo) { function bindSignal(signo) {
return sendSync("op_signal_bind", { signo }); return core.jsonOpSync("op_signal_bind", { signo });
} }
function pollSignal(rid) { function pollSignal(rid) {
return sendAsync("op_signal_poll", { rid }); return core.jsonOpAsync("op_signal_poll", { rid });
} }
function unbindSignal(rid) { function unbindSignal(rid) {
sendSync("op_signal_unbind", { rid }); core.jsonOpSync("op_signal_unbind", { rid });
} }
// From `kill -l` // From `kill -l`

View file

@ -1,25 +1,25 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const core = window.Deno.core;
const { Listener, Conn } = window.__bootstrap.net; const { Listener, Conn } = window.__bootstrap.net;
const { sendAsync, sendSync } = window.__bootstrap.dispatchJson;
function opConnectTls( function opConnectTls(
args, args,
) { ) {
return sendAsync("op_connect_tls", args); return core.jsonOpAsync("op_connect_tls", args);
} }
function opAcceptTLS(rid) { function opAcceptTLS(rid) {
return sendAsync("op_accept_tls", { rid }); return core.jsonOpAsync("op_accept_tls", { rid });
} }
function opListenTls(args) { function opListenTls(args) {
return sendSync("op_listen_tls", args); return core.jsonOpSync("op_listen_tls", args);
} }
function opStartTls(args) { function opStartTls(args) {
return sendAsync("op_start_tls", args); return core.jsonOpAsync("op_start_tls", args);
} }
async function connectTls({ async function connectTls({

View file

@ -1,18 +1,18 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const { sendSync } = window.__bootstrap.dispatchJson; const core = window.Deno.core;
function consoleSize(rid) { function consoleSize(rid) {
return sendSync("op_console_size", { rid }); return core.jsonOpSync("op_console_size", { rid });
} }
function isatty(rid) { function isatty(rid) {
return sendSync("op_isatty", { rid }); return core.jsonOpSync("op_isatty", { rid });
} }
function setRaw(rid, mode) { function setRaw(rid, mode) {
sendSync("op_set_raw", { rid, mode }); core.jsonOpSync("op_set_raw", { rid, mode });
} }
window.__bootstrap.tty = { window.__bootstrap.tty = {

View file

@ -7,7 +7,6 @@ delete Object.prototype.__proto__;
const core = Deno.core; const core = Deno.core;
const util = window.__bootstrap.util; const util = window.__bootstrap.util;
const eventTarget = window.__bootstrap.eventTarget; const eventTarget = window.__bootstrap.eventTarget;
const dispatchJson = window.__bootstrap.dispatchJson;
const dispatchMinimal = window.__bootstrap.dispatchMinimal; const dispatchMinimal = window.__bootstrap.dispatchMinimal;
const build = window.__bootstrap.build; const build = window.__bootstrap.build;
const version = window.__bootstrap.version; const version = window.__bootstrap.version;
@ -129,29 +128,19 @@ delete Object.prototype.__proto__;
} }
function opPostMessage(data) { function opPostMessage(data) {
dispatchJson.sendSync("op_worker_post_message", {}, data); core.jsonOpSync("op_worker_post_message", {}, data);
} }
function opCloseWorker() { function opCloseWorker() {
dispatchJson.sendSync("op_worker_close"); core.jsonOpSync("op_worker_close");
} }
function opStart() { function opStart() {
return dispatchJson.sendSync("op_start"); return core.jsonOpSync("op_start");
} }
function opMainModule() { function opMainModule() {
return dispatchJson.sendSync("op_main_module"); return core.jsonOpSync("op_main_module");
}
function getAsyncHandler(opName) {
switch (opName) {
case "op_write":
case "op_read":
return dispatchMinimal.asyncMsgFromRust;
default:
return dispatchJson.asyncMsgFromRust;
}
} }
// TODO(bartlomieju): temporary solution, must be fixed when moving // TODO(bartlomieju): temporary solution, must be fixed when moving
@ -159,7 +148,9 @@ delete Object.prototype.__proto__;
function initOps() { function initOps() {
const opsMap = core.ops(); const opsMap = core.ops();
for (const [name, opId] of Object.entries(opsMap)) { for (const [name, opId] of Object.entries(opsMap)) {
core.setAsyncHandler(opId, getAsyncHandler(name)); if (name === "op_write" || name === "op_read") {
core.setAsyncHandler(opId, dispatchMinimal.asyncMsgFromRust);
}
} }
core.setMacrotaskCallback(timers.handleTimerMacrotask); core.setMacrotaskCallback(timers.handleTimerMacrotask);
} }

View file

@ -1,4 +1,3 @@
[WILDCARD]error: Uncaught BadResource: Bad resource ID [WILDCARD]error: Uncaught BadResource: Bad resource ID
at unwrapResponse ([WILDCARD]dispatch_json.js:[WILDCARD]) [WILDCARD]
at sendAsync ([WILDCARD]dispatch_json.js:[WILDCARD])
at async main ([WILDCARD]tests/044_bad_resource.ts:[WILDCARD]) at async main ([WILDCARD]tests/044_bad_resource.ts:[WILDCARD])

View file

@ -2,6 +2,3 @@ Check [WILDCARD]compiler_js_error.ts
error: Uncaught Error: Error in TS compiler: error: Uncaught Error: Error in TS compiler:
Uncaught AssertionError: Unexpected skip of the emit. Uncaught AssertionError: Unexpected skip of the emit.
[WILDCARD] [WILDCARD]
at unwrapResponse ([WILDCARD]dispatch_json.js:[WILDCARD])
at sendAsync ([WILDCARD]dispatch_json.js:[WILDCARD])
at async Object.compile ([WILDCARD]compiler_api.js:[WILDCARD])

View file

@ -329,9 +329,9 @@ unitTest(async function bufferReadFromSync(): Promise<void> {
unitTest(async function bufferTestGrow(): Promise<void> { unitTest(async function bufferTestGrow(): Promise<void> {
const tmp = new Uint8Array(72); const tmp = new Uint8Array(72);
for (const startLen of [0, 100, 1000, 10000, 100000]) { for (const startLen of [0, 100, 1000, 10000]) {
const xBytes = repeat("x", startLen); const xBytes = repeat("x", startLen);
for (const growLen of [0, 100, 1000, 10000, 100000]) { for (const growLen of [0, 100, 1000, 10000]) {
const buf = new Deno.Buffer(xBytes.buffer as ArrayBuffer); const buf = new Deno.Buffer(xBytes.buffer as ArrayBuffer);
// If we read, this affects buf.off, which is good to test. // If we read, this affects buf.off, which is good to test.
const nread = (await buf.read(tmp)) ?? 0; const nread = (await buf.read(tmp)) ?? 0;

View file

@ -2,28 +2,8 @@ import {
assertStrictEquals, assertStrictEquals,
unitTest, unitTest,
assertMatch, assertMatch,
unreachable,
} from "./test_util.ts"; } from "./test_util.ts";
const openErrorStackPattern = new RegExp(
`^.*
at unwrapResponse \\(.*dispatch_json\\.js:.*\\)
at sendAsync \\(.*dispatch_json\\.js:.*\\)
at async Object\\.open \\(.*files\\.js:.*\\).*$`,
"ms",
);
unitTest(
{ perms: { read: true } },
async function sendAsyncStackTrace(): Promise<void> {
await Deno.open("nonexistent.txt")
.then(unreachable)
.catch((error): void => {
assertMatch(error.stack, openErrorStackPattern);
});
},
);
declare global { declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace // eslint-disable-next-line @typescript-eslint/no-namespace
namespace Deno { namespace Deno {

View file

@ -1,84 +0,0 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => {
const core = window.Deno.core;
const util = window.__bootstrap.util;
// Using an object without a prototype because `Map` was causing GC problems.
const promiseTable = Object.create(null);
let _nextPromiseId = 1;
function nextPromiseId() {
return _nextPromiseId++;
}
function decode(ui8) {
return JSON.parse(core.decode(ui8));
}
function encode(args) {
return core.encode(JSON.stringify(args));
}
function unwrapResponse(res) {
if (res.err != null) {
throw new (core.getErrorClass(res.err.className))(res.err.message);
}
util.assert(res.ok != null);
return res.ok;
}
function asyncMsgFromRust(resUi8) {
const res = decode(resUi8);
util.assert(res.promiseId != null);
const promise = promiseTable[res.promiseId];
util.assert(promise != null);
delete promiseTable[res.promiseId];
promise.resolve(res);
}
function sendSync(
opName,
args = {},
...zeroCopy
) {
util.log("sendSync", opName);
const argsUi8 = encode(args);
const resUi8 = core.dispatchByName(opName, argsUi8, ...zeroCopy);
util.assert(resUi8 != null);
const res = decode(resUi8);
util.assert(res.promiseId == null);
return unwrapResponse(res);
}
async function sendAsync(
opName,
args = {},
...zeroCopy
) {
util.log("sendAsync", opName);
const promiseId = nextPromiseId();
args = Object.assign(args, { promiseId });
const promise = util.createResolvable();
const argsUi8 = encode(args);
const buf = core.dispatchByName(opName, argsUi8, ...zeroCopy);
if (buf != null) {
// Sync result.
const res = decode(buf);
promise.resolve(res);
} else {
// Async result.
promiseTable[promiseId] = promise;
}
const res = await promise;
return unwrapResponse(res);
}
window.__bootstrap.dispatchJson = {
asyncMsgFromRust,
sendSync,
sendAsync,
};
})(this);

View file

@ -17,9 +17,8 @@
delete Object.prototype.__proto__; delete Object.prototype.__proto__;
((window) => { ((window) => {
const core = Deno.core; const core = window.Deno.core;
const { assert, log, notImplemented } = window.__bootstrap.util; const { assert, log, notImplemented } = window.__bootstrap.util;
const dispatchJson = window.__bootstrap.dispatchJson;
const util = window.__bootstrap.util; const util = window.__bootstrap.util;
const errorStack = window.__bootstrap.errorStack; const errorStack = window.__bootstrap.errorStack;
const errors = window.__bootstrap.errors.errors; const errors = window.__bootstrap.errors.errors;
@ -78,7 +77,7 @@ delete Object.prototype.__proto__;
} }
function opNow() { function opNow() {
const res = dispatchJson.sendSync("op_now"); const res = core.jsonOpSync("op_now");
return res.seconds * 1e3 + res.subsecNanos / 1e6; return res.seconds * 1e3 + res.subsecNanos / 1e6;
} }
@ -1252,7 +1251,7 @@ delete Object.prototype.__proto__;
} }
function opCompilerRespond(msg) { function opCompilerRespond(msg) {
dispatchJson.sendSync("op_compiler_respond", msg); core.jsonOpSync("op_compiler_respond", msg);
} }
async function tsCompilerOnMessage(msg) { async function tsCompilerOnMessage(msg) {
@ -1292,21 +1291,12 @@ delete Object.prototype.__proto__;
} }
} }
// TODO(bartlomieju): temporary solution, must be fixed when moving
// dispatches to separate crates
function initOps() {
const opsMap = core.ops();
for (const [_name, opId] of Object.entries(opsMap)) {
core.setAsyncHandler(opId, dispatchJson.asyncMsgFromRust);
}
}
function runtimeStart(source) { function runtimeStart(source) {
initOps(); core.ops();
// First we send an empty `Start` message to let the privileged side know we // First we send an empty `Start` message to let the privileged side know we
// are ready. The response should be a `StartRes` message containing the CLI // are ready. The response should be a `StartRes` message containing the CLI
// args and other info. // args and other info.
const s = dispatchJson.sendSync("op_start"); const s = core.jsonOpSync("op_start");
util.setLogDebug(s.debugFlag, source); util.setLogDebug(s.debugFlag, source);
errorStack.setPrepareStackTrace(Error); errorStack.setPrepareStackTrace(Error);
return s; return s;

View file

@ -208,14 +208,14 @@ SharedQueue Binary Layout
} }
function decodeJson(ui8) { function decodeJson(ui8) {
const s = Deno.core.decode(ui8); const s = core.decode(ui8);
return JSON.parse(s); return JSON.parse(s);
} }
let nextPromiseId = 1; let nextPromiseId = 1;
const promiseTable = {}; const promiseTable = {};
function jsonOpAsync(opName, args, ...zeroCopy) { async function jsonOpAsync(opName, args = {}, ...zeroCopy) {
setAsyncHandler(opsCache[opName], jsonOpAsyncHandler); setAsyncHandler(opsCache[opName], jsonOpAsyncHandler);
args.promiseId = nextPromiseId++; args.promiseId = nextPromiseId++;
@ -229,31 +229,31 @@ SharedQueue Binary Layout
promise.resolve = resolve; promise.resolve = resolve;
promise.reject = reject; promise.reject = reject;
promiseTable[args.promiseId] = promise; promiseTable[args.promiseId] = promise;
return promise; const res = await promise;
if ("ok" in res) {
return res.ok;
} else {
throw new (getErrorClass(res.err.className))(res.err.message);
}
} }
function jsonOpSync(opName, args, ...zeroCopy) { function jsonOpSync(opName, args = {}, ...zeroCopy) {
const argsBuf = encodeJson(args); const argsBuf = encodeJson(args);
const res = dispatch(opName, argsBuf, ...zeroCopy); const res = dispatch(opName, argsBuf, ...zeroCopy);
const r = decodeJson(res); const r = decodeJson(res);
if ("ok" in r) { if ("ok" in r) {
return r.ok; return r.ok;
} else { } else {
throw r.err; throw new (getErrorClass(r.err.className))(r.err.message);
} }
} }
function jsonOpAsyncHandler(buf) { function jsonOpAsyncHandler(buf) {
// Json Op. // Json Op.
const msg = decodeJson(buf); const res = decodeJson(buf);
const { ok, err, promiseId } = msg; const promise = promiseTable[res.promiseId];
const promise = promiseTable[promiseId]; delete promiseTable[res.promiseId];
delete promiseTable[promiseId]; promise.resolve(res);
if (ok) {
promise.resolve(ok);
} else {
promise.reject(err);
}
} }
Object.assign(window.Deno.core, { Object.assign(window.Deno.core, {