From d38ccfc6dcb8643daa4f9e695d47a79cf068f90e Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Thu, 27 Sep 2018 17:33:10 -0400 Subject: Support zero-copy data in libdeno.send(). (#838) This is a large API refactor of deno.h which replaces deno_send() and deno_set_response() with deno_respond(). It also adds a req_id parameter to the deno_recv_cb. Make writeFile/writeFileSync use it. --- js/dispatch.ts | 14 ++++++++------ js/libdeno.ts | 2 +- js/write_file.ts | 6 ++---- 3 files changed, 11 insertions(+), 11 deletions(-) (limited to 'js') diff --git a/js/dispatch.ts b/js/dispatch.ts index 037b77a85..9257be767 100644 --- a/js/dispatch.ts +++ b/js/dispatch.ts @@ -28,10 +28,11 @@ export function handleAsyncMsgFromRust(ui8: Uint8Array) { export function sendAsync( builder: flatbuffers.Builder, msgType: fbs.Any, - msg: flatbuffers.Offset + msg: flatbuffers.Offset, + data?: ArrayBufferView ): Promise { maybePushTrace(msgType, false); // add to trace if tracing - const [cmdId, resBuf] = sendInternal(builder, msgType, msg, false); + const [cmdId, resBuf] = sendInternal(builder, msgType, msg, data, false); util.assert(resBuf == null); const promise = util.createResolvable(); promiseTable.set(cmdId, promise); @@ -42,16 +43,16 @@ export function sendAsync( export function sendSync( builder: flatbuffers.Builder, msgType: fbs.Any, - msg: flatbuffers.Offset + msg: flatbuffers.Offset, + data?: ArrayBufferView ): null | fbs.Base { maybePushTrace(msgType, true); // add to trace if tracing - const [cmdId, resBuf] = sendInternal(builder, msgType, msg, true); + const [cmdId, resBuf] = sendInternal(builder, msgType, msg, data, true); util.assert(cmdId >= 0); if (resBuf == null) { return null; } else { const u8 = new Uint8Array(resBuf!); - // console.log("recv sync message", util.hexdump(u8)); const bb = new flatbuffers.ByteBuffer(u8); const baseRes = fbs.Base.getRootAsBase(bb); errors.maybeThrowError(baseRes); @@ -63,6 +64,7 @@ function sendInternal( builder: flatbuffers.Builder, msgType: fbs.Any, msg: flatbuffers.Offset, + data: undefined | ArrayBufferView, sync = true ): [number, null | Uint8Array] { const cmdId = nextCmdId++; @@ -73,5 +75,5 @@ function sendInternal( fbs.Base.addCmdId(builder, cmdId); builder.finish(fbs.Base.endBase(builder)); - return [cmdId, libdeno.send(builder.asUint8Array())]; + return [cmdId, libdeno.send(builder.asUint8Array(), data)]; } diff --git a/js/libdeno.ts b/js/libdeno.ts index 8445a2d2b..afd6f1aec 100644 --- a/js/libdeno.ts +++ b/js/libdeno.ts @@ -6,7 +6,7 @@ type MessageCallback = (msg: Uint8Array) => void; interface Libdeno { recv(cb: MessageCallback): void; - send(msg: ArrayBufferView): null | Uint8Array; + send(control: ArrayBufferView, data?: ArrayBufferView): null | Uint8Array; print(x: string, isErr?: boolean): void; diff --git a/js/write_file.ts b/js/write_file.ts index 60c6ff6ab..f9810cb35 100644 --- a/js/write_file.ts +++ b/js/write_file.ts @@ -41,14 +41,12 @@ function req( filename: string, data: Uint8Array, perm: number -): [flatbuffers.Builder, fbs.Any, flatbuffers.Offset] { +): [flatbuffers.Builder, fbs.Any, flatbuffers.Offset, Uint8Array] { const builder = new flatbuffers.Builder(); const filename_ = builder.createString(filename); - const dataOffset = fbs.WriteFile.createDataVector(builder, data); fbs.WriteFile.startWriteFile(builder); fbs.WriteFile.addFilename(builder, filename_); - fbs.WriteFile.addData(builder, dataOffset); fbs.WriteFile.addPerm(builder, perm); const msg = fbs.WriteFile.endWriteFile(builder); - return [builder, fbs.Any.WriteFile, msg]; + return [builder, fbs.Any.WriteFile, msg, data]; } -- cgit v1.2.3