flexsearch@0.8.212 fails when using the persistent IndexedDB adapter inside a Web Worker / module worker.
The failure happens because the distributed IndexedDB adapter resolves IndexedDB from window.indexedDB at module initialization time:
const Bb = typeof window !== "undefined" &&
(window.indexedDB ||
window.mozIndexedDB ||
window.webkitIndexedDB ||
window.msIndexedDB)
Later, the adapter calls:
In a Web Worker, window is not available. IndexedDB is available via globalThis.indexedDB or self.indexedDB, but not via window.indexedDB.
As a result, Bb is not a valid IDBFactory, and opening the database fails.
Runtime Error
Error: Bb.open is not a function
Package Version
Relevant Package Entry Points
From the published package.json:
{
"main": "dist/flexsearch.bundle.min.js",
"module": "dist/flexsearch.bundle.module.min.mjs",
"exports": {
".": {
"types": "./index.d.ts",
"import": "./dist/flexsearch.bundle.module.min.mjs",
"require": "./dist/flexsearch.bundle.min.js"
},
"./db/*": {
"import": "./dist/module/db/*/index.js",
"require": "./dist/db/*/index.cjs"
}
},
"browser": {
"dist/flexsearch.bundle.module.min.js": "./dist/flexsearch.bundle.module.min.mjs"
}
}
The published dist/flexsearch.bundle.module.min.js contains this worker-incompatible IndexedDB lookup (line 94):
const Bb = typeof window !== "undefined" &&
(window.indexedDB ||
window.mozIndexedDB ||
window.webkitIndexedDB ||
window.msIndexedDB)
The source file also uses window:
const IndexedDB = typeof window !== "undefined" && (
window.indexedDB ||
window.mozIndexedDB ||
window.webkitIndexedDB ||
window.msIndexedDB
);
Reference:
|
const IndexedDB = typeof window !== "undefined" && ( |
|
window.indexedDB || |
|
window.mozIndexedDB || |
|
window.webkitIndexedDB || |
|
window.msIndexedDB |
|
); |
|
const IDBTransaction = typeof window !== "undefined" && ( |
|
window.IDBTransaction || |
|
window.webkitIDBTransaction || |
|
window.msIDBTransaction |
|
); |
|
const IDBKeyRange = typeof window !== "undefined" && ( |
|
window.IDBKeyRange || |
|
window.webkitIDBKeyRange || |
|
window.msIDBKeyRange |
|
); |
Environment
- FlexSearch version:
0.8.212
- Runtime: browser Web Worker / module worker
- Bundler: webpack
- Browser environment: Chromium / Electron renderer
- IndexedDB availability in worker:
globalThis.indexedDB: ✅ available
self.indexedDB: ✅ available
window: ❌ not defined
Minimal Reproduction
worker.js:
import * as FlexSearch from "flexsearch";
const index = new FlexSearch.Document({
document: {
id: "id",
index: ["title", "content"],
store: true
},
commit: false
});
const storage = new FlexSearch.IndexedDB("flexsearch-worker-test");
await index.mount(storage);
await index.db;
await index.add({
id: "1",
title: "hello",
content: "world"
});
await index.commit();
self.postMessage("done");
Main thread:
const worker = new Worker(new URL("./worker.js", import.meta.url), {
type: "module"
});
worker.addEventListener("message", console.log);
worker.addEventListener("error", console.error);
Expected Behavior
The IndexedDB persistent adapter should work inside a Web Worker when IndexedDB is available through globalThis.indexedDB or self.indexedDB.
Actual Behavior
The adapter resolves IndexedDB from window.indexedDB.
Since window is not defined in Web Workers, the internal IndexedDB reference (Bb) is invalid and opening the database fails:
Error: Bb.open is not a function
flexsearch@0.8.212fails when using the persistent IndexedDB adapter inside a Web Worker / module worker.The failure happens because the distributed IndexedDB adapter resolves IndexedDB from
window.indexedDBat module initialization time:Later, the adapter calls:
In a Web Worker,
windowis not available. IndexedDB is available viaglobalThis.indexedDBorself.indexedDB, but not viawindow.indexedDB.As a result,
Bbis not a validIDBFactory, and opening the database fails.Runtime Error
Package Version
Relevant Package Entry Points
From the published
package.json:{ "main": "dist/flexsearch.bundle.min.js", "module": "dist/flexsearch.bundle.module.min.mjs", "exports": { ".": { "types": "./index.d.ts", "import": "./dist/flexsearch.bundle.module.min.mjs", "require": "./dist/flexsearch.bundle.min.js" }, "./db/*": { "import": "./dist/module/db/*/index.js", "require": "./dist/db/*/index.cjs" } }, "browser": { "dist/flexsearch.bundle.module.min.js": "./dist/flexsearch.bundle.module.min.mjs" } }The published
dist/flexsearch.bundle.module.min.jscontains this worker-incompatible IndexedDB lookup (line 94):The source file also uses
window:Reference:
flexsearch/src/db/indexeddb/index.js
Lines 15 to 30 in f7ed963
Environment
0.8.212globalThis.indexedDB: ✅ availableself.indexedDB: ✅ availablewindow: ❌ not definedMinimal Reproduction
worker.js:Main thread:
Expected Behavior
The IndexedDB persistent adapter should work inside a Web Worker when IndexedDB is available through
globalThis.indexedDBorself.indexedDB.Actual Behavior
The adapter resolves IndexedDB from
window.indexedDB.Since
windowis not defined in Web Workers, the internal IndexedDB reference (Bb) is invalid and opening the database fails: