Skip to content

Commit 2030653

Browse files
committed
support for useSharedWorker
1 parent 2015865 commit 2030653

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

packages/idb-cache/src/index.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ export interface IDBCacheConfig {
8989
* Low priority slightly delays start of operations to reduce load on the event loop.
9090
*/
9191
priority?: "normal" | "low";
92+
/**
93+
* Controls whether to use SharedWorker or Worker for encryption/decryption.
94+
* When true (default), uses SharedWorker if available, falling back to Worker.
95+
* When false, always uses Worker even if SharedWorker is available.
96+
*/
97+
useSharedWorker?: boolean;
9298
}
9399

94100
const DB_VERSION = 2;
@@ -121,6 +127,7 @@ export class IDBCache implements IDBCacheInterface {
121127
private debug: boolean;
122128
private maxTotalChunks?: number;
123129
private priority: "normal" | "low" = "normal";
130+
private useSharedWorker: boolean;
124131

125132
constructor(config: IDBCacheConfig) {
126133
const {
@@ -134,6 +141,7 @@ export class IDBCache implements IDBCacheInterface {
134141
pbkdf2Iterations = DEFAULT_PBKDF2_ITERATIONS,
135142
maxTotalChunks,
136143
priority = "normal",
144+
useSharedWorker = true,
137145
} = config;
138146

139147
this.storeName = "cache";
@@ -147,6 +155,7 @@ export class IDBCache implements IDBCacheInterface {
147155
this.maxTotalChunks = maxTotalChunks;
148156
this.pendingRequests = new Map();
149157
this.priority = priority;
158+
this.useSharedWorker = useSharedWorker;
150159

151160
if (!window.indexedDB)
152161
throw new DatabaseError("IndexedDB is not supported.");
@@ -194,7 +203,6 @@ export class IDBCache implements IDBCacheInterface {
194203
if (this.workerReadyPromise) {
195204
return this.workerReadyPromise;
196205
}
197-
198206
this.workerReadyPromise = new Promise<void>((resolve, reject) => {
199207
const rejectAll = (errorMessage: string) => {
200208
reject(new WorkerInitializationError(errorMessage));
@@ -203,8 +211,10 @@ export class IDBCache implements IDBCacheInterface {
203211

204212
const { worker, port } = createWorkerFromFunction(
205213
encryptionWorkerFunction,
206-
rejectAll
214+
rejectAll,
215+
this.useSharedWorker
207216
);
217+
208218
this.worker = worker;
209219
this.port = port;
210220

@@ -259,7 +269,7 @@ export class IDBCache implements IDBCacheInterface {
259269
`Deleting expired item with timestamp ${timestamp}. It is ${age}ms older than the expiration.`
260270
);
261271
}
262-
cursor.delete();
272+
await cursor.delete();
263273
} else {
264274
break;
265275
}
@@ -282,7 +292,7 @@ export class IDBCache implements IDBCacheInterface {
282292
rangeCursor.value.cacheBuster
283293
);
284294
}
285-
rangeCursor.delete();
295+
await rangeCursor.delete();
286296
itemsDeleted++;
287297
rangeCursor = await rangeCursor.continue();
288298
}
@@ -352,7 +362,7 @@ export class IDBCache implements IDBCacheInterface {
352362

353363
// Delete all collected chunkKeys
354364
for (const chunkKey of chunkKeysToDelete) {
355-
store.delete(chunkKey);
365+
await store.delete(chunkKey);
356366
if (this.debug) {
357367
console.debug(`Deleted chunk ${chunkKey}.`);
358368
}

packages/idb-cache/src/workerUtils.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,13 @@ function isErrorResponse(
5757
* Creates a SharedWorker from a given function and sets up initial communication.
5858
* @param fn - The worker function to execute.
5959
* @param rejectAll - Function to call to reject all pending requests in case of failure.
60+
* @param useSharedWorker - Whether to use SharedWorker if available (defaults to true).
6061
* @returns An object containing the worker instance and its message port.
6162
*/
6263
export function createWorkerFromFunction(
6364
fn: () => void,
64-
rejectAll: (errorMessage: string) => void
65+
rejectAll: (errorMessage: string) => void,
66+
useSharedWorker = true
6567
): {
6668
worker: SharedWorker | Worker;
6769
port: MessagePort | Worker;
@@ -76,7 +78,7 @@ export function createWorkerFromFunction(
7678
let worker: SharedWorker | Worker;
7779
let port: MessagePort | Worker;
7880

79-
if ("SharedWorker" in window) {
81+
if (useSharedWorker && "SharedWorker" in window) {
8082
worker = new SharedWorker(url, options);
8183
port = worker.port;
8284
port.start();

0 commit comments

Comments
 (0)