UNPKG

react-hooks-worker

Version:
1 lines 4.28 kB
{"version":3,"file":"index.modern.mjs","sources":["../src/useWorker.ts","../src/exposeWorker.ts"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\ntype State<Result> = {\n result?: Result;\n error?: 'error' | 'messageerror';\n};\n\nconst initialState = {};\n\n/**\n * use worker\n *\n * The createWorker function should be stable to keep the worker running.\n * If it's referentially changed, it will create a new worker and terminate the old one.\n *\n * @example\n *\n * import { useWorker } from 'react-hooks-worker';\n *\n * const createWorker = () => new Worker(new URL('./slow_fib.worker', import.meta.url));\n *\n * const CalcFib = ({ count }) => {\n * const { result, error } = useWorker(createWorker, count);\n * if (error) return <div>Error: {error}</div>;\n * return <div>Result: {result}</div>;\n * };\n */\nexport function useWorker<Input, Result>(\n createWorker: () => Worker,\n input: Input,\n getOptions?: () => WindowPostMessageOptions,\n) {\n const [state, setState] = useState<State<Result>>(initialState);\n const worker = useMemo(createWorker, [createWorker]);\n const lastWorker = useRef<Worker>(worker);\n useEffect(() => {\n lastWorker.current = worker;\n let setStateSafe = (nextState: State<Result>) => setState(nextState);\n worker.onmessage = (e) => setStateSafe({ result: e.data });\n worker.onerror = () => setStateSafe({ error: 'error' });\n worker.onmessageerror = () => setStateSafe({ error: 'messageerror' });\n const cleanup = () => {\n // eslint-disable-next-line react/function-component-definition\n setStateSafe = () => null; // we should not setState after cleanup.\n worker.terminate();\n setState(initialState);\n };\n return cleanup;\n }, [worker]);\n useEffect(() => {\n lastWorker.current.postMessage(input, getOptions?.());\n }, [input, getOptions]);\n return state;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * expose worker\n *\n * You can expose any function that returns:\n * - A value\n * - A promise\n * - An iterable\n * - An async iterable\n *\n * @example\n *\n * import { exposeWorker } from 'react-hooks-worker';\n *\n * const fib = (i) => (i <= 1 ? i : fib(i - 1) + fib(i - 2));\n *\n * exposeWorker(fib);\n */\nexport function exposeWorker(\n func: (data: any) => any,\n getOptions?: () => WindowPostMessageOptions,\n) {\n self.onmessage = async (e: MessageEvent) => {\n const r = func(e.data);\n if (r && r[Symbol.asyncIterator]) {\n for await (const i of r) (self.postMessage)(i, getOptions?.());\n } else if (r && r[Symbol.iterator]) {\n for (const i of r) (self.postMessage)(i, getOptions?.());\n } else {\n (self.postMessage)(await r, getOptions?.());\n }\n };\n}\n"],"names":["initialState","useWorker","createWorker","input","getOptions","state","setState","useState","worker","useMemo","lastWorker","useRef","useEffect","current","setStateSafe","nextState","onmessage","e","result","data","onerror","error","onmessageerror","terminate","postMessage","exposeWorker","func","self","async","r","Symbol","asyncIterator","_iteratorError","_iteratorAbruptCompletion","_didIteratorError","_step","_iterator","next","done","err","return","iterator","i"],"mappings":"yEAYA,MAAMA,EAAe,YAoBLC,EACdC,EACAC,EACAC,GAEA,MAAOC,EAAOC,GAAYC,EAAwBP,GAC5CQ,EAASC,EAAQP,EAAc,CAACA,IAChCQ,EAAaC,EAAeH,GAkBlC,OAjBAI,EAAU,KACRF,EAAWG,QAAUL,EACrB,IAAIM,EAAgBC,GAA6BT,EAASS,GAU1D,OATAP,EAAOQ,UAAaC,GAAMH,EAAa,CAAEI,OAAQD,EAAEE,OACnDX,EAAOY,QAAU,IAAMN,EAAa,CAAEO,MAAO,UAC7Cb,EAAOc,eAAiB,IAAMR,EAAa,CAAEO,MAAO,iBACpC,KAEdP,EAAe,IAAM,KACrBN,EAAOe,YACPjB,EAASN,KAGV,CAACQ,IACJI,EAAU,KACRF,EAAWG,QAAQW,YAAYrB,EAAOC,MAAAA,OAAAA,EAAAA,MACrC,CAACD,EAAOC,IACJC,ijBCtCO,SAAAoB,EACdC,EACAtB,GAEAuB,KAAKX,UAAYY,MAAAA,IACf,MAAMC,EAAIH,EAAKT,EAAEE,MACjB,GAAIU,GAAKA,EAAEC,OAAOC,eAAgB,CAAA,IAAAC,EAAAC,GAAA,EAAAC,GAAA,EAAA,IAChC,QAAAC,0RAAsBN,GAAtBI,IAAAE,QAAAC,EAAAC,QAAAC,KAAAL,GAAA,EAA0BN,KAAKH,YAALG,EAAAA,MAAD,MAAsBvB,OAAtB,EAAsBA,KADf,MAAAmC,GAAAL,GAAA,EAAAF,EAAAO,EAAA,QAAA,IAAAN,GAAA,MAAAG,EAAAI,cAAAJ,EAAAI,SAAA,QAAA,GAAAN,EAAA,MAAAF,YAEvBH,GAAKA,EAAEC,OAAOW,UACvB,IAAK,MAAMC,KAAKb,EAAIF,KAAKH,YAAakB,EAAGtC,MAAAA,OAAAA,EAAAA,UAExCuB,KAAKH,kBAAmBK,QAAGzB,SAAAA"}