11import { useState , useEffect , useRef } from 'react' ;
2- import createWorkerBlobUrl , { WebWorkerStatus } from './lib/createWorkerBlobUrl.js' ;
2+ import createWorkerBlobUrl , {
3+ WebWorkerStatus ,
4+ WorkerMessageType ,
5+ } from './lib/createWorkerBlobUrl.js' ;
36
47export interface UseWebWorkerFnOptions {
58 timeout ?: number ;
@@ -12,6 +15,7 @@ export interface UseWebWorkerFnOptions {
1215 */
1316 localDependencies ?: ( ( ...args : unknown [ ] ) => unknown ) [ ] ;
1417 onError ?: ( error : Error ) => void ;
18+ onMessage ?: ( message : any ) => void ;
1519}
1620
1721export type UseWebWorkerFnReturn < T extends ( ...args : any [ ] ) => any > = [
@@ -26,15 +30,15 @@ function useWebWorkerFn<T extends (...args: any[]) => any>(
2630) : UseWebWorkerFnReturn < T > {
2731 const { dependencies = [ ] , localDependencies = [ ] , timeout, onError } = options ;
2832
29- const [ workerStatus , setWorkerStatus ] = useState < WebWorkerStatus > ( ' PENDING' ) ;
33+ const [ workerStatus , setWorkerStatus ] = useState < WebWorkerStatus > ( WorkerMessageType . PENDING ) ;
3034 const workerRef = useRef < ( Worker & { _url ?: string } ) | null > ( null ) ;
3135 const promiseRef = useRef < {
3236 resolve ?: ( result : ReturnType < T > ) => void ;
3337 reject ?: ( error : Error ) => void ;
3438 } > ( { } ) ;
3539 const timeoutRef = useRef < number > ( ) ;
3640
37- const workerTerminate = ( status : WebWorkerStatus = ' PENDING' ) => {
41+ const workerTerminate = ( status : WebWorkerStatus = WorkerMessageType . PENDING ) => {
3842 if ( workerRef . current && workerRef . current . _url ) {
3943 workerRef . current . terminate ( ) ;
4044 URL . revokeObjectURL ( workerRef . current . _url ) ;
@@ -52,28 +56,31 @@ function useWebWorkerFn<T extends (...args: any[]) => any>(
5256
5357 newWorker . onmessage = ( e : MessageEvent ) => {
5458 const { resolve, reject } = promiseRef . current ;
55- const [ status , result ] = e . data as [ WebWorkerStatus , ReturnType < T > ] ;
59+ const [ status , result ] = e . data as [ string , any ] ;
5660
5761 switch ( status ) {
58- case ' SUCCESS' : {
62+ case WorkerMessageType . SUCCESS : {
5963 resolve ?.( result ) ;
60- workerTerminate ( status ) ;
64+ workerTerminate ( WorkerMessageType . SUCCESS ) ;
6165 break ;
6266 }
63- case ' TIMEOUT_EXPIRED' : {
67+ case WorkerMessageType . TIMEOUT_EXPIRED : {
6468 const timeoutError = new Error ( 'Timeout' ) ;
6569 onError ?.( timeoutError ) ;
6670 reject ?.( timeoutError ) ;
67- workerTerminate ( status ) ;
71+ workerTerminate ( WorkerMessageType . TIMEOUT_EXPIRED ) ;
6872 break ;
6973 }
70- default : {
74+ case WorkerMessageType . ERROR : {
7175 const error = new Error ( result as string ) ;
7276 onError ?.( error ) ;
7377 reject ?.( error ) ;
74- workerTerminate ( ' ERROR' ) ;
78+ workerTerminate ( WorkerMessageType . ERROR ) ;
7579 break ;
7680 }
81+ default : {
82+ options . onMessage ?.( { type : status , data : result } ) ;
83+ }
7784 }
7885 } ;
7986
@@ -83,14 +90,14 @@ function useWebWorkerFn<T extends (...args: any[]) => any>(
8390 const error = new Error ( e . message ) ;
8491 onError ?.( error ) ;
8592 reject ?.( error ) ;
86- workerTerminate ( ' ERROR' ) ;
93+ workerTerminate ( WorkerMessageType . ERROR ) ;
8794 } ;
8895
8996 if ( timeout ) {
9097 timeoutRef . current = window . setTimeout ( ( ) => {
9198 const { reject } = promiseRef . current ;
9299 reject ?.( new Error ( 'Timeout' ) ) ;
93- workerTerminate ( ' TIMEOUT_EXPIRED' ) ;
100+ workerTerminate ( WorkerMessageType . TIMEOUT_EXPIRED ) ;
94101 } , timeout ) ;
95102 }
96103
@@ -101,11 +108,11 @@ function useWebWorkerFn<T extends (...args: any[]) => any>(
101108 new Promise < ReturnType < T > > ( ( resolve , reject ) => {
102109 promiseRef . current = { resolve, reject } ;
103110 workerRef . current ?. postMessage ( [ fnArgs ] ) ;
104- setWorkerStatus ( ' RUNNING' ) ;
111+ setWorkerStatus ( WorkerMessageType . RUNNING ) ;
105112 } ) ;
106113
107114 const workerFn = ( ...fnArgs : Parameters < T > ) => {
108- if ( workerStatus === ' RUNNING' ) {
115+ if ( workerStatus === WorkerMessageType . RUNNING ) {
109116 console . error ( '[useWebWorkerFn] You can only run one instance of the worker at a time.' ) ;
110117 return Promise . reject ( new Error ( 'Worker is already running' ) ) ;
111118 }
0 commit comments