diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2020-08-20 09:45:59 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-20 09:45:59 -0400 |
commit | 0095611af98d3039e30ff44444ab83f65bcec554 (patch) | |
tree | 2c87ec9c7fc39f5a0af83c179b7f14493a8b6b95 /core/core.js | |
parent | be1e7ab5320c0a110998818c3916c79b39710613 (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.js | 57 |
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, |