Skip to content

Общий воркер

useSharedWorker() (vue-worker-kit/shared) — переиспользует один SharedWorker для всех вкладок/окон одного источника, которые к нему подключаются, вместо одного воркера на вкладку.

ts
import { useSharedWorker } from 'vue-worker-kit/shared'

const { run, connect, disconnect, portCount } = useSharedWorker<typeof import('./shared.worker')>(
  () => new SharedWorker(new URL('./shared.worker.ts', import.meta.url), { type: 'module' }),
)

// Опционально — run() подключается лениво сам; вызовите это, чтобы подключиться заранее.
connect()

const result = await run(data)

// Закрывает порт этой вкладки. НЕ завершает воркер — остальные вкладки остаются подключены.
disconnect()

Файл на стороне воркера — обычный модуль defineWorkerHandler(): тот же самый файл работает и с new Worker(...) (через useWorker()), и с new SharedWorker(...) (через useSharedWorker()); ему не нужно знать, под каким из них он выполняется.

ts
// shared.worker.ts
import { defineWorkerHandler } from 'vue-worker-kit/worker'

export default defineWorkerHandler(async (data: In, ctx) => {
  return processData(data)
})

Поддержка браузеров: Chrome, Firefox, Edge Desktop. ❌ Не поддерживается в Safari iOS или Chrome Android — там конструктор SharedWorker вообще не существует. connect()/run() в этом случае бросают WorkerUnavailableError, так же как useWorker() при SSR.

Опции

Как у useWorker(): retries, retryDelay, cache, streaming. Нет idleTimeout/hardCancelOnAbort: время жизни общего воркера не принадлежит какой-то одной вкладке, поэтому connect()/disconnect() — это весь жизненный цикл целиком, а не таймер простоя.

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

connect()

() => void

Устанавливает соединение этой вкладки. Идемпотентно; run() тоже вызывает его лениво, если вы пропустили этот шаг.

disconnect()

() => void

Закрывает только порт этой вкладки; общий воркер продолжает работать для всех остальных подключённых вкладок. Вызывается автоматически при onScopeDispose, если используется внутри setup().

portCount

Ref<number>

Количество вкладок, чьё подключение видел воркер, по последней рассылке от самого воркера. Best-effort: у MessagePort нет уведомления уровня платформы о том, что «другая сторона пропала», поэтому значение уменьшается только по кооперативному вызову disconnect() — упавшая или принудительно закрытая вкладка никогда не вычитается.

run, isRunning, progress, error, cancel()

Та же семантика, что и у useWorker().