///
import {
MediaWorkerHost,
type WorkerMessageEndpoint,
} from "@web-video-editor/media-runtime";
import {
StructuredLogger,
WorkerLogSink,
type WorkerMessageTarget,
} from "@web-video-editor/observability";
import { exportProjectToMp4 } from "./export-pipeline";
import {
MEDIA_EXPORT_OPERATION,
type MediaExportProgress,
type MediaExportRequest,
type MediaExportResult,
} from "./export-types";
const endpoint = self as unknown as WorkerMessageEndpoint & WorkerMessageTarget;
const host = new MediaWorkerHost(endpoint);
const logger = new StructuredLogger(
new WorkerLogSink(endpoint),
"export-worker",
);
host.register(
MEDIA_EXPORT_OPERATION,
async (request, context) => {
const result = await exportProjectToMp4({
logger,
onProgress: (progress) => {
const frameRatio =
progress.totalFrames === 0
? 0
: progress.processedFrames / progress.totalFrames;
const ratio =
progress.stage === "capability"
? 0.02
: progress.stage === "video"
? 0.05 + frameRatio * 0.8
: progress.stage === "audio"
? 0.9
: progress.stage === "mux"
? 0.97
: 1;
context.progress(
{
completed: progress.processedFrames,
ratio,
stage: progress.stage,
total: progress.totalFrames,
},
progress,
);
},
project: request.project,
requestId: context.requestId,
signal: context.signal,
sources: request.sources,
});
return { payload: result };
},
);