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 { D1Database, D1DatabaseAPI } from "@miniflare/d1";
import { createSQLiteDB } from "@miniflare/shared";
import fs from "node:fs";

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

const dbPromise = Promise.resolve()
  .then(() => createSQLiteDB("./data/data.db"))
  .then((sqliteDb) => new D1Database(new D1DatabaseAPI(sqliteDb)));

export default createMiddleware(async (context) => {
  const db = await dbPromise;
  context.platform.env = context.platform.env ?? {};
  context.platform.env.CLOUDFLARE_DB = db;
  return hattipHandler(context);
});