From c88491b4b330b72c3e8858e1d437a399b5616d11 Mon Sep 17 00:00:00 2001 From: Young Date: Tue, 25 Oct 2022 13:59:09 +0800 Subject: [PATCH] feat(useWebWorker): support overloads (#2259) --- packages/core/useWebWorker/index.md | 3 ++- packages/core/useWebWorker/index.ts | 37 +++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/packages/core/useWebWorker/index.md b/packages/core/useWebWorker/index.md index 1fe35977775..b3e9611a792 100644 --- a/packages/core/useWebWorker/index.md +++ b/packages/core/useWebWorker/index.md @@ -12,12 +12,13 @@ Simple [Web Workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Worker ```js import { useWebWorker } from '@vueuse/core' -const { data, post, terminate } = useWebWorker('/path/to/worker.js') +const { data, post, terminate, worker } = useWebWorker('/path/to/worker.js') ``` | State | Type | Description | | ----- | ---------- | ---------------------------------------------------------------------------------------------------- | | data | `Ref` | Reference to the latest data received via the worker, can be watched to respond to incoming messages | +| worker | `ShallowRef` | Reference to the instance of the WebWorker | | Method | Signature | Description | diff --git a/packages/core/useWebWorker/index.ts b/packages/core/useWebWorker/index.ts index aa268bf3160..69be5c0d812 100644 --- a/packages/core/useWebWorker/index.ts +++ b/packages/core/useWebWorker/index.ts @@ -1,8 +1,8 @@ /* this implementation is original ported from https://github.com/logaretm/vue-use-web by Abdelrahman Awad */ -import type { Ref } from 'vue-demi' +import type { Ref, ShallowRef } from 'vue-demi' import { ref, shallowRef } from 'vue-demi' -import { tryOnScopeDispose } from '@vueuse/shared' +import { isFunction, isString, tryOnScopeDispose } from '@vueuse/shared' import type { ConfigurableWindow } from '../_configurable' import { defaultWindow } from '../_configurable' @@ -10,9 +10,11 @@ export interface UseWebWorkerReturn { data: Ref post: typeof Worker.prototype['postMessage'] terminate: () => void - worker: Ref + worker: ShallowRef } +type WorkerFn = (...args: unknown[]) => Worker + /** * Simple Web Workers registration and communication. * @@ -21,14 +23,30 @@ export interface UseWebWorkerReturn { * @param workerOptions * @param options */ -export function useWebWorker( +export function useWebWorker( url: string, workerOptions?: WorkerOptions, - options: ConfigurableWindow = {}, + options?: ConfigurableWindow, +): UseWebWorkerReturn + +/** + * Simple Web Workers registration and communication. + * + * @see https://vueuse.org/useWebWorker + * @param worker + */ +export function useWebWorker( + worker: Worker | WorkerFn +): UseWebWorkerReturn + +export function useWebWorker( + arg0: string | WorkerFn | Worker, + workerOptions?: WorkerOptions, + options?: ConfigurableWindow, ): UseWebWorkerReturn { const { window = defaultWindow, - } = options + } = options ?? {} const data: Ref = ref(null) const worker = shallowRef() @@ -48,7 +66,12 @@ export function useWebWorker( } if (window) { - worker.value = new Worker(url, workerOptions) + if (isString(arg0)) + worker.value = new Worker(arg0, workerOptions) + else if (isFunction(arg0)) + worker.value = arg0() + else + worker.value = arg0 worker.value!.onmessage = (e: MessageEvent) => { data.value = e.data