Files
openclaw/src/plugins/lazy-service-module.ts
Agustin Rivera dafcaf9d69 fix(browser): harden browser control override loading (#62663)
* fix(browser): harden browser control overrides

* fix(lint): prepare boundary artifacts for extension oxlint

* docs(changelog): add browser override hardening entry

* fix(lint): avoid duplicate boundary prep

---------

Co-authored-by: Devin Robison <drobison@nvidia.com>
Co-authored-by: Devin Robison <drobison00@users.noreply.github.com>
2026-04-08 13:24:47 -06:00

58 lines
1.8 KiB
TypeScript

import { isTruthyEnvValue } from "../infra/env.js";
type LazyServiceModule = Record<string, unknown>;
export type LazyPluginServiceHandle = {
stop: () => Promise<void>;
};
function resolveExport<T>(mod: LazyServiceModule, names: string[]): T | null {
for (const name of names) {
const value = mod[name];
if (typeof value === "function") {
return value as T;
}
}
return null;
}
export async function startLazyPluginServiceModule(params: {
skipEnvVar?: string;
overrideEnvVar?: string;
validateOverrideSpecifier?: (specifier: string) => string;
loadDefaultModule: () => Promise<LazyServiceModule>;
loadOverrideModule?: (specifier: string) => Promise<LazyServiceModule>;
startExportNames: string[];
stopExportNames?: string[];
}): Promise<LazyPluginServiceHandle | null> {
const skipEnvVar = params.skipEnvVar?.trim();
if (skipEnvVar && isTruthyEnvValue(process.env[skipEnvVar])) {
return null;
}
const overrideEnvVar = params.overrideEnvVar?.trim();
const override = overrideEnvVar ? process.env[overrideEnvVar]?.trim() : undefined;
const loadOverrideModule =
params.loadOverrideModule ?? (async (specifier: string) => await import(specifier));
const validatedOverride =
override && params.validateOverrideSpecifier
? params.validateOverrideSpecifier(override)
: override;
const mod = validatedOverride
? await loadOverrideModule(validatedOverride)
: await params.loadDefaultModule();
const start = resolveExport<() => Promise<unknown>>(mod, params.startExportNames);
if (!start) {
return null;
}
const stop =
params.stopExportNames && params.stopExportNames.length > 0
? resolveExport<() => Promise<void>>(mod, params.stopExportNames)
: null;
await start();
return {
stop: stop ?? (async () => {}),
};
}