summaryrefslogtreecommitdiff
path: root/core/core.js
diff options
context:
space:
mode:
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,