summaryrefslogtreecommitdiff
path: root/js/dispatch_minimal.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/dispatch_minimal.ts')
-rw-r--r--js/dispatch_minimal.ts77
1 files changed, 77 insertions, 0 deletions
diff --git a/js/dispatch_minimal.ts b/js/dispatch_minimal.ts
new file mode 100644
index 000000000..17d328110
--- /dev/null
+++ b/js/dispatch_minimal.ts
@@ -0,0 +1,77 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+// Do not add flatbuffer dependencies to this module.
+import * as util from "./util";
+import { core } from "./core";
+
+const DISPATCH_MINIMAL_TOKEN = 0xcafe;
+const promiseTableMin = new Map<number, util.Resolvable<number>>();
+let _nextPromiseId = 0;
+
+export function nextPromiseId(): number {
+ return _nextPromiseId++;
+}
+
+export interface RecordMinimal {
+ promiseId: number;
+ opId: number;
+ arg: number;
+ result: number;
+}
+
+/** Determines if a message has the "minimal" serialization format. If false, it
+ * is flatbuffer encoded.
+ */
+export function hasMinimalToken(i32: Int32Array): boolean {
+ return i32[0] == DISPATCH_MINIMAL_TOKEN;
+}
+
+export function recordFromBufMinimal(buf32: Int32Array): null | RecordMinimal {
+ if (hasMinimalToken(buf32)) {
+ return {
+ promiseId: buf32[1],
+ opId: buf32[2],
+ arg: buf32[3],
+ result: buf32[4]
+ };
+ }
+ return null;
+}
+
+const scratch32 = new Int32Array(5);
+const scratchBytes = new Uint8Array(
+ scratch32.buffer,
+ scratch32.byteOffset,
+ scratch32.byteLength
+);
+util.assert(scratchBytes.byteLength === scratch32.length * 4);
+
+export function handleAsyncMsgFromRustMinimal(
+ ui8: Uint8Array,
+ record: RecordMinimal
+): void {
+ // Fast and new
+ util.log("minimal handleAsyncMsgFromRust ", ui8.length);
+ const { promiseId, result } = record;
+ const promise = promiseTableMin.get(promiseId);
+ promiseTableMin.delete(promiseId);
+ promise!.resolve(result);
+}
+
+export function sendAsyncMinimal(
+ opId: number,
+ arg: number,
+ zeroCopy: Uint8Array
+): Promise<number> {
+ const promiseId = nextPromiseId(); // AKA cmdId
+
+ scratch32[0] = DISPATCH_MINIMAL_TOKEN;
+ scratch32[1] = promiseId;
+ scratch32[2] = opId;
+ scratch32[3] = arg;
+
+ const promise = util.createResolvable<number>();
+ promiseTableMin.set(promiseId, promise);
+
+ core.dispatch(scratchBytes, zeroCopy);
+ return promise;
+}