Core concepts
Runtime
All Workertown services expose the ability to customise their runtime behaviour depending on the environment they are running in - this is a powerful configuration that ensures that the service can run essentially anywhere™.
How it works
Each Workertown service exposes a runtime option that can be passed when created that takes either an object exposing the required shape of that service's runtime or a function that returns an object exposing the required shape of that service's runtime.
import { search, type RuntimeResolver } from "@workertown/search";
export default search({
runtime: {
// Options go here...
} as RuntimeResolver,
});
import { search, type RuntimeResolver } from "@workertown/search";
const runtime: RuntimeResolver = () => ({
// Options go here...
});
export default search({ runtime });
Check the docs!
Each Workertown service has a similar but different set of required values to satisfy their RuntimeResolver type.
Read the docs for the service you're using to see what options are available.
Built-in runtimes
Each Workertown service has a set of built-in runtimes that can be used to quickly get up and running in a specific environment.
Cloudflare Workers
The cloudflare-workers runtime is the default runtime for all Workertown services, and so any Workertown service that does not specify a runtime will use this by default. This runtime requires D1 for storage, and optionally KV for the cache (where caching is supported).
Each Workertown package exposes a Cloudflare Workers runtime that can be used when creating the service.
import { search } from "@workertown/search";
import { runtime } from "@workertown/search/cloudflare-workers";
export default search({ runtime });
The cloudflare-workers runtime will attempt to retrieve the necessary KV and D1 bindings from the environment based on the env.cache and env.db values in the service's options, e.g. if env.cache is set to MY_CACHE then the runtime will attempt to retrieve the KV binding from env.MY_CACHE.
Edge
The edge runtime is a runtime that can be used to run Workertown services within edge (WinterCG compatible) environment. This environment will use Planetscale for storage and Upstash Redis for the cache (where caching is supported).
Each Workertown package exposes an edge runtime that can be used when creating the service.
import { search } from "@workertown/search";
import { runtime } from "@workertown/search/edge";
export default search({ runtime });
The edge runtime will attempt to retrieve the necessary Planetscale and Upstash Redis options from the environment, based on the env.db and env.cache values in the service's options, e.g. if env.db is set to MY_DB then the runtime will attempt to retrieve the Planetscale URL from env.MY_DB.
The Planetscale URL should be set in the environment in the format mysql://<USERNAME>:<PASSWORD>@<URL>, where USERNAME and PASSWORD are your database credentials.
The Upstash Redis URL should be set in the environment in the format https://<TOKEN>@<URL>, where TOKEN is your authentication token.
NodeJS
The nodejs runtime is a runtime that can be used to run Workertown services within a NodeJS environment. This environment will use Sqlite for storage, and an in-memory cache for the cache (where caching is supported).
Each Workertown package exposes a NodeJS runtime that can be used when creating the service.
import { search } from "@workertown/search";
import { runtime } from "@workertown/search/node"
export default search({ runtime });
The nodejs runtime will attempt to retrieve the Sqlite file path from the environment based on the env.db value in the service's options, e.g. if env.db is set to MY_DB then the runtime will attempt to load/create the database file at the value set in process.env.MY_DB (as long as it ends in .sqlite).
Test runtime
The test runtime is a runtime that can be used to run Workertown services when developing and testing locally. It is not intended to be used in production, as it will store any data in memory which will only live for the lifetime of the process the service runs in.
Each Workertown package exposes a test runtime that can be used when creating the service.
import { search } from "@workertown/search";
import { runtime } from "@workertown/search/test"
export default search({ runtime });
Environments
Below, you will find simple (i.e. contrived) examples of how to create and start a Workertown service in various environments.
AWS Lambda
import { serve } from "@workertown/aws-lambda";
import { search } from "@workertown/search";
export const handler = serve(search());
AWS Lambda@Edge
import { serve } from "@workertown/aws-lambda-edge";
import { search } from "@workertown/search";
export const handler = serve(search());
Bun
import { search } from "@workertown/search";
const server = search();
export default {
port: 3000,
fetch: server.fetch,
};
Cloudflare Workers
import { search } from "@workertown/search";
export default search();
Cloudflare Pages
import { serve } from "@workertown/cloudflare-pages";
import { search } from "@workertown/search";
export const onRequest = serve(search());
Fastly Compute@Edge
import { search } from "@workertown/search";
const server = search();
server.fire();
Google Cloud Functions
import { search } from "@workertown/search";
import { serve } from "@workertown/google-cloud-functions";
serve(search());
Google Cloud Run
import { serve } from "@workertown/node";
import { search } from "@workertown/search";
const server = search();
serve(server, {
port: 8080,
});
Lagon
import { search } from "@workertown/search";
const server = search();
export const handler = server.fetch;
Node.js
import { serve } from "@workertown/node";
import { search } from "@workertown/search";
const server = search();
serve(server, {
port: 3000,
});
Vercel
import { search } from "@workertown/search";
import { serve } from "@workertown/vercel";
export default serve(search());