summaryrefslogtreecommitdiff
path: root/core/core.js
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2020-08-20 09:45:59 -0400
committerGitHub <noreply@github.com>2020-08-20 09:45:59 -0400
commit0095611af98d3039e30ff44444ab83f65bcec554 (patch)
tree2c87ec9c7fc39f5a0af83c179b7f14493a8b6b95 /core/core.js
parentbe1e7ab5320c0a110998818c3916c79b39710613 (diff)
First pass at json ops in core (#7033)
Adds Deno.core.jsonOpSync and Deno.core.jsonOpAsync
Diffstat (limited to 'core/core.js')
-rw-r--r--core/core.js57
1 files changed, 57 insertions, 0 deletions
diff --git a/core/core.js b/core/core.js
index 5f9d6f981..099472614 100644
--- a/core/core.js
+++ b/core/core.js
@@ -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,