Как избежать кеширования исходного кода в Deno Workers - PullRequest
4 голосов
/ 16 июня 2020

Добрый день, я разрабатываю среду выполнения кода javascript на основе Deno Workers. У меня также есть веб-сервер Oak, который обрабатывает запросы на изменение кода в скрипте, а также их компиляцию и выполнение.

Проблема начинается, когда я запрашиваю выполнение скрипта (например, console.log ()) а позже я изменяю указанный код, когда снова пытаюсь выполнить этот сценарий, Deno выполняет Worker до изменения и учитывает изменение только после перезапуска сервера Oak.

export class Runner {
    private task: Task;

    constructor(task: Task) {
        this.task = task;
    }

    async run() {
        new Worker(
            new URL(await joinPath(`tasks/${this.task.id}/output.js`), import.meta.url).href,
            { type: "module" }
        );
    }
}

Класс Runner отвечает за инициализации Worker, для каждого запроса на выполнение создается новый экземпляр Runner и, следовательно, Worker.

// oak router
router.get("/api/tasks/:id/run", async ctx => {
        const id: any = ctx.params.id;

        if (!id) ctx.throw(500);

        const task: Task = await get(id);
        const compiler: Compiler = new Compiler(task);
        const runner: Runner = new Runner(task);

        await compiler.compile();
        await runner.run();

        ctx.response.body = 'ok';
    });

Это функция, которая обрабатывает запрос, который, в свою очередь, создает экземпляр класса Runner.

Заранее большое спасибо.

1 Ответ

2 голосов
/ 16 июня 2020

Есть открытая проблема для этого, кеш будет недействителен в будущем для динамических c загрузок.

Теперь обходной путь - добавить строку запроса в URL-адрес. И меняйте его при каждом звонке на new Worker.

let v = 0;
export class Runner {
    private task: Task;

    constructor(task: Task) {
        this.task = task;
    }

    async run() {
        new Worker(
            new URL(await joinPath(`tasks/${this.task.id}/output.js?v=${v++}`), import.meta.url).href,
            { type: "module" }
        );
    }
}
...