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 🙏

© 2024 – Pkg Stats / Ryan Hefner

pixdb

v1.0.1

Published

Promise-based indexedDB wrapper

Downloads

1

Readme

PixDB

Promise-based indexedDB: a wrapper object which provides a nicer and more useable API for client-side storage in indexedDB.

Compatibility

PixDB is compatible with modern browsers which supports ES modules.

Installation

Load the module from a CDN:

import { PixDB } from 'https://cdn.jsdelivr.net/npm/pixdb/dist/pixdb.js'

If using npm and a bundler, install with:

npm install pixdb

then import the module locally (path resolution will depend on the bundler):

import { PixDB } from './node_modules/pixdb/dist/pixdb.js';

Examples

Most methods are asynchronous and Promise-based so you must use async/await or .then.

Initialize a new connection with a database name, version, and an optional upgrade function. The upgrade function receives the connection, the old version number, and the new version number so it can create object stores and indexes:

// initialize
const db = await new PixDB('db', 1, (init, oldVersion, newVersion) => {

  log(`upgrading database from ${ oldVersion } to ${ newVersion }`);

  switch (oldVersion) {

    case 0: {
      const state = init.createObjectStore('state', { keyPath: 'name' });
      state.createIndex('updateIdx', 'update', { unique: false });
    }

  }

});

This creates an object store named state which with the key on the name property and an index named updateIdx on the update property.

You can check the connection, name, and version:

// db 1 true
console.log( db.name, db.version, db.isConnected );

Add a single new record into state - but not permit overwrites:

await db.add({ store: 'state', item: { name: 'a', value: 1, update: new Date() } });

or add an array of records (again, overwriting is not permitted):

await db.add({ store: 'state', item: [
    { name: 'b', value: 'two', update: new Date() },
    { name: 'c', value: [3,3,3], update: new Date() }
  ]
});

The .put() method is identical to .add() except it permits overwrites:

await db.put({ store: 'state', item: { name: 'a', value: 'new' } });

Count the number of items in a store:

// 3
await db.count({ store: 'state' });

Get a single value by its key:

// { name: 'a', value: 'new' }
await db.get({ store: 'state', key: 'a'});

Get an array of all values with a lowerBound, upperBound, and maximum count of records:

// [
//   { name: 'a', value: 'new' },
//   { name: 'b', value: 'two', update: '2023-08-18' },
//   { name: 'c', value: [3,3,3], update: '2023-08-18' }
// ]
await db.getAll({ store: 'state', lowerBound: 'a', upperBound: 'z', count: 5 });

Get an array of all store keys:

// ['a', 'b', 'c']
await db.getAllKeys({ store: 'state' });

Use a cursor to iterate through each record one at a time and pass the value to a synchronous callback function:

await db.getCursor({
  store: 'state',
  callback: cursor => console.log(cursor.value)
});

Note that if the callback function returns a numeric number greater than 1, it will jump forward that number of records.

Delete a record using its key:

await db.delete({ store: 'state', key: 'a' });

Clear every record in a store:

await db.clear({ store: 'state' });

Close the database connection:

await db.close();

API reference

Most PixDB object methods:

  • use a single object parameter with specific properties, and
  • return a Promise which resolves on success or rejects on failure.

The PixDB constructor parameters:

| name | type | description | |-|-|-| | name | string | database name | | version | number | version number | | upgrade | function | upgrade function |

The upgrade function is passed the database connection, oldVersion, and newVersion.

The constructor returns a Promise which resolves/rejects when a database connection is established so await must be used:

Example:

const db = await new PixDB('db', 1, (init, oldVersion, newVersion) => {

  log(`upgrading database from ${ oldVersion } to ${ newVersion }`);

  switch (oldVersion) {

    case 0: {
      const state = init.createObjectStore('state', { keyPath: 'name' });
      state.createIndex('updateIdx', 'update', { unique: false });
    }

  }

});

