Files
openclaw/src/shared/lazy-runtime.ts
2026-03-17 08:37:11 -07:00

30 lines
1018 B
TypeScript

export function createLazyRuntimeSurface<TModule, TSurface>(
importer: () => Promise<TModule>,
select: (module: TModule) => TSurface,
): () => Promise<TSurface> {
let cached: Promise<TSurface> | null = null;
return () => {
cached ??= importer().then(select);
return cached;
};
}
export function createLazyRuntimeMethod<TSurface, TArgs extends unknown[], TResult>(
load: () => Promise<TSurface>,
select: (surface: TSurface) => (...args: TArgs) => TResult,
): (...args: TArgs) => Promise<Awaited<TResult>> {
const invoke = async (...args: TArgs): Promise<Awaited<TResult>> => {
const method = select(await load());
return await method(...args);
};
return invoke;
}
export function createLazyRuntimeMethodBinder<TSurface>(load: () => Promise<TSurface>) {
return function <TArgs extends unknown[], TResult>(
select: (surface: TSurface) => (...args: TArgs) => TResult,
): (...args: TArgs) => Promise<Awaited<TResult>> {
return createLazyRuntimeMethod(load, select);
};
}