npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dexie-worker

v1.3.18

Published

A library for managing IndexedDB in a Web Worker using Dexie.js, optimized for React applications. It offers reactive database access with RxJS and Dexie hooks, providing efficient data handling in the background without blocking the main thread.

Readme

dexie-worker

🌐 Live Demo

dexie-worker is an extension package for Dexie.js that creates a Web Worker and a corresponding proxy in the main thread and executes the dexie queries in the web worker, allowing for handling of IndexedDB operations without blocking the UI.

📦 Installation

Install the package via npm:

npm i dexie-worker

🛠️ Usage

  1. Define Your Dexie Database
  2. Initialize with Web Worker: Use getWebWorkerDB to enable Web Worker functionality for your Dexie instance.
import Dexie from "dexie";
import { getWebWorkerDB } from "dexie-worker";

const _db = new Dexie("MyDatabase");
_db.version(1).stores({
  products: "++id, name"
});
_db.open(); // initializing the database is required
const db = getWebWorkerDB(_db);

Now, db will run on a separate thread.

⚛️ React Hook: useLiveQuery

dexie-worker also provides a useLiveQuery hook for React apps, which allows you to subscribe to live query updates from the database.

⚠️ Warning: Unlike the default usage in dexie-react-hooks, you'll need to pass the db instance within the callback function.

Usage Example

import { useLiveQuery } from "dexie-worker";

// IMPORTANT: use "db" returned from the callback function
const userDetails = useLiveQuery((db) => db.users.get({ id: 1 }));
// userDetails will automatically update when data changes

Custom Live Queries

For advanced usage, dexie-worker exports the liveQuery function, allowing you to create your own custom live queries outside of React components.

Example of a Custom Live Query

import { liveQuery } from "dexie-worker";

// Create a custom live query
const userLiveData = liveQuery((db) => db.users.where("age").above(18).toArray());

// Subscription to the live query
userLiveData.subscribe({
  next: (data) => console.log("User data updated:", data),
  error: (error) => console.error("Live query error:", error),
});

🔐 Content Security Policies

This library uses code injection to execute the web worker, which may not comply with Content Security Policy (CSP) if your website uses one. To ensure CSP compliance, please follow:

1. Using your own Web Worker

This example uses Vite. Modify the code to suit your environment.

worker.ts

import {getMessageListener} from 'dexie-worker'

self.addEventListener('message', getMessageListener({
  operations: {
    async myExampleOperation(dexie, arg1, arg2) {
      // ...
    }
  }
}))

main.ts

import DexieWorker from './worker.ts?worker'
const workerDB = getWebWorkerDB(db, {
  worker: new DexieWorker(),
});
// You can call the operations as the following
await workerDB.operation('myExampleOperation', 1, 2)

2. Generate Web Worker File (Alternative)

To generate a web worker file, execute the following

generate-dexie-worker

This command generates a web worker file based on your project configuration. The file needs to be placed in a publicly accessible location (e.g. http://localhost/dexieWorker.js)

To initialize the Dexie worker with the generated file:

const db = getWebWorkerDB(dexieDb, {
  workerUrl: '/dexieWorker.js' // the path can be different based on your environment
});

This will no longer use code injection.

Custom Operations

You can create custom operations to run within the web worker to improve performance and extend support to cases that are otherwise unsupported due to limitations in communicating with the web worker, such as the inability to pass callbacks (e.g., with methods like each). You can follow this or follow these steps:

  1. Create a dexie-worker.config.js(or .ts) file with your custom operations:
import Dexie from "dexie";
import map from "lodash.map"; // you can use external libraries

export default {
  operations: {
    async runBulkOperationInWorkerExample(dexie: Dexie, arg1: any, arg2: any) {
      const oldUsers = await dexie.users.toArray();

      const newUsers = map(oldUsers, user => ({
        ...user,
        isActive: true,
      }));

      await dexie.transaction('rw', dexie.usersV2, async () => {
        await dexie.usersV2.bulkPut(newUsers);
      });

      return 'A seralizable result' // e.g Objects, Arrays, Strings, etc. To learn more about not supported types refer to https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#things_that_dont_work_with_structured_clone
    },
    // ...other methods
  }
}
  1. Generate the web worker file:
generate-dexie-worker ./path/to/dexie-worker.config.js

Note: The command automatically detects your Dexie version from package.json, but you can specify a version manually:

npx generate-dexie-worker ./path/to/dexie-worker.config.js "3.2.2"
  1. Place the generated file in a publicly accessible location(e.g. http://localhost/dexieWorker.js)
  2. initialize the dexie worker with the following options:
const db = getWebWorkerDB(dexieDb, {
  workerUrl: '/dexieWorker.js' // the path can be different based on your environment
});
  1. Call your custom operations:
const result = await db.operation('runBulkOperationInWorkerExample', arg1, arg2)

How not to depend on jsDelivr in your worker

  1. Generate a web worker file
  2. Edit the generated file (e.g. dexieWorker.js) and change the jsDelivr URL with your own hosted file.

✨ Features

  • Web Worker Integration: Run Dexie.js in a Web Worker to improve app responsiveness.
  • React Hook Support: Use useLiveQuery to fetch and subscribe to live data changes.
  • Framework-Agnostic Query Subscription: Real-time updates with liveQuery

API

getWebWorkerDB(dbInstance)

  • Description: Converts a Dexie instance to run in a Web Worker.
  • Parameters:
    • dbInstance: An instance of your Dexie subclass or function-based instance.
  • Returns: A Web Worker-enabled Dexie instance.

useLiveQuery(queryCallback)

  • Description: React hook for live queries on Dexie. Optimized for Web Worker integration.
  • Parameters:
    • queryCallback: A callback function to execute the query, taking db as an argument.
  • Returns: The result of the query, updating automatically with data changes.

liveQuery(queryCallback)

  • Description: A function for setting up custom live queries with automatic updates.
  • Parameters:
    • queryCallback: A callback function defining the query logic.
  • Returns: A subscribable that emits updates when the query result changes.

Compatibility

  • Dexie.js v3.0+ and v4.0+
  • React v16.8+ (if using useLiveQuery)

License

MIT

🤝 Contribution

Feel free to contribute to the project by creating issues or pull requests. Contributions, bug reports, and feature requests are welcome!