84 lines
2.2 KiB
TypeScript
84 lines
2.2 KiB
TypeScript
import { applyPipelineStep, applyPipelineSteps } from "@/lib/image-pipeline/render-core";
|
|
|
|
import {
|
|
CPU_BACKEND_ID,
|
|
type BackendHint,
|
|
type BackendRouter,
|
|
type FullBackendRequest,
|
|
type ImagePipelineBackend,
|
|
type PreviewBackendRequest,
|
|
} from "@/lib/image-pipeline/backend/backend-types";
|
|
|
|
const cpuBackend: ImagePipelineBackend = {
|
|
id: CPU_BACKEND_ID,
|
|
runPreviewStep(request) {
|
|
applyPipelineStep(
|
|
request.pixels,
|
|
request.step,
|
|
request.width,
|
|
request.height,
|
|
request.executionOptions,
|
|
);
|
|
},
|
|
runFullPipeline(request) {
|
|
applyPipelineSteps(
|
|
request.pixels,
|
|
request.steps,
|
|
request.width,
|
|
request.height,
|
|
request.executionOptions,
|
|
);
|
|
},
|
|
};
|
|
|
|
function normalizeBackendHint(value: BackendHint): string | null {
|
|
if (!value) {
|
|
return null;
|
|
}
|
|
|
|
const normalized = value.trim().toLowerCase();
|
|
return normalized.length > 0 ? normalized : null;
|
|
}
|
|
|
|
export function createBackendRouter(options?: {
|
|
backends?: readonly ImagePipelineBackend[];
|
|
defaultBackendId?: string;
|
|
}): BackendRouter {
|
|
const configuredBackends = options?.backends?.length ? [...options.backends] : [cpuBackend];
|
|
const byId = new Map(configuredBackends.map((backend) => [backend.id.toLowerCase(), backend]));
|
|
const defaultBackend =
|
|
byId.get(options?.defaultBackendId?.toLowerCase() ?? "") ??
|
|
byId.get(CPU_BACKEND_ID) ??
|
|
configuredBackends[0] ??
|
|
cpuBackend;
|
|
|
|
return {
|
|
resolveBackend(backendHint) {
|
|
const normalizedHint = normalizeBackendHint(backendHint);
|
|
if (!normalizedHint) {
|
|
return defaultBackend;
|
|
}
|
|
|
|
return byId.get(normalizedHint) ?? defaultBackend;
|
|
},
|
|
runPreviewStep(request) {
|
|
const backend = this.resolveBackend(request.backendHint);
|
|
backend.runPreviewStep(request);
|
|
},
|
|
runFullPipeline(request) {
|
|
const backend = this.resolveBackend(request.backendHint);
|
|
backend.runFullPipeline(request);
|
|
},
|
|
};
|
|
}
|
|
|
|
const defaultRouter = createBackendRouter();
|
|
|
|
export function runPreviewStepWithBackendRouter(request: PreviewBackendRequest): void {
|
|
defaultRouter.runPreviewStep(request);
|
|
}
|
|
|
|
export function runFullPipelineWithBackendRouter(request: FullBackendRequest): void {
|
|
defaultRouter.runFullPipeline(request);
|
|
}
|