@@ -63,32 +63,48 @@ export function createWorkerFromFunction(
6363 fn : ( ) => void ,
6464 rejectAll : ( errorMessage : string ) => void
6565) : {
66- worker : SharedWorker ;
67- port : MessagePort ;
66+ worker : SharedWorker | Worker ;
67+ port : MessagePort | Worker ;
6868} {
6969 const scriptSource = `(${ fn . toString ( ) } )()` ;
7070 const base64Source = btoa ( scriptSource ) ;
7171 const url = `data:application/javascript;base64,${ base64Source } ` ;
72- const worker = new SharedWorker ( url , {
72+ const options = {
7373 name : "idb-cache-worker" ,
74- } ) ;
74+ } ;
7575
76- const port = worker . port ;
76+ let worker : SharedWorker | Worker ;
77+ let port : MessagePort | Worker ;
7778
78- port . start ( ) ;
79+ if ( "SharedWorker" in window ) {
80+ worker = new SharedWorker ( url , options ) ;
81+ port = worker . port ;
82+ port . start ( ) ;
83+ } else {
84+ worker = new Worker ( url , options ) ;
85+ port = worker ;
86+ }
7987
8088 worker . onerror = ( event ) => {
8189 console . error ( "SharedWorker encountered an error:" , event . message ) ;
8290 rejectAll ( "SharedWorker encountered an error and was terminated." ) ;
83- worker . port . close ( ) ;
91+ if ( worker instanceof SharedWorker ) {
92+ worker . port . close ( ) ;
93+ } else {
94+ worker . terminate ( ) ;
95+ }
8496 } ;
8597
8698 port . onmessageerror = ( ) => {
8799 console . warn (
88100 "MessagePort encountered a message error. SharedWorker may have been terminated."
89101 ) ;
90102 rejectAll ( "SharedWorker was terminated unexpectedly." ) ;
91- port . close ( ) ;
103+ if ( port instanceof MessagePort ) {
104+ port . close ( ) ;
105+ } else {
106+ port . terminate ( ) ;
107+ }
92108 } ;
93109
94110 return { worker, port } ;
@@ -118,7 +134,7 @@ export function rejectAllPendingRequests(
118134 * @param pendingRequests - Map of pending requests awaiting responses.
119135 */
120136export function initializeWorker (
121- port : MessagePort ,
137+ port : MessagePort | Worker ,
122138 resolveReady : ( ) => void ,
123139 rejectReady : ( reason ?: unknown ) => void ,
124140 pendingRequests : Map < string , ExtendedPendingRequest < EncryptedChunk | string > >
@@ -185,7 +201,11 @@ export function initializeWorker(
185201 pendingRequests ,
186202 "SharedWorker encountered an error and was terminated."
187203 ) ;
188- port . close ( ) ;
204+ if ( port instanceof MessagePort ) {
205+ port . close ( ) ;
206+ } else {
207+ port . terminate ( ) ;
208+ }
189209 } ;
190210}
191211
@@ -200,7 +220,7 @@ export function initializeWorker(
200220 * @returns A promise that resolves with the worker's response.
201221 */
202222export async function sendMessageToWorker < T extends WorkerMessage [ "type" ] > (
203- port : MessagePort ,
223+ port : MessagePort | Worker ,
204224 requestId : string ,
205225 message : Extract < WorkerMessage , { type : T } > ,
206226 pendingRequests : Map < string , ExtendedPendingRequest < WorkerResponseType < T > > > ,
0 commit comments