C15T Logo

Cloudflare Workers

Example of self hosting c15t and Cloudflare Workers.

Canary Feature

This feature is available in canary releases and may have breaking changes. Use with caution in production. Report issues on GitHub

Info

To view the full example, see the Cloudflare example repository.

src/index.ts
import { c15tInstance } from "@c15t/backend/v2";
import { kyselyAdapter } from "@c15t/backend/v2/db/adapters/kysely";
import { Kysely, PostgresDialect } from "kysely";
import { Pool } from "pg";

const handler = (env: Env) => {
  const instance = c15tInstance({
    appName: "c15t-self-host",
    basePath: "/api/c15t",
    adapter: kyselyAdapter({
      db: new Kysely({
        dialect: new PostgresDialect({
          pool: new Pool({
            connectionString: env.DATABASE_URL
          })
        })
      }),
      provider: "postgresql"
    }),

    trustedOrigins: ["localhost", "vercel.app"],
    advanced: {
      disableGeoLocation: true,
      openapi: {
        enabled: true
      }
    },
    logger: {
      level: "error"
    }
  });

  return async (request: Request): Promise<Response> => {
    try {
      return await instance.handler(request);
    } catch (error) {
      console.error("Error handling request:", error);

      return new Response(
        JSON.stringify({
          error: "Internal Server Error",
          message: error instanceof Error ? error.message : String(error)
        }),
        {
          status: 500,
          headers: { "Content-Type": "application/json" }
        }
      );
    }
  };
};

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    return await handler(env)(request);
  }
};