Skip to main content
Restate services can run in a few ways: as a Node.js HTTP handler, connected to Restate Cloud/BYOC through an in-process tunnel, as an AWS Lambda handler, or on other Javascript runtimes like Bun, Deno and Cloudflare Workers.

Creating a Node.js HTTP handler

Use restate.serve to serve the provided services, starting an HTTP/2 server on port 9080.
If you need to manually control or customize the HTTP2 server, use restate.createEndpointHandler to create a Node HTTP/2 handler, and then use it to manually instantiate the HTTP server:
restate.createEndpointHandler works with both HTTP/1.1 and HTTP/2. It auto-detects the HTTP version per request, so you can use it with Node.js’s standard http module:
This is useful in environments that don’t support HTTP/2.

Connecting to Restate Cloud or BYOC

You can connect your service to Restate Cloud or BYOC through an outbound tunnel without exposing an inbound HTTP endpoint. Your service and handler implementations stay the same. Install the tunnel package:
Replace the HTTP server with a tunnel client, while passing the same services.
This example reads its configuration from environment variables: On Kubernetes, the Restate operator supplies the environment ID, region, tunnel name, and signing public key when you use tunnelMode: in-process. Follow the Kubernetes deployment guide to mount the API key and configure the deployment. Outside Kubernetes, you can set these variables yourself, or pass the configuration explicitly as shown in the Containers and VMs guide. That guide also covers creating credentials and registering the tunnel deployment.

Creating a Lambda handler

To register your service as a Lambda function, use the /lambda import component and use restate.createEndpointHandler:
The implementation of your services and handlers remains the same across these deployment options. Have a look at the deployment section for guidance on how to deploy your services on AWS Lambda.

Creating a Deno/Cloudflare Workers handler

Other Javascript runtimes like Deno and Cloudflare Workers have built on top of the Fetch Standard for defining HTTP server handlers. To register your service as a fetch handler, use the /fetch import component.
By default, a fetch handler will not advertise itself as working bidirectionally; the SDK will end the HTTP request at each suspension point, and the Restate runtime will re-invoke the service when there is more work to do. However, you can use the option bidirectional: true to change this on supported platforms, which will improve latencies once the service is re-registered with the runtime.
  • Deno (including Deno Deploy) supports HTTP2 and therefore bidirectional mode can be enabled.
  • Cloudflare Workers do not support end-to-end HTTP2 or bidirectional HTTP1.1, and enabling bidirectional mode will cause invocations to stall and time out. Services running on Workers must be discovered with the --use-http1.1 CLI flag.
Cloudflare Workers minification is not working correctly with the Restate SDK. If you see an issue similar to:
Then most likely you have enabled minification when deploying. Disable it with minify = false in your workers.toml file.

Validating request identity

SDKs can validate that incoming requests come from a particular Restate instance. You can find out more about request identity in the Security docs
For serverless platform handlers, provide the public key to restate.createEndpointHandler instead: