Skip to content

Одиночный воркер ​

useWorker() — composable основного потока, оборачивает один лениво создаваемый воркер.

ts
const { run, isRunning, progress, error, cancel, warmup } = useWorker<typeof import('./x.worker')>(
  () => new Worker(new URL('./x.worker.ts', import.meta.url), { type: 'module' }),
  { idleTimeout: 30_000, retries: 0 },
)

// Опционально: заранее создать воркер, не выполняя задачу (избегает задержки холодного старта при первом запуске)
await warmup()

const output = await run(input, { transfer: [input.buffer], signal: controller.signal })

Вход run() пропускается через toRaw() перед отправкой — значение ref/reactive, прочитанное прямо из компонента (() => list.value), не клонируется структурно как живой Proxy, поэтому отправляется именно сырой снапшот.

Опции ​

idleTimeout ​

number | false · по умолчанию: 30000

Воркер самозавершается после стольки мс простоя (освобождает память); следующий run() прозрачно пересоздаёт его.

retries ​

number · по умолчанию: 0

Автоматические повторы при отклонении — никогда не применяются к отменам (AbortError всегда отклоняется немедленно). См. Стратегия повторов с backoff.

retryDelay ​

(attempt: number) => number

Задержка перед каждым повтором — см. Стратегия повторов с backoff.

hardCancelOnAbort ​

boolean · по умолчанию: false

При abort() немедленно завершить и пересоздать воркер вместо ожидания кооперативной обработки через ctx.signal.

cache ​

{ cache: 'lru', maxCacheSize?: number }

Мемоизирует результаты по входным данным — см. Мемоизация / кэш результатов.

streaming ​

boolean · по умолчанию: false

Включает ctx.reportChunk()/chunks — см. Потоковая передача результатов.

Возвращаемое значение ​

run(input, options?) ​

(input: In, options?: { transfer?: Transferable[]; signal?: AbortSignal }) => Promise<Out>

isRunning ​

ComputedRef<boolean>

progress ​

ShallowRef<number>

error ​

ShallowRef<WorkerError | null>

cancel() ​

() => void

Отменяет текущий вызов(ы) run(), не получившие собственный signal.

warmup() ​

() => Promise<void>

Заранее создаёт воркер без выполнения задачи (полезно, чтобы избежать задержки холодного старта).

terminate() ​

() => void

Немедленно завершает текущий воркер, если он существует — следующий run()/warmup() прозрачно создаст новый. Вызывайте напрямую, когда нужно завершить воркер по требованию, не дожидаясь idleTimeout или отмены — это особенно важно для useWorker(), созданного вне активной effect-области (например, внутри Pinia-стора или обычной фабричной функции), где onScopeDispose никогда не сработает, и раньше воркер мог остановиться только через таймер простоя или hardCancelOnAbort.

chunks ​

ShallowRef<unknown[]> | undefined

Присутствует только при streaming: true — см. Потоковая передача результатов.

Автоматический terminate() при onScopeDispose, если useWorker() вызван внутри активной effect-области — если такой области нет, вызывайте terminate() вручную.