Cloudflare Workers

Rakkas projects can be deployed to Cloudflare Workers. First, you should install the suitable HatTip adapter:

npm install -S @hattip/adapter-cloudflare-workers

Then you should set the adapter option of Rakkas Vite plugin to "cloudflare-workers":

import { defineConfig } from "vite";
import rakkas from "rakkasjs/vite-plugin";

export default defineConfig({
	plugins: [
		rakkas({
			adapter: "cloudflare-workers",
		}),
	],
});

Then create a wrangler.toml file like this:

name = "my-rakkas-project"
compatibility_date = "2021-11-01"
compatibility_flags = [
  "streams_enable_constructors",
]
main = "dist/server/cloudflare-workers-bundle.js"
usage_model = 'bundled'
workers_dev = true

[site]
bucket = "./dist/client"

After building with rakkas build, you can publish your project with wrangler publish. You can also test locally with wrangler dev --local.

Cloudflare Workers-specific APIs

During development, Rakkas applications always run on Node.js regardless of the adapter setting. As such, Cloudflare Workers-specific APIs like the KV store and durable objects are not available. You can polyfill them using, e.g., @miniflare/kv and @miniflare/durable-objects packages in a custom Node.js entry.

For example, to simulate a D1 database with the binding CLOUDFLARE_DB during development:

// src/entry-node.ts
import { createMiddleware } from 'rakkasjs/node-adapter';
import hattipHandler from './entry-hattip';
import { BetaDatabase } from '@miniflare/d1';
import { createSQLiteDB } from '@miniflare/shared';
import fs from 'fs';

fs.mkdirSync('./data', { recursive: true });

const dbPromise = Promise.resolve()
  .then(() => createSQLiteDB('./data/data.db'))
  .then((db) => new BetaDatabase(db));
  
export default createMiddleware(async (context) => {
  const db = await dbPromise;
  context.platform.env = context.platform.env ?? {};
  context.platform.env.CLOUDFLARE_DB = db;
  return hattipHandler(context);
});