Skip to content

Commit

Permalink
refactor: rename SetupPreviewEnvironment to OnServerStart
Browse files Browse the repository at this point in the history
  • Loading branch information
fwouts committed Aug 20, 2023
1 parent 8d9ec1f commit 6b38295
Show file tree
Hide file tree
Showing 15 changed files with 66 additions and 70 deletions.
6 changes: 3 additions & 3 deletions app/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import type { SetupPreviewEnvironment } from "@previewjs/core";
import type { OnServerStart } from "@previewjs/core";
import express from "express";
import path from "path";
import url from "url";

const setup: SetupPreviewEnvironment = async () => {
const onServerStart: OnServerStart = async () => {
const __dirname = url.fileURLToPath(new URL(".", import.meta.url));
return {
middlewares: [express.static(path.join(__dirname, "..", "client", "dist"))],
};
};

export default setup;
export default onServerStart;
2 changes: 1 addition & 1 deletion chromeless/src/workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export async function createChromelessWorkspace({
frameworkPlugin,
logger,
reader,
setupEnvironment: async () => ({
onServerStart: async () => ({
middlewares: [express.static(clientDirPath)],
}),
});
Expand Down
24 changes: 13 additions & 11 deletions core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import type { Logger } from "pino";
import { crawlFiles } from "./crawl-files";
import { getFreePort } from "./get-free-port";
import type { FrameworkPlugin } from "./plugins/framework";
import type { SetupPreviewEnvironment } from "./preview-env";
import type { OnServerStart } from "./preview-env";
import { Previewer } from "./previewer";
import { ApiRouter } from "./router";
export type { PackageDependencies } from "./plugins/dependencies";
Expand All @@ -20,7 +20,7 @@ export type {
FrameworkPluginFactory,
} from "./plugins/framework";
export { setupFrameworkPlugin } from "./plugins/setup-framework-plugin";
export type { SetupPreviewEnvironment } from "./preview-env";
export type { OnServerStart } from "./preview-env";

const require = createRequire(import.meta.url);

Expand All @@ -38,13 +38,13 @@ export async function createWorkspace({
reader,
frameworkPlugin,
logger,
setupEnvironment = () => Promise.resolve({}),
onServerStart = () => Promise.resolve({}),
}: {
rootDir: string;
frameworkPlugin: FrameworkPlugin;
logger: Logger;
reader: Reader;
setupEnvironment?: SetupPreviewEnvironment;
onServerStart?: OnServerStart;
}): Promise<Workspace> {
logger.debug(
`Creating workspace with framework plugin ${frameworkPlugin.name} from root: ${rootDir}`
Expand Down Expand Up @@ -142,13 +142,15 @@ export async function createWorkspace({
}
},
];
if (setupEnvironment) {
const environment = await setupEnvironment({
registerRPC: (endpoint, handler) =>
router.registerRPC(endpoint, handler),
workspace,
});
middlewares.push(...(environment.middlewares || []));
if (onServerStart) {
const { middlewares: additionalMiddlewares = [] } = await onServerStart(
{
registerRPC: (endpoint, handler) =>
router.registerRPC(endpoint, handler),
workspace,
}
);
middlewares.push(...additionalMiddlewares);
}
const previewer = new Previewer({
reader,
Expand Down
2 changes: 1 addition & 1 deletion core/src/preview-env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type * as express from "express";
import type { Workspace } from ".";
import type { RegisterRPC } from "./router";

export type SetupPreviewEnvironment = (options: {
export type OnServerStart = (options: {
versionCode?: string;
registerRPC: RegisterRPC;
workspace: Workspace;
Expand Down
10 changes: 4 additions & 6 deletions daemon/src/api.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
export type InfoRequest = Record<never, never>;
export type HealthyRequest = Record<never, never>;

export interface InfoResponse {
loaderInstallDir: string;
packageName: string;
versionCode: string;
}
export type HealthyResponse = {
healthy: boolean;
};

export type KillRequest = Record<never, never>;

Expand Down
15 changes: 9 additions & 6 deletions daemon/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import type {
DisposeWorkspaceResponse,
GetWorkspaceRequest,
GetWorkspaceResponse,
InfoRequest,
InfoResponse,
HealthyRequest,
HealthyResponse,
KillRequest,
KillResponse,
StartPreviewRequest,
Expand All @@ -21,7 +21,7 @@ import type {
UpdatePendingFileRequest,
UpdatePendingFileResponse,
} from "./api.js";
import { waitForSuccessfulPromise } from "./wait-for-successful-promise";
import { waitForTruePromise } from "./wait-for-successful-promise";
export * from "./api.js";

export function createClient(baseUrl: string): Client {
Expand Down Expand Up @@ -79,9 +79,13 @@ export function createClient(baseUrl: string): Client {

const client: Client = {
waitForReady: async () => {
await waitForSuccessfulPromise(() => client.info());
await waitForTruePromise(() =>
makeRequest<HealthyRequest, HealthyResponse>(
"/previewjs/healthy",
{}
).then(({ healthy }) => healthy)
);
},
info: () => makeRPC<InfoRequest, InfoResponse>("/previewjs/info")({}),
kill: () => makeRPC<KillRequest, KillResponse>("/previewjs/kill")({}),
updateClientStatus: makeRPC("/previewjs/clients/status"),
getWorkspace: makeRPC("/workspaces/get"),
Expand All @@ -108,7 +112,6 @@ export function destroyDaemon(lockFilePath: string) {

export interface Client {
waitForReady(): Promise<void>;
info(): Promise<InfoResponse>;
kill(): Promise<KillResponse>;
updateClientStatus(
request: UpdateClientStatusRequest
Expand Down
19 changes: 9 additions & 10 deletions daemon/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ import type {
DisposeWorkspaceResponse,
GetWorkspaceRequest,
GetWorkspaceResponse,
InfoRequest,
InfoResponse,
HealthyRequest,
HealthyResponse,
KillRequest,
KillResponse,
StartPreviewRequest,
StartPreviewResponse,
Expand Down Expand Up @@ -107,20 +108,20 @@ if (logFilePath) {

export interface DaemonStartOptions {
loaderInstallDir: string;
packageName: string;
onServerStartModuleName: string;
versionCode: string;
port: number;
}

export async function startDaemon({
loaderInstallDir,
packageName,
onServerStartModuleName,
versionCode,
port,
}: DaemonStartOptions) {
const previewjs = await load({
installDir: loaderInstallDir,
packageName,
onServerStartModuleName,
});
const logger = previewjs.logger;

Expand Down Expand Up @@ -243,13 +244,11 @@ export async function startDaemon({

class NotFoundError extends Error {}

endpoint<InfoRequest, InfoResponse>("/previewjs/info", async () => ({
loaderInstallDir,
packageName,
versionCode,
endpoint<HealthyRequest, HealthyResponse>("/previewjs/healthy", async () => ({
healthy: true,
}));

endpoint<InfoRequest, KillResponse>("/previewjs/kill", async () => {
endpoint<KillRequest, KillResponse>("/previewjs/kill", async () => {
setTimeout(() => {
logger.info("Seppuku was requested. Bye bye.");
process.exit(0);
Expand Down
5 changes: 3 additions & 2 deletions daemon/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ import { startDaemon } from "./index.js";

const port = parseInt(process.env.PORT || "9100");

const packageName = process.env.PREVIEWJS_PACKAGE_NAME || "@previewjs/pro";
const onServerStartModuleName =
process.env.PREVIEWJS_PACKAGE_NAME || "@previewjs/pro";
const loaderInstallDir = process.env.PREVIEWJS_LOADER_INSTALL_DIR!;

if (!loaderInstallDir) {
Expand All @@ -16,7 +17,7 @@ if (!versionCode) {

startDaemon({
loaderInstallDir,
packageName,
onServerStartModuleName,
versionCode,
port,
}).catch((e) => {
Expand Down
9 changes: 5 additions & 4 deletions daemon/src/wait-for-successful-promise.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
export async function waitForSuccessfulPromise(
f: () => Promise<unknown>,
export async function waitForTruePromise(
f: () => Promise<boolean>,
timeoutMillis = 5000,
retryDelayMillis = 100
) {
const startTime = Date.now();
loop: while (true) {
try {
await f();
break loop;
if (await f()) {
break loop;
}
} catch (e) {
if (Date.now() - startTime > timeoutMillis) {
throw new Error(`Timed out after ${timeoutMillis}ms: ${e}`);
Expand Down
7 changes: 2 additions & 5 deletions integrations/cli/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,10 @@ program
.arguments("[dir-path]")
.option(...PORT_OPTION)
.action(async (dirPath: string | undefined, options: SharedOptions) => {
const packageName = process.env.PREVIEWJS_PACKAGE_NAME;
if (!packageName) {
throw new Error(`Missing environment variable: PREVIEWJS_PACKAGE_NAME`);
}
const onServerStartModuleName = process.env.PREVIEWJS_PACKAGE_NAME;
const previewjs = await load({
installDir: process.env.PREVIEWJS_MODULES_DIR || __dirname,
packageName,
onServerStartModuleName,
});
const workspace = await previewjs.getWorkspace({
versionCode: `cli-${version}`,
Expand Down
6 changes: 3 additions & 3 deletions integrations/intellij/daemon/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ if (!port) {
throw new Error(`No port specified`);
}

const packageName = process.env.PREVIEWJS_PACKAGE_NAME;
if (!packageName) {
const onServerStartModuleName = process.env.PREVIEWJS_PACKAGE_NAME;
if (!onServerStartModuleName) {
throw new Error(`Missing environment variable: PREVIEWJS_PACKAGE_NAME`);
}

Expand All @@ -19,7 +19,7 @@ if (!version) {
const __dirname = url.fileURLToPath(new URL(".", import.meta.url));
startDaemon({
loaderInstallDir: __dirname,
packageName,
onServerStartModuleName,
versionCode: `intellij-${version}`,
port,
}).catch((e) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ fun api(baseUrl: String): PreviewJsApi {
}

interface PreviewJsApi {
@GET("/previewjs/info")
suspend fun info(): InfoResponse

@POST("/workspaces/get")
suspend fun getWorkspace(@Body req: GetWorkspaceRequest): GetWorkspaceResponse

Expand Down
6 changes: 3 additions & 3 deletions integrations/vscode/src/daemon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ const { version } = JSON.parse(
readFileSync(`${__dirname}/../package.json`, "utf8")
);

const packageName = process.env.PREVIEWJS_PACKAGE_NAME;
if (!packageName) {
const onServerStartModuleName = process.env.PREVIEWJS_PACKAGE_NAME;
if (!onServerStartModuleName) {
throw new Error(`Missing environment variable: PREVIEWJS_PACKAGE_NAME`);
}

Expand All @@ -17,7 +17,7 @@ if (!port) {

startDaemon({
loaderInstallDir: process.env.PREVIEWJS_MODULES_DIR || __dirname,
packageName,
onServerStartModuleName,
versionCode: `vscode-${version}`,
port,
}).catch((e) => {
Expand Down
10 changes: 4 additions & 6 deletions loader/src/modules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import url from "url";
export async function loadModules({
logger,
installDir,
packageName,
onServerStartModuleName,
}: {
logger: Logger;
installDir: string;
packageName: string;
onServerStartModuleName?: string;
}) {
if (
fs.existsSync(path.join(installDir, "pnpm")) &&
Expand All @@ -35,9 +35,6 @@ export async function loadModules({
}
const coreModule: typeof core = await importModule("@previewjs/core");
const vfsModule: typeof vfs = await importModule("@previewjs/vfs");
const setupEnvironment: core.SetupPreviewEnvironment = await importModule(
packageName
);
const frameworkPlugins: core.FrameworkPluginFactory[] = [
await importModule("@previewjs/plugin-solid"),
await importModule("@previewjs/plugin-svelte"),
Expand Down Expand Up @@ -67,7 +64,8 @@ export async function loadModules({
return {
core: coreModule,
vfs: vfsModule,
setupEnvironment,
onServerStart:
onServerStartModuleName && (await importModule(onServerStartModuleName)),
frameworkPlugins,
};
}
12 changes: 6 additions & 6 deletions loader/src/runner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ const validLogLevels = new Set<unknown>(["debug", "info", "error", "silent"]);

export async function load({
installDir,
packageName,
onServerStartModuleName,
}: {
installDir: string;
packageName: string;
onServerStartModuleName?: string;
}) {
let logLevel = process.env["PREVIEWJS_LOG_LEVEL"]?.toLowerCase();
if (!validLogLevels.has(logLevel)) {
Expand All @@ -26,10 +26,10 @@ export async function load({
destination: process.stdout,
});
const globalLogger = createLogger({ level: logLevel }, prettyLoggerStream);
const { core, vfs, setupEnvironment, frameworkPlugins } = await loadModules({
const { core, vfs, onServerStart, frameworkPlugins } = await loadModules({
logger: globalLogger,
installDir,
packageName,
onServerStartModuleName,
});
const memoryReader = vfs.createMemoryReader();
const fsReader = vfs.createFileSystemReader({
Expand Down Expand Up @@ -99,8 +99,8 @@ export async function load({
rootDir,
reader,
frameworkPlugin,
setupEnvironment: (options) =>
setupEnvironment({
onServerStart: (options) =>
onServerStart({
versionCode,
...options,
}),
Expand Down

0 comments on commit 6b38295

Please sign in to comment.