diff options
Diffstat (limited to 'js/fbs_util.ts')
-rw-r--r-- | js/fbs_util.ts | 68 |
1 files changed, 59 insertions, 9 deletions
diff --git a/js/fbs_util.ts b/js/fbs_util.ts index bb623d54d..16f3b6ca2 100644 --- a/js/fbs_util.ts +++ b/js/fbs_util.ts @@ -1,27 +1,77 @@ // Copyright 2018 the Deno authors. All rights reserved. MIT license. +// TODO Rename this file to //js/dispatch.ts import { libdeno } from "./libdeno"; import { flatbuffers } from "flatbuffers"; -import { maybeThrowError } from "./errors"; import { deno as fbs } from "gen/msg_generated"; +import * as errors from "./errors"; +import * as util from "./util"; + +let nextCmdId = 0; +const promiseTable = new Map<number, util.Resolvable<fbs.Base>>(); + +export function handleAsyncMsgFromRust(ui8: Uint8Array) { + const bb = new flatbuffers.ByteBuffer(ui8); + const base = fbs.Base.getRootAsBase(bb); + + const cmdId = base.cmdId(); + const promise = promiseTable.get(cmdId); + util.assert(promise != null, `Expecting promise in table. ${cmdId}`); + promiseTable.delete(cmdId); + const err = errors.maybeError(base); + if (err != null) { + promise!.reject(err); + } else { + promise!.resolve(base); + } +} // @internal +export function sendAsync( + builder: flatbuffers.Builder, + msgType: fbs.Any, + msg: flatbuffers.Offset +): Promise<fbs.Base> { + const [cmdId, resBuf] = sendInternal(builder, msgType, msg, false); + util.assert(resBuf == null); + const promise = util.createResolvable<fbs.Base>(); + promiseTable.set(cmdId, promise); + return promise; +} + +// TODO Rename to sendSync +// @internal export function send( builder: flatbuffers.Builder, msgType: fbs.Any, msg: flatbuffers.Offset ): null | fbs.Base { - fbs.Base.startBase(builder); - fbs.Base.addMsg(builder, msg); - fbs.Base.addMsgType(builder, msgType); - builder.finish(fbs.Base.endBase(builder)); - - const resBuf = libdeno.send(builder.asUint8Array()); + const [cmdId, resBuf] = sendInternal(builder, msgType, msg, true); + util.assert(cmdId >= 0); if (resBuf == null) { return null; } else { - const bb = new flatbuffers.ByteBuffer(new Uint8Array(resBuf!)); + const u8 = new Uint8Array(resBuf!); + // console.log("recv sync message", util.hexdump(u8)); + const bb = new flatbuffers.ByteBuffer(u8); const baseRes = fbs.Base.getRootAsBase(bb); - maybeThrowError(baseRes); + errors.maybeThrowError(baseRes); return baseRes; } } + +function sendInternal( + builder: flatbuffers.Builder, + msgType: fbs.Any, + msg: flatbuffers.Offset, + sync = true +): [number, null | Uint8Array] { + const cmdId = nextCmdId++; + fbs.Base.startBase(builder); + fbs.Base.addMsg(builder, msg); + fbs.Base.addMsgType(builder, msgType); + fbs.Base.addSync(builder, sync); + fbs.Base.addCmdId(builder, cmdId); + builder.finish(fbs.Base.endBase(builder)); + + return [cmdId, libdeno.send(builder.asUint8Array())]; +} |