Simple, zero-dependency, object pseudo-database for Cloudflare Workers using R2 buckets, strongly inspired by lowdb 🤗(https://github.com/typicode/lowdb/).
Become a sponsor and have your company logo here 👉 GitHub Sponsors
import lowstorage from 'lowstorage';
// Initialize object and get users collection
const usersCol = await lowstorage(env, 'MY_TESTING_BUCKET').collection('users');
// Add new user
// you can provide _id or it will be generated as crypto.randomUUID(); -> https://developers.cloudflare.com/workers/runtime-apis/web-crypto/
const newUser = await usersCol.insert({
name: 'Kevin',
gender: 'whatever',
posts: [],
});
// Show all users
const allUsers = usersCol.find({});
// Find user by ID and update name
await usersCol.update({ _id: id }, { name: 'Carlos' });
- Lightweight
- Minimalist
- Familiar API
- plain JavaScript
- Zero-dependency
npm install lowstorage
Seamless migration, robust free tier, Nonee gress fees. Dive into the future of data storage with Cloudflare R2 https://developers.cloudflare.com/r2/
- Storage: 10 GB/month
- Class A operations (mutate state): 1,000,000 / month
- Class B operations (read state): 10,000,000 / month
- more details on pricing R2
- In the Cloudflare console, go to R2 (left navigation)
- Click Create Bucket
- Enter any bucket name you want (we use testing-lowstorage)
- Click Create Bucket (bottom)
- Go to 'Worker & Pages'
- Click on your worker (or create new one)
- Go to 'Settings' -> Variables
- In section 'R2 Bucket Bindings' click EDIT VARIABLES
- Hit '+ Add Binding' and pick variable name (we use 'MY_TESTING_BUCKET') and select your R2 bucket
- Click 'Save & Deploy'
Check out wrangler.toml from examples
Insctructions with pictures https://github.com/gfodor/p2pcf/blob/master/INSTALL.md#set-up-the-r2-bucket
-
insert(doc)
- Input: A single object or an array of objects.
- Behavior: Inserts the given document(s) into the collection. Each document is assigned a unique identifier if it doesn't already have one.
- Returns: A promise that resolves when the insert operation is complete.
-
find(query)
- Input: A query object (e.g.,
{_id: id}
). - Behavior: Searches for documents that match the query.
- Returns: A promise that resolves to an array of matching documents.
- Input: A query object (e.g.,
-
findOne(query)
- Input: A query object.
- Behavior: Similar to
find
, but it returns only the first matching document. - Returns: A promise that resolves to a single document or
null
if no match is found.
-
update(query, update)
- Input: A query object and an update object.
- Behavior: Updates all documents that match the query with the provided update data.
- Returns: A promise that resolves to the number of documents updated.
-
updateOne(query, update)
- Input: A query object and an update object.
- Behavior: Updates the first document that matches the query with the provided update data.
- Returns: A promise that resolves to
1
if a document is updated, otherwise0
.
-
delete(query)
- Input: A query object.
- Behavior: Deletes documents that match the query.
- Returns: A promise that resolves to the number of documents deleted.
-
remove()
- Behavior: Removes all documents from the collection.
- Returns: A promise that resolves to the number of documents removed.
-
count(query)
- Input: A query object (optional).
- Behavior: Counts the number of documents that match the query. If no query is provided, it counts all documents in the collection.
- Returns: A promise that resolves to the count of matching documents.
Check out dummy examples Run:
cd examples
npm install
npm run dev
- no test coverage, use carefully
- response speed (no benchmarks so far)
Feel free to dive in! Open an issue or submit PRs.
Standard Readme follows the Contributor Covenant Code of Conduct.