IndexedDB adapter fails in Web Workers because distributed bundle resolves IndexedDB from `window.indexedDB`
[email protected] 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:
Bb.open(...)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 functionPackage 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
);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: ✅ availableself.indexedDB: ✅ availablewindow: ❌ 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 functionSource: nextapps-de/flexsearch