.isConnected

Returns true when the database connection is active.

.name

Returns the database name string (or null if the database is dropped).

.version

Returns the database version number (or null if the database is dropped).

.add( paramObject )

Add one or more new records but does not permit overwrites.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) | | item | object | array | single record or an array of records to add |

Returns a Promise which resolves/rejects when all records have been written.

// add one record
await db.add({ store: 'state', item: { name: 'a', value: 1 } });

// add more than one record in one transaction
await db.add({ store: 'state', item: [
  { name: 'b', value: 2 },
  { name: 'c', value: 3 }
  ]
});

.put( paramObject )

Identical to .add() except overwrites are permitted.

.delete( paramObject )

Delete a record in an object store by key name.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) | | key | * | key value (required) |

Returns a Promise which resolves/rejects when the record is deleted. It also resolves if the record does not exist.

await db.delete({ store: 'state', key: 'a' });

.deleteAll( paramObject )

Delete all records referenced between optional lower and upper boundaries on a store or index.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) | | index | string | object store index | | lowerBound | * | lower key value | | upperBound | * | upper key value |

Returns a Promise which resolves/rejects all records are deleted.

await db.deleteAll({ store: 'state', lowerBound: 'x', upperBound: 'z' });

.clear( paramObject )

Delete all records in an object store.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) |

Returns a Promise which resolves/rejects when all store records are deleted.

await db.clear({ store: 'state' });

.count( paramObject )

Count records in an object store or index.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) | | index | string | object store index | | lowerBound | * | lower key value | | upperBound | * | upper key value |

Returns a Promise which resolves/rejects when number of records is known.

// number of records in 'state'
await db.count({ store: 'state' });

// number of records in 'state' starting from 'x'
await db.count({ store: 'state', lowerBound: 'x' });

.get( paramObject )

Fetches a single record referenced by key or index key.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) | | index | string | object store index | | key | * | key value (required) |

Returns a Promise which resolves/rejects when record is found or not found.

const a = await db.get({ store: 'state', key: 'a'});

.getAll( paramObject )

Fetches an array of records referenced between optional lower and upper boundaries on a store or index.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) | | index | string | object store index | | lowerBound | * | lower key value | | upperBound | * | upper key value | | count | number | maximum number of records |

Returns a Promise which resolves/rejects when an array of records is found.

const all = await db.getAll({ store: 'state', lowerBound: 'a', upperBound: 'z', count: 10 });

.getAllKeys( paramObject )

Fetches an array of record keys referenced between optional lower and upper boundaries on a store or index.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) | | index | string | object store index | | lowerBound | * | lower key value | | upperBound | * | upper key value | | count | number | maximum number of records |

Returns a Promise which resolves/rejects when an array of keys is found.

const allKeys = await db.getAllKeys({ store: 'state' });

.getCursor( paramObject )

Fetches all records in a store or index range and pass each to a processing callback function.

paramObject properties:

| property | type | description | |-|-|-| | store | string | object store (required) | | index | string | object store index | | lowerBound | * | lower key value | | upperBound | * | upper key value | | direction | string | direction to travel: next (default), nextunique, prev, or prevunique | | callback | function | the cursor is passed to this synchronous function so cursor methods can be used. The function can optionally return a positive integer to jump forward N records |

Returns a Promise which resolves/rejects once all records have been processed.

await db.getCursor({
  store: 'state',
  callback: cursor => console.log(cursor.value)
});

.close()

Close the database connection. Nothing is returned.

db.close();

.connect()

Reconnect to database after .close() has closed a connection. Returns a Promise which resolves/rejects when the database connection is established.

await db.connect();

.drop()

Delete the whole database, its stores, indexes, and data. Returns a Promise which resolves/rejects when database has been deleted.

await db.drop();

Usage policy

You are free to use this as you like but please do not republish it as your own work.

Please consider sponsorship if you use PixDB commercially, require support, or need new features.