Skip to content

IndexedDB adapter fails in Web Workers because distributed bundle resolves IndexedDB from window.indexedDB #546

Description

@Wxh16144

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:

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 function

Package Version

flexsearch@0.8.212

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions