← Files Cecil-IA Labs FFmpegARCHIVED FILE

dist/core/temp-files.js

2 KB · Sep 30, 2026 · 23:17 UTC

↓ Download file

import { mkdir, mkdtemp, rm } from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { ToolkitRuntimeError } from "./errors.js";
export class TemporaryWorkspace {
    directory;
    keep;
    cleaned = false;
    constructor(directory, keep) {
        this.directory = directory;
        this.keep = keep;
    }
    static async create(options = {}) {
        const baseDirectory = options.baseDirectory ?? os.tmpdir();
        const prefix = options.prefix ?? "cecilia-ffmpeg-";
        await mkdir(baseDirectory, { recursive: true });
        const directory = await mkdtemp(path.join(baseDirectory, prefix));
        return new TemporaryWorkspace(directory, options.keep ?? false);
    }
    pathFor(relativePath) {
        if (!relativePath || path.isAbsolute(relativePath)) {
            throw new ToolkitRuntimeError("E_INTERNAL_INVARIANT", "Temporary path must be relative.", {
                details: { relativePath },
            });
        }
        const resolved = path.resolve(this.directory, relativePath);
        const relative = path.relative(this.directory, resolved);
        if (relative.startsWith("..") || path.isAbsolute(relative)) {
            throw new ToolkitRuntimeError("E_INTERNAL_INVARIANT", "Temporary path escapes its workspace.", {
                details: { relativePath },
            });
        }
        return resolved;
    }
    async ensureDirectory(relativePath) {
        const resolved = this.pathFor(relativePath);
        await mkdir(resolved, { recursive: true });
        return resolved;
    }
    async cleanup() {
        if (this.cleaned || this.keep)
            return;
        this.cleaned = true;
        await rm(this.directory, { recursive: true, force: true });
    }
}
export async function withTemporaryWorkspace(options, callback) {
    const workspace = await TemporaryWorkspace.create(options);
    try {
        return await callback(workspace);
    }
    finally {
        await workspace.cleanup();
    }
}
//# sourceMappingURL=temp-files.js.map

SHA-256: a3f130c4ed09af0d9bb3eed51f1bd99fa3fac91cfc0ccb2b323c594f219d10f1