winterspec
Version:
Write Winter-CG compatible routes with filesystem routing and tons of features
44 lines (43 loc) • 1.77 kB
JavaScript
import { MessageChannel } from "node:worker_threads";
import { loadConfig } from "../config/utils.js";
import { startHeadlessDevServer, } from "./headless/start-server.js";
import { startHeadlessDevBundler } from "./headless/start-bundler.js";
/**
* Start an WinterSpec dev server. It will continuously watch your code and rebuild on changes. (This is the same function called by `winterspec dev`.)
*
* This must be run within a native context (Node.js, Bun, or Deno).
*/
export const startDevServer = async (options) => {
const config = await loadConfig(options.rootDirectory ?? process.cwd(), options.config);
const messageChannel = new MessageChannel();
const httpServerRpcChannel = {
post: (data) => messageChannel.port2.postMessage(data),
on: (data) => messageChannel.port2.on("message", data),
};
const port = options.port ?? 3000;
const headlessServer = await startHeadlessDevServer({
port,
config,
rpcChannel: httpServerRpcChannel,
middleware: options.middleware,
onListening: options.onListening,
onBuildStart: options.onBuildStart,
onBuildEnd: options.onBuildEnd,
});
const bundlerRpcChannel = {
post: (data) => messageChannel.port1.postMessage(data),
on: (data) => messageChannel.port1.on("message", data),
};
const headlessBundler = await startHeadlessDevBundler({
config,
initialRpcChannels: [bundlerRpcChannel],
});
return {
port: headlessServer.server.address().port.toString(),
stop: async () => {
await Promise.all([headlessServer.stop(), headlessBundler.stop()]);
messageChannel.port1.close();
messageChannel.port2.close();
},
};
};