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

@lankajs/storage

v2.1.1

Published

module: Two adapters behind the port, a blob store beside them, WebCrypto encryption, encrypted zustand persistence.

Readme

@lankajs/storage

▸ module · Storage and encryption

Two adapters behind the port, a blob store beside them, WebCrypto encryption, encrypted zustand persistence.

A library in the same box. The app imports and calls it; core does not know it exists.

Runs in: the browser, node and React Native — everywhere.

How to use it: GUIDE.md — the user guide, with examples. How to change it: SKILL.md.

Contents

  • LankaWebStorageAdapterILankaStorageAdapter, both halves
  • LankaCacheStorageAdapter — the same port, asynchronous only
  • LankaIndexedDbAdapter — a different port: Blobs for @lankajs/blob-cache
  • LankaEncryptor + WebCryptoSupport — engine capability detection
  • LankaEncryptedStorage, LankaEncryptedStateStorage — zustand persistence
  • LankaIdRegistry — a stored string ↔ short id mapping with persistence hooks
  • stringBigIntCodec — reversible string-to-number encoding, stateless

Registry, not hasher

LankaIdRegistry does not hash: the id comes from a counter and is STORED, not computed. Without the stored mapping the number means nothing — which is why the registry has persistence and a hash could not.

Reversible string-to-number encoding is a separate, stateless unit (stringBigIntCodec).

Which engines were measured, and which were not taken

modules/storage-adapters/ holds one package per engine an application installs — MMKV, AsyncStorage, the keychain, unstorage and its twenty drivers. The adapters HERE are the ones over what a browser already provides, which is why they are not on that shelf: the ticket onto it is a peer dependency, and there is nothing to install to get localStorage.

Measured on 2026-09-12 and not taken, so the next reader does not ask again:

| Candidate | Why not | | --- | --- | | expo-sqlite, op-sqlite | a database rather than a key-value store; key-value over SQL is a two-column table, and whoever wants it writes an unstorage driver | | idb-keyval, localforage | a second answer to what LankaIndexedDbAdapter already answers | | node:fs, node:sqlite | covered by unstorage drivers, which is where @lankajs/host/server looks |

The two ties to core

LankaLogger, for transaction diagnostics, kept deliberately: a private console writer would mean two log formats in one app.

And the PORT. ILankaStorageAdapter is declared in lanka/storage and re-exported here — an adapter is written against either import and they are the same type. It sits in core so that @lankajs/tool-testing, which depends on lanka and nothing else, can hold the conformance suite every adapter in modules/storage-adapters/ is measured by.

No core CONFIG is needed either way — the encryption secret and the legacy plaintext keys come from the app, so storage works before the framework is bootstrapped.


Repository map: ../../README.md