diff options
author | andy finch <andyfinch7@gmail.com> | 2019-06-17 21:02:08 -0400 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2019-06-17 18:02:08 -0700 |
commit | 76d51b0f9a4bd0ff86150d0dfa78df7c8410b7ea (patch) | |
tree | ee707fcac13634d999e39168702c4c51d429ebff /js | |
parent | 9ad5b0653e3821915d7ab7438d5ed4fe373c569a (diff) |
refactor dispatch take 2 (#2533)
Diffstat (limited to 'js')
-rw-r--r-- | js/dispatch.ts | 58 |
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 { |