Resonate gcp deployments typescript
Skill resonatehq/resonate-skills/resonate-gcp-deployments-typescript
Deploy Resonate TypeScript workers to Google Cloud Functions (Gen 2) using the GCP shim and connect them to a Resonate Server.From its SKILL.md
npx -y skills add resonatehq/resonate-skills --skill resonate-gcp-deployments-typescriptAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
7.7 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it
Resonate Google Cloud TypeScript
Overview
Deploy a TypeScript Resonate worker as an HTTP-triggered Google Cloud Function that talks to a Resonate Server.
When to use this skill
- You have a Resonate Server running and reachable over HTTPS (local or Cloud Run).
- You want a serverless worker that can resume durable workflows across invocations using the GCP Functions shim for the TypeScript SDK. [Serverless workers; GCP deploy tutorial]
Assumptions & Inputs
You (the agent) should obtain or be given:
GCP_PROJECT_ID– Google Cloud project IDGCP_REGION– GCP region (e.g.us-central1)FUNCTION_NAME– Name for the Cloud Function (e.g.countdown-workflow)RESONATE_SERVER_URL– Public URL of the Resonate Server HTTP API (e.g.https://resonate-server-...a.run.app) [Deploy server]WORKER_ENTRY– TS entry file exposing ahandlerfunction (typicallyindex.ts)
Prerequisites in the project environment:
- Node.js ≥ 20
gcloudCLI authenticated forGCP_PROJECT_IDnpmor compatible package manager
High-level flow
- Add the GCP worker shim (
@resonatehq/gcp) to the worker project. [Serverless workers] - Implement the worker as a Resonate registration + HTTP handler export.
- Set the
RESONATE_URLenv var for the function so it can reach the Resonate Server. [Deploy Cloud Function] - Deploy the function with
gcloud functions deploy(Gen 2, HTTP trigger). - Use the function URL as a target when invoking workflows via the Resonate Server (if needed). [Trigger countdown]
- (Optional) Stream workflow output to browsers — see
resonate-state-bus-pattern-typescriptfor the pattern (FirestoreonSnapshotis the lightest GCP option).
For deploying the Resonate Server itself on GCP (Cloud Run + Cloud SQL), see resonate-server-deployment-cloud-run.
Step 1 – Add the GCP worker shim
From the worker project root:
npm install @resonatehq/gcp
Use the Resonate class from the GCP package instead of the base SDK. [Serverless workers]
Step 2 – Implement the worker entry file
Create index.ts (or use the given WORKER_ENTRY) with this pattern:
import { Resonate } from "@resonatehq/gcp";
import type { Context } from "@resonatehq/sdk";
// Example durable workflow
function* countdown(ctx: Context, count: number, delayMs: number) {
for (let i = count; i > 0; i--) {
// Replace with your real work; this mirrors the standard countdown example
yield* ctx.run((c: Context, j = i) => {
console.log(`Countdown: ${j}`);
});
yield* ctx.sleep(delayMs);
}
console.log("Done!");
}
// Instantiate Resonate using the GCP shim
const resonate = new Resonate();
// Register the durable function (name "countdown" is just an example)
resonate.register("countdown", countdown);
// Export an HTTP handler compatible with Cloud Functions Gen 2
export const handler = resonate.handlerHttp();
This pattern is the same as the documented GCP shim usage, just with a concrete example function. [Serverless workers; Countdown worker structure]
Step 3 – Ensure RESONATE_URL points at the server
The worker must know where the Resonate Server is. Use the RESONATE_URL environment variable in the function deployment, pointing to the server HTTP base URL. [Cloud Function deploy]
Example value:
RESONATE_URL=https://resonate-server-<hash>-<region>.a.run.app
Step 4 – Deploy to Google Cloud Functions (Gen 2)
From the worker project root:
gcloud functions deploy <FUNCTION_NAME> \
--gen2 \
--region=<GCP_REGION> \
--runtime=nodejs22 \
--source=. \
--entry-point=handler \
--trigger-http \
--allow-unauthenticated \
--set-env-vars=RESONATE_URL=<RESONATE_SERVER_URL>
Example (mirrors the docs, with a generic name): [Cloud Function deploy]
gcloud functions deploy countdown-workflow \
--gen2 \
--region=us-central1 \
--runtime=nodejs22 \
--source=. \
--entry-point=handler \
--trigger-http \
--allow-unauthenticated \
--set-env-vars=RESONATE_URL=https://resonate-server-...a.run.app
From the deploy output, capture the Function URL (under serviceConfig.uri or url). [Cloud Function deploy]
Step 5 – (Optional) Invoke via Resonate CLI with the worker target
If needed, use the worker URL as the --target when invoking a durable function through the Resonate Server. [Trigger countdown]
Example:
resonate invoke countdown-workflow-1 \
--func countdown \
--arg 5 \
--arg 60000 \
--server <RESONATE_SERVER_URL> \
--target <FUNCTION_URL>
Where:
--serveris the Resonate Server URL (same asRESONATE_SERVER_URL).--targetis the Cloud Function URL from the previous step.
Timeout note: the default promise timeout is short. For long-running or forever-loop workflows, set --timeout explicitly (e.g. --timeout 720h for a 30-day horizon). A workflow whose timeout lapses will not be resumed.
Pitfall: if worker logs show fetch failed / connection_error, the server is probably returning task URLs pointing at http://localhost:8001. Set --server-url on the server side — see resonate-server-deployment-cloud-run or resonate-server-deployment.
Step 6 – (Optional) Stream output to browsers
Cloud Functions are short-lived — they can't hold an SSE or WebSocket connection for the life of a durable workflow. The durable pattern is to write workflow state to an external realtime bus (e.g. Firestore) and subscribe from the browser.
This is its own pattern, covered end-to-end in resonate-state-bus-pattern-typescript. Firestore + onSnapshot is the lightest GCP option; the same shape works with Supabase Realtime, Pub/Sub, or any DB with change feeds.
Outputs
- A deployed Cloud Function Gen 2 worker exposing an HTTP
handlercompatible with Resonate. - The function can be used as a durable worker target by the Resonate Server, enabling long-running workflows across short-lived Cloud Function invocations.
Reference example
example-chess-hero-gcp-ts — end-to-end: worker on Cloud Functions Gen 2, server on Cloud Run (resonate-server-deployment-cloud-run), output streamed to a browser via resonate-state-bus-pattern-typescript.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most containers cloud skills give in ~2.0k tokens
Counted across 607 of the 657 authors here whose files we hold, read 2026-08-07
- Run containers as a non-root userin 66 of 607, across 46 files
- Use multi-stage buildsin 53 of 607, across 44 files
- Use Promise.all for independent operationsin 47 of 607, across 13 files
- Import directly instead of barrel filesin 46 of 607, across 12 files
- Use ternary instead of AND for conditionalsin 45 of 607, across 12 files
- Use Set or Map for O(1) lookupsin 42 of 607, across 10 files
- Create a .dockerignore filein 41 of 607, across 31 files
- Read individual rule files for detailsin 39 of 607, across 9 files
- Copy dependency files before source codein 36 of 607, across 23 files
- Authenticate server actions like API routesin 35 of 607, across 7 files
- Use next/dynamic for heavy componentsin 34 of 607, across 9 files
- Use React.cache for per-request deduplicationin 34 of 607, across 10 files
Said here and by no other author read
- install the gcp worker shim package
- instantiate resonate using the gcp shim
- register durable functions with resonate
- export a cloud functions http handler
- set the resonate server url environment variable
- deploy the worker as a gen 2 http function
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.