summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/core.ts13
-rw-r--r--js/dispatch.ts29
-rw-r--r--js/libdeno.ts7
-rw-r--r--js/os.ts4
4 files changed, 38 insertions, 15 deletions
diff --git a/js/core.ts b/js/core.ts
new file mode 100644
index 000000000..9e94ffdbb
--- /dev/null
+++ b/js/core.ts
@@ -0,0 +1,13 @@
+// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
+import { window } from "./window";
+
+type MessageCallback = (msg: Uint8Array) => void;
+
+// Declared in core/shared_queue.js.
+interface DenoCore {
+ setAsyncHandler(cb: MessageCallback): void;
+ dispatch(control: Uint8Array, zeroCopy?: Uint8Array): null | Uint8Array;
+}
+
+// TODO(ry) Rename to Deno.core.shared and Deno.core.setAsyncHandler.
+export const DenoCore = window.DenoCore as DenoCore;
diff --git a/js/dispatch.ts b/js/dispatch.ts
index 9dcd2f420..2e6cbf10f 100644
--- a/js/dispatch.ts
+++ b/js/dispatch.ts
@@ -1,5 +1,5 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
-import { libdeno } from "./libdeno";
+import { window } from "./window";
import * as flatbuffers from "./flatbuffers";
import * as msg from "gen/msg_generated";
import * as errors from "./errors";
@@ -9,7 +9,6 @@ let nextCmdId = 0;
const promiseTable = new Map<number, util.Resolvable<msg.Base>>();
export function handleAsyncMsgFromRust(ui8: Uint8Array): void {
- util.assert(ui8 != null && ui8.length > 0);
const bb = new flatbuffers.ByteBuffer(ui8);
const base = msg.Base.getRootAsBase(bb);
const cmdId = base.cmdId();
@@ -28,7 +27,7 @@ function sendInternal(
builder: flatbuffers.Builder,
innerType: msg.Any,
inner: flatbuffers.Offset,
- data: undefined | ArrayBufferView,
+ zeroCopy: undefined | ArrayBufferView,
sync = true
): [number, null | Uint8Array] {
const cmdId = nextCmdId++;
@@ -38,9 +37,12 @@ function sendInternal(
msg.Base.addSync(builder, sync);
msg.Base.addCmdId(builder, cmdId);
builder.finish(msg.Base.endBase(builder));
- const res = libdeno.send(builder.asUint8Array(), data);
+
+ const control = builder.asUint8Array();
+ const response = window.DenoCore.dispatch(control, zeroCopy);
+
builder.inUse = false;
- return [cmdId, res];
+ return [cmdId, response];
}
// @internal
@@ -50,8 +52,14 @@ export function sendAsync(
inner: flatbuffers.Offset,
data?: ArrayBufferView
): Promise<msg.Base> {
- const [cmdId, resBuf] = sendInternal(builder, innerType, inner, data, false);
- util.assert(resBuf == null);
+ const [cmdId, response] = sendInternal(
+ builder,
+ innerType,
+ inner,
+ data,
+ false
+ );
+ util.assert(response == null);
const promise = util.createResolvable<msg.Base>();
promiseTable.set(cmdId, promise);
return promise;
@@ -64,13 +72,12 @@ export function sendSync(
inner: flatbuffers.Offset,
data?: ArrayBufferView
): null | msg.Base {
- const [cmdId, resBuf] = sendInternal(builder, innerType, inner, data, true);
+ const [cmdId, response] = sendInternal(builder, innerType, inner, data, true);
util.assert(cmdId >= 0);
- if (resBuf == null) {
+ if (response == null || response.length === 0) {
return null;
} else {
- const u8 = new Uint8Array(resBuf!);
- const bb = new flatbuffers.ByteBuffer(u8);
+ const bb = new flatbuffers.ByteBuffer(response);
const baseRes = msg.Base.getRootAsBase(bb);
errors.maybeThrowError(baseRes);
return baseRes;
diff --git a/js/libdeno.ts b/js/libdeno.ts
index 33e9e4f5f..485e67bb9 100644
--- a/js/libdeno.ts
+++ b/js/libdeno.ts
@@ -19,11 +19,14 @@ interface EvalErrorInfo {
interface Libdeno {
recv(cb: MessageCallback): void;
- send(control: ArrayBufferView, data?: ArrayBufferView): null | Uint8Array;
+ send(
+ control: null | ArrayBufferView,
+ data?: ArrayBufferView
+ ): null | Uint8Array;
print(x: string, isErr?: boolean): void;
- shared: ArrayBuffer;
+ shared: SharedArrayBuffer;
/** Evaluate provided code in the current context.
* It differs from eval(...) in that it does not create a new context.
diff --git a/js/os.ts b/js/os.ts
index f95114f04..c96416935 100644
--- a/js/os.ts
+++ b/js/os.ts
@@ -1,8 +1,8 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
import * as msg from "gen/msg_generated";
+import { window } from "./window";
import { handleAsyncMsgFromRust, sendSync } from "./dispatch";
import * as flatbuffers from "./flatbuffers";
-import { libdeno } from "./libdeno";
import { TextDecoder } from "./text_encoding";
import { assert } from "./util";
import * as util from "./util";
@@ -169,7 +169,7 @@ function sendStart(): msg.StartRes {
// the runtime and the compiler environments.
// @internal
export function start(source?: string): msg.StartRes {
- libdeno.recv(handleAsyncMsgFromRust);
+ window.DenoCore.setAsyncHandler(handleAsyncMsgFromRust);
// First we send an empty `Start` message to let the privileged side know we
// are ready. The response should be a `StartRes` message containing the CLI