summaryrefslogtreecommitdiff
path: root/js/dispatch.ts
diff options
context:
space:
mode:
authorandy finch <andyfinch7@gmail.com>2019-06-13 23:43:54 -0400
committerRyan Dahl <ry@tinyclouds.org>2019-06-13 20:43:54 -0700
commitdc60fe9f300043f191286ef804a365e16e455f87 (patch)
treec6b74e9faa6f26745b8770a18d0ae46ee34f3774 /js/dispatch.ts
parentfdd2eb538327ee3f50fe2869320411191830c985 (diff)
Refactor dispatch handling (#2452)
Promise id is now created in core and passed back to JS.
Diffstat (limited to 'js/dispatch.ts')
-rw-r--r--js/dispatch.ts81
1 files changed, 47 insertions, 34 deletions
diff --git a/js/dispatch.ts b/js/dispatch.ts
index 0c6e70709..36f97363f 100644
--- a/js/dispatch.ts
+++ b/js/dispatch.ts
@@ -5,36 +5,30 @@ import * as msg from "gen/cli/msg_generated";
import * as errors from "./errors";
import * as util from "./util";
import {
- nextPromiseId,
recordFromBufMinimal,
handleAsyncMsgFromRustMinimal
} from "./dispatch_minimal";
const promiseTable = new Map<number, util.Resolvable<msg.Base>>();
-interface FlatbufferRecord {
- promiseId: number;
- base: msg.Base;
-}
-
-function flatbufferRecordFromBuf(buf: Uint8Array): FlatbufferRecord {
+function flatbufferRecordFromBuf(buf: Uint8Array): msg.Base {
const bb = new flatbuffers.ByteBuffer(buf);
const base = msg.Base.getRootAsBase(bb);
- return {
- promiseId: base.cmdId(),
- base
- };
+ return base;
}
-export function handleAsyncMsgFromRust(ui8: Uint8Array): void {
+export function handleAsyncMsgFromRust(
+ promiseId: number,
+ ui8: Uint8Array
+): void {
const buf32 = new Int32Array(ui8.buffer, ui8.byteOffset, ui8.byteLength / 4);
const recordMin = recordFromBufMinimal(buf32);
if (recordMin) {
// Fast and new
- handleAsyncMsgFromRustMinimal(ui8, recordMin);
+ handleAsyncMsgFromRustMinimal(promiseId, ui8, recordMin);
} else {
// Legacy
- let { promiseId, base } = flatbufferRecordFromBuf(ui8);
+ let base = flatbufferRecordFromBuf(ui8);
const promise = promiseTable.get(promiseId);
util.assert(promise != null, `Expecting promise in table. ${promiseId}`);
promiseTable.delete(promiseId);
@@ -56,14 +50,26 @@ function sendInternal(
innerType: msg.Any,
inner: flatbuffers.Offset,
zeroCopy: undefined | ArrayBufferView,
- sync = true
-): [number, null | Uint8Array] {
- const cmdId = nextPromiseId();
+ isSync: true
+): Uint8Array | null;
+function sendInternal(
+ builder: flatbuffers.Builder,
+ innerType: msg.Any,
+ inner: flatbuffers.Offset,
+ zeroCopy: undefined | ArrayBufferView,
+ isSync: false
+): Promise<msg.Base>;
+function sendInternal(
+ builder: flatbuffers.Builder,
+ innerType: msg.Any,
+ inner: flatbuffers.Offset,
+ zeroCopy: undefined | ArrayBufferView,
+ isSync: boolean
+): Promise<msg.Base> | Uint8Array | null {
msg.Base.startBase(builder);
+ msg.Base.addSync(builder, isSync);
msg.Base.addInner(builder, inner);
msg.Base.addInnerType(builder, innerType);
- msg.Base.addSync(builder, sync);
- msg.Base.addCmdId(builder, cmdId);
builder.finish(msg.Base.endBase(builder));
const control = builder.asUint8Array();
@@ -74,7 +80,25 @@ function sendInternal(
);
builder.inUse = false;
- return [cmdId, response];
+
+ if (typeof response === "number") {
+ const promise = util.createResolvable<msg.Base>();
+ promiseTable.set(response, promise);
+ util.assert(!isSync);
+ return promise;
+ } else {
+ if (!isSync) {
+ util.assert(response !== null);
+ const base = flatbufferRecordFromBuf(response as Uint8Array);
+ const err = errors.maybeError(base);
+ if (err != null) {
+ return Promise.reject(err);
+ } else {
+ return Promise.resolve(base);
+ }
+ }
+ return response;
+ }
}
// @internal
@@ -84,16 +108,7 @@ export function sendAsync(
inner: flatbuffers.Offset,
data?: ArrayBufferView
): Promise<msg.Base> {
- const [cmdId, response] = sendInternal(
- builder,
- innerType,
- inner,
- data,
- false
- );
- util.assert(response == null); // null indicates async.
- const promise = util.createResolvable<msg.Base>();
- promiseTable.set(cmdId, promise);
+ const promise = sendInternal(builder, innerType, inner, data, false);
return promise;
}
@@ -104,10 +119,8 @@ export function sendSync(
inner: flatbuffers.Offset,
data?: ArrayBufferView
): null | msg.Base {
- const [cmdId, response] = sendInternal(builder, innerType, inner, data, true);
- util.assert(cmdId >= 0);
- util.assert(response != null); // null indicates async.
- if (response!.length === 0) {
+ const response = sendInternal(builder, innerType, inner, data, true);
+ if (response == null || response.length === 0) {
return null;
} else {
const bb = new flatbuffers.ByteBuffer(response!);