diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/core.ts | 13 | ||||
-rw-r--r-- | js/dispatch.ts | 29 | ||||
-rw-r--r-- | js/libdeno.ts | 7 | ||||
-rw-r--r-- | js/os.ts | 4 |
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. @@ -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 |