First pass at json ops in core (#7033)

Adds Deno.core.jsonOpSync and Deno.core.jsonOpAsync
This commit is contained in:
Ryan Dahl 2020-08-20 09:45:59 -04:00 committed by GitHub
parent be1e7ab532
commit 0095611af9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 151 additions and 20 deletions

View file

@ -201,7 +201,64 @@ SharedQueue Binary Layout
return errorClass;
}
// Returns Uint8Array
function encodeJson(args) {
const s = JSON.stringify(args);
return core.encode(s);
}
function decodeJson(ui8) {
const s = Deno.core.decode(ui8);
return JSON.parse(s);
}
let nextPromiseId = 1;
const promiseTable = {};
function jsonOpAsync(opName, args) {
setAsyncHandler(opsCache[opName], jsonOpAsyncHandler);
args.promiseId = nextPromiseId++;
const argsBuf = encodeJson(args);
dispatch(opName, argsBuf);
let resolve, reject;
const promise = new Promise((resolve_, reject_) => {
resolve = resolve_;
reject = reject_;
});
promise.resolve = resolve;
promise.reject = reject;
promiseTable[args.promiseId] = promise;
return promise;
}
function jsonOpSync(opName, args) {
const argsBuf = encodeJson(args);
const res = dispatch(opName, argsBuf);
const r = decodeJson(res);
if (r["ok"]) {
return r["ok"];
} else {
throw r["err"];
}
}
function jsonOpAsyncHandler(buf) {
// Json Op.
const msg = decodeJson(buf);
const { ok, err, promiseId } = msg;
const promise = promiseTable[promiseId];
delete promiseTable[promiseId];
if (ok) {
promise.resolve(ok);
} else {
promise.reject(err);
}
}
Object.assign(window.Deno.core, {
jsonOpAsync,
jsonOpSync,
setAsyncHandler,
dispatch: send,
dispatchByName: dispatch,