From 99e43c85bb29b2b887d898ff4a7676a88383b2a2 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa Date: Mon, 15 Apr 2024 19:20:15 +0900 Subject: [PATCH] feat(workerd): stream eval --- packages/workerd/src/plugin.ts | 9 ++++++--- packages/workerd/src/shared.ts | 2 ++ packages/workerd/src/worker.ts | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/workerd/src/plugin.ts b/packages/workerd/src/plugin.ts index 09ae84ed..38d5be92 100644 --- a/packages/workerd/src/plugin.ts +++ b/packages/workerd/src/plugin.ts @@ -205,9 +205,12 @@ export async function createWorkerdDevEnvironment( JSON.stringify({ entry: ctx.entry, fnString: ctx.fn.toString(), + stream: ctx.stream, } satisfies EvalMetadata), ); - const body = JSON.stringify(ctx.data ?? (null as any)); + const body: any = ctx.stream + ? ctx.data + : JSON.stringify(ctx.data ?? (null as any)); const fetch_ = runnerObject.fetch as any as typeof fetch; // fix web/undici types const response = await fetch_(ANY_URL + RUNNER_EVAL_PATH, { method: "POST", @@ -217,8 +220,8 @@ export async function createWorkerdDevEnvironment( duplex: "half", }); tinyassert(response.ok); - const result = await response.json(); - return result as any; + const result: any = ctx.stream ? response.body : await response.json(); + return result; }, }; diff --git a/packages/workerd/src/shared.ts b/packages/workerd/src/shared.ts index a28850d3..8b2fc291 100644 --- a/packages/workerd/src/shared.ts +++ b/packages/workerd/src/shared.ts @@ -30,9 +30,11 @@ export type EvalApi = (request: { entry: string; data?: In; fn: EvalFn; + stream?: boolean; }) => Promise>; export type EvalMetadata = { entry: string; fnString: string; + stream?: boolean; }; diff --git a/packages/workerd/src/worker.ts b/packages/workerd/src/worker.ts index 6434271a..74586343 100644 --- a/packages/workerd/src/worker.ts +++ b/packages/workerd/src/worker.ts @@ -48,13 +48,13 @@ export class RunnerObject implements DurableObject { request.headers.get("x-vite-eval")!, ) as EvalMetadata; const mod = await this.#runner.import(meta.entry); - const data = await request.json(); + const data = meta.stream ? request.body : await request.json(); const env = objectPickBy(this.#env, (_v, k) => !k.startsWith("__vite")); const fn: EvalFn = this.#env.__viteUnsafeEval.eval( `() => ${meta.fnString}`, )(); const result = await fn({ mod, data, env, runner: this.#runner }); - const body = JSON.stringify(result ?? null); + const body = meta.stream ? result : JSON.stringify(result ?? null); return new Response(body); }