summaryrefslogtreecommitdiff
path: root/js/dispatch.ts
diff options
context:
space:
mode:
authorandy finch <andyfinch7@gmail.com>2019-06-17 21:02:08 -0400
committerRyan Dahl <ry@tinyclouds.org>2019-06-17 18:02:08 -0700
commit76d51b0f9a4bd0ff86150d0dfa78df7c8410b7ea (patch)
treeee707fcac13634d999e39168702c4c51d429ebff /js/dispatch.ts
parent9ad5b0653e3821915d7ab7438d5ed4fe373c569a (diff)
refactor dispatch take 2 (#2533)
Diffstat (limited to 'js/dispatch.ts')
-rw-r--r--js/dispatch.ts58
1 files changed, 40 insertions, 18 deletions
diff --git a/js/dispatch.ts b/js/dispatch.ts
index 0c6e70709..cd11c93f6 100644
--- a/js/dispatch.ts
+++ b/js/dispatch.ts
@@ -56,13 +56,27 @@ function sendInternal(
innerType: msg.Any,
inner: flatbuffers.Offset,
zeroCopy: undefined | ArrayBufferView,
- sync = true
-): [number, null | Uint8Array] {
+ isSync: true
+): Uint8Array;
+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 {
const cmdId = nextPromiseId();
msg.Base.startBase(builder);
msg.Base.addInner(builder, inner);
msg.Base.addInnerType(builder, innerType);
- msg.Base.addSync(builder, sync);
+ msg.Base.addSync(builder, isSync);
msg.Base.addCmdId(builder, cmdId);
builder.finish(msg.Base.endBase(builder));
@@ -74,7 +88,27 @@ function sendInternal(
);
builder.inUse = false;
- return [cmdId, response];
+
+ if (response == null) {
+ util.assert(!isSync);
+ const promise = util.createResolvable<msg.Base>();
+ promiseTable.set(cmdId, promise);
+ return promise;
+ } else {
+ if (!isSync) {
+ // We can easily and correctly allow for sync responses to async calls
+ // by creating and returning a promise from the sync response.
+ const bb = new flatbuffers.ByteBuffer(response);
+ const base = msg.Base.getRootAsBase(bb);
+ const err = errors.maybeError(base);
+ if (err != null) {
+ return Promise.reject(err);
+ } else {
+ return Promise.resolve(base);
+ }
+ }
+ return response;
+ }
}
// @internal
@@ -84,17 +118,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);
- return promise;
+ return sendInternal(builder, innerType, inner, data, false);
}
// @internal
@@ -104,9 +128,7 @@ 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.
+ const response = sendInternal(builder, innerType, inner, data, true);
if (response!.length === 0) {
return null;
} else {