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

xwebdb-kvadapter

v0.0.4

Published

Cloudflare KVAdapter remote sync adapter for XWebDB

Downloads

7

Readme

XWebDB-KVAdapter

An adapter to use Cloudflare KV as a remote synchronization service database.

How to use

A. Creating an endpoint

Since Cloudflare KV doesn't support CORS requests, you'll need to setup a cloudflare worker to act as an interface for your Cloudflare KV API:

Here's a code to place in your cloudflare worker for convenience:

// replace the following string with your own account identifier
// this is usually found at the URL of your account dashboard
// https://dash.cloudflare.com/{ACCOUNT_IDENTIFIER_HERE}/....etc
const accountIdentifier = "YOUR_ACCOUNT_IDENTIFIER";

// the rest of the code is a pure proxy to:
// api.cloudflare.com/
// since the latter doesn't support CORS request
addEventListener("fetch", (event) => {
	event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
	if (request.method === "OPTIONS") {
		// Handle CORS preflight request
		return new Response(null, {
			headers: {
				"Access-Control-Allow-Origin": "*",
				"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE",
				"Access-Control-Allow-Headers": "Content-Type, Authorization",
				"Access-Control-Max-Age": "86400", // 1 day
			},
		});
	}

	const apiURL = `https://api.cloudflare.com/client/v4/accounts/${accountIdentifier}/storage/kv/namespaces`;
	const targetUrl = request.url
		.replace(/.*\.dev/, apiURL)
		.replace(/\/$/, "")
		.replace(/\/\?/, "?");
	const targetRequest = new Request(targetUrl, {
		method: request.method,
		headers: request.headers,
		body: request.body,
	});

	const targetResponse = await fetch(targetRequest);
	const response = new Response(targetResponse.body, targetResponse);
	response.headers.set("Access-Control-Allow-Origin", "*");
	response.headers.set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
	response.headers.set("Access-Control-Allow-Headers", "Content-Type, Authorization");
	return response;
}

After setting up the worker, it will have a live URL, like https://kv.yourusername.workers.dev this is what we'll call an endpoint the next step is to have a token.

B. Creating a token

  1. From the user profile, navigate to API Tokens.
  2. Create token, using the Edit Cloudflare Workers template.
  3. Copy the token and storing it in a safe place.

C. Setting up synchronization adapter

Now that we have an endpoint and a token

import { Database } from "xwebdb";
import { kvAdapter } from "xwebdb-kvadapter";

const db = new Database({
	sync: {
		// define remote sync adapter
		syncToRemote: kvAdapter("YOUR_ENDPOINT", "YOUR_TOKEN"),
		// define an interval at which the database will
		// automatically sync with the remote database
        // defaults to "0" (will not sync on interval) only manually
		syncInterval: 500,
	},
	
	/// rest of database configuration
	/// 	ref: ...
	/// 	model:  ...
	/// 	...etc: ...
});

That's it.

License: MIT