summaryrefslogtreecommitdiff
path: root/js/dispatch.ts
diff options
context:
space:
mode:
authorBert Belder <bertbelder@gmail.com>2018-10-02 17:47:40 -0700
committerBert Belder <bertbelder@gmail.com>2018-10-03 13:27:55 -0700
commitaa691ea26c5dc8fd15b3b60b95a2c23b4888c45d (patch)
treef2e168a022e597ee1ceaf8cf50c1f1fbf5efe4cb /js/dispatch.ts
parent6b77acf39ddcb68b26e877f8c4a9dc289cd3691e (diff)
timers: implement timers in javascript
Diffstat (limited to 'js/dispatch.ts')
-rw-r--r--js/dispatch.ts34
1 files changed, 23 insertions, 11 deletions
diff --git a/js/dispatch.ts b/js/dispatch.ts
index 9257be767..56d280ff9 100644
--- a/js/dispatch.ts
+++ b/js/dispatch.ts
@@ -9,19 +9,31 @@ import { maybePushTrace } from "./trace";
let nextCmdId = 0;
const promiseTable = new Map<number, util.Resolvable<fbs.Base>>();
+let fireTimers: () => void;
+
+export function setFireTimersCallback(fn: () => void) {
+ fireTimers = fn;
+}
+
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);
+ // If a the buffer is empty, recv() on the native side timed out and we
+ // did not receive a message.
+ if (ui8.length) {
+ 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);
+ }
}
+ // Fire timers that have become runnable.
+ fireTimers();
}
// @internal