Skip to content

Commit e7c510e

Browse files
committed
fall back to Worker if SharedWorker not supported
1 parent 1e7dd3a commit e7c510e

File tree

3 files changed

+41
-17
lines changed

3 files changed

+41
-17
lines changed

packages/idb-cache/src/encryptionTasks.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
* @throws {EncryptionError} If encryption fails.
1818
*/
1919
export async function encryptChunk(
20-
port: MessagePort,
20+
port: MessagePort | Worker,
2121
value: string,
2222
pendingRequests: Map<string, ExtendedPendingRequest<EncryptedChunk>>
2323
): Promise<EncryptedChunk> {
@@ -60,7 +60,7 @@ export async function encryptChunk(
6060
* @throws {DecryptionError} If decryption fails.
6161
*/
6262
export async function decryptChunk(
63-
port: MessagePort,
63+
port: MessagePort | Worker,
6464
iv: ArrayBuffer,
6565
ciphertext: ArrayBuffer,
6666
pendingRequests: Map<string, ExtendedPendingRequest<string>>

packages/idb-cache/src/index.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ const isSubtleCryptoSupported = crypto?.subtle;
103103
export class IDBCache implements IDBCacheInterface {
104104
dbReadyPromise: Promise<import("idb").IDBPDatabase<IDBCacheSchema>>;
105105
private storeName: STORE;
106-
private worker: SharedWorker | null = null;
107-
private port: MessagePort | null = null;
106+
private worker: SharedWorker | Worker | null = null;
107+
private port: MessagePort | Worker | null = null;
108108
private pendingRequests: Map<
109109
string,
110110
ExtendedPendingRequest<EncryptedChunk | string>
@@ -397,7 +397,7 @@ export class IDBCache implements IDBCacheInterface {
397397
await this.workerReadyPromise;
398398
}
399399

400-
private getPort(): MessagePort {
400+
private getPort(): MessagePort | Worker {
401401
if (!this.port) {
402402
throw new WorkerInitializationError("Worker port is not initialized.");
403403
}
@@ -826,7 +826,11 @@ export class IDBCache implements IDBCacheInterface {
826826
}
827827

828828
if (this.worker) {
829-
this.worker.port.close();
829+
if (this.worker instanceof SharedWorker) {
830+
this.worker.port.close();
831+
} else {
832+
this.worker.terminate();
833+
}
830834
this.worker = null;
831835
}
832836

packages/idb-cache/src/workerUtils.ts

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
120136
export 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
*/
202222
export 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

Comments
 (0)