Skip to content

Commit

Permalink
wip: init via rpc
Browse files Browse the repository at this point in the history
  • Loading branch information
hi-ogawa committed Oct 26, 2024
1 parent 40ca990 commit f93fa28
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 14 deletions.
22 changes: 13 additions & 9 deletions packages/workerd/src/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,22 +157,26 @@ export async function createWorkerdDevEnvironment(
const ns = await miniflare.getDurableObjectNamespace("__viteRunner");
const runnerObject = ns.get(ns.idFromName(""));

// init via rpc
await (runnerObject as any).__viteInit();
// initial request to setup websocket
const initResponse = await runnerObject.fetch(ANY_URL + RUNNER_INIT_PATH, {
headers: {
Upgrade: "websocket",
},
});
tinyassert(initResponse.webSocket);
const { webSocket } = initResponse;
webSocket.accept();
if (0) {
const initResponse = await runnerObject.fetch(ANY_URL + RUNNER_INIT_PATH, {
headers: {
Upgrade: "websocket",
},
});
tinyassert(initResponse.webSocket);
const { webSocket } = initResponse;
webSocket.accept();
}

// websocket hmr channgel
let hotListener: (data: unknown) => void;
const hot = createSimpleHMRChannel({
post: (data) => {
(runnerObject as any).__viteServerSend(data);
webSocket.send(data);
// webSocket.send(data);
},
on: (listener) => {
hotListener = listener;
Expand Down
63 changes: 58 additions & 5 deletions packages/workerd/src/worker.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { DurableObject } from "cloudflare:workers";
import { objectPickBy, tinyassert } from "@hiogawa/utils";
import type { HotPayload } from "vite";
import {
ModuleRunner,
ssrImportMetaKey,
Expand All @@ -18,6 +19,7 @@ import {
export class RunnerObject extends DurableObject {
#env: RunnerEnv;
#runner?: ModuleRunner;
#viteServerSend!: (payload: HotPayload) => void;

constructor(...args: ConstructorParameters<typeof DurableObject>) {
super(...args);
Expand All @@ -37,14 +39,65 @@ export class RunnerObject extends DurableObject {
}
}

async __vite_init() {
console.log("!!vite init!!");
return "foo";
async __viteInit() {
const env = this.#env;
this.#runner = new ModuleRunner(
{
root: env.__viteRoot,
sourcemapInterceptor: "prepareStackTrace",
transport: {
fetchModule: async (...args) => {
const response = await env.__viteFetchModule.fetch(
new Request(ANY_URL, {
method: "POST",
body: JSON.stringify(args),
}),
);
tinyassert(response.ok);
const result = response.json();
return result as any;
},
},
hmr: {
connection: {
isReady: () => true,
onUpdate: (callback) => {
this.#viteServerSend = callback;
},
send: (payload) => {
env.__viteRunnerSend.fetch(
new Request(ANY_URL, {
method: "POST",
body: JSON.stringify(payload),
}),
);
},
},
},
},
{
runInlinedModule: async (context, transformed) => {
const codeDefinition = `'use strict';async (${Object.keys(
context,
).join(",")})=>{{`;
const code = `${codeDefinition}${transformed}\n}}`;
const fn = env.__viteUnsafeEval.eval(
code,
context[ssrImportMetaKey].filename,
);
await fn(...Object.values(context));
Object.freeze(context[ssrModuleExportsKey]);
},
async runExternalModule(filepath) {
return import(filepath);
},
},
);
return { ok: true };
}

// TODO
async __viteServerSend(payload: string) {
payload;
this.#viteServerSend(JSON.parse(payload));
}

async #fetch(request: Request) {
Expand Down

0 comments on commit f93fa28

Please sign in to comment.