MCPcopy
hub / github.com/alewin/useWorker / useWorker

Function useWorker

packages/useWorker/src/useWorker.ts:40–171  ·  view source on GitHub ↗
(
  fn: T, options: Options = DEFAULT_OPTIONS,
)

Source from the content-addressed store, hash-verified

38 * @param {Object} options useWorker option params
39 */
40export const useWorker = <T extends (...fnArgs: any[]) => any>(
41 fn: T, options: Options = DEFAULT_OPTIONS,
42) => {
43 const [workerStatus, _setWorkerStatus] = React.useState<WORKER_STATUS>(WORKER_STATUS.PENDING)
44 const worker = React.useRef<Worker & { _url?: string }>()
45 const isRunning = React.useRef(false)
46 const promise = React.useRef<{
47 [PROMISE_REJECT]?:(result: ReturnType<T> | ErrorEvent) => void;[PROMISE_RESOLVE]?:
48 (result: ReturnType<T>) => void
49 }>({})
50 const timeoutId = React.useRef<number>()
51
52 const setWorkerStatus = React.useCallback((status: WORKER_STATUS) => {
53 isRunning.current = status === WORKER_STATUS.RUNNING
54 _setWorkerStatus(status)
55 }, [])
56
57 const killWorker = React.useCallback(() => {
58 if (worker.current?._url) {
59 worker.current.terminate()
60 URL.revokeObjectURL(worker.current._url)
61 promise.current = {}
62 worker.current = undefined
63 window.clearTimeout(timeoutId.current)
64 }
65 }, [])
66
67 const onWorkerEnd = React.useCallback((status: WORKER_STATUS) => {
68 const terminate = options.autoTerminate != null
69 ? options.autoTerminate
70 : DEFAULT_OPTIONS.autoTerminate
71
72 if (terminate) {
73 killWorker()
74 }
75 setWorkerStatus(status)
76 }, [options.autoTerminate, killWorker, setWorkerStatus])
77
78 const generateWorker = useDeepCallback(() => {
79 const {
80 remoteDependencies = DEFAULT_OPTIONS.remoteDependencies,
81 timeout = DEFAULT_OPTIONS.timeout,
82 transferable = DEFAULT_OPTIONS.transferable,
83 // localDependencies = DEFAULT_OPTIONS.localDependencies,
84 } = options
85
86 const blobUrl = createWorkerBlobUrl(fn, remoteDependencies!, transferable! /*, localDependencies!*/)
87 const newWorker: Worker & { _url?: string } = new Worker(blobUrl)
88 newWorker._url = blobUrl
89
90 newWorker.onmessage = (e: MessageEvent) => {
91 const [status, result] = e.data as [WORKER_STATUS, ReturnType<T>]
92
93 switch (status) {
94 case WORKER_STATUS.SUCCESS:
95 promise.current[PROMISE_RESOLVE]?.(result)
96 onWorkerEnd(WORKER_STATUS.SUCCESS)
97 break

Callers 6

useWorker.test.jsFile · 0.85
index.jsFile · 0.85
index.jsFile · 0.85
index.jsFile · 0.85
AppFunction · 0.85
index.jsFile · 0.85

Calls 2

useDeepCallbackFunction · 0.90
createWorkerBlobUrlFunction · 0.85

Tested by

no test coverage detected