Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions .tools/update_node_examples.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ SELF_PATH=${BASH_SOURCE[0]:-"$(command -v -- "$0")"}
PROJECT_ROOT="$(dirname "$SELF_PATH")/.."

function bump_restate_sdk_deps() {
pushd $1
local project_dir=$1
local package_json="$project_dir/package.json"
local package_json="./package.json"

# Check if package.json exists
if [ ! -f "$package_json" ]; then
Expand All @@ -28,18 +29,19 @@ function bump_restate_sdk_deps() {
# Install each dependency with the new version
for dep in $deps; do
echo "Installing $dep@^$NEW_VERSION in $project_dir"
npm --prefix $project_dir install $dep@^$NEW_VERSION
npm install $dep@^$NEW_VERSION
done

# If this is a template directory and has existing agents documentation, update it
if [[ "$project_dir" == *"/templates/"* ]] && [ -f "$project_dir/.cursor/rules/AGENTS.md" ]; then
if [[ "$project_dir" == *"/templates/"* ]] && [ -f "./.cursor/rules/AGENTS.md" ]; then
echo "Updating agents documentation for template in $project_dir"
wget -O "$project_dir/.cursor/rules/AGENTS.md" https://docs.restate.dev/develop/ts/agents.md
wget -O "./.cursor/rules/AGENTS.md" https://docs.restate.dev/develop/ts/agents.md
fi
if [[ "$project_dir" == *"/templates/"* ]] && [ -f "$project_dir/.claude/CLAUDE.md" ]; then
if [[ "$project_dir" == *"/templates/"* ]] && [ -f "./.claude/CLAUDE.md" ]; then
echo "Updating agents documentation for template in $project_dir"
wget -O "$project_dir/.claude/CLAUDE.md" https://docs.restate.dev/develop/ts/agents.md
wget -O "./.claude/CLAUDE.md" https://docs.restate.dev/develop/ts/agents.md
fi
popd
}

# Update all projects with package.json
Expand Down
4 changes: 2 additions & 2 deletions typescript/basics/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"example-3": "ts-node-dev --transpile-only src/3_workflows.ts"
},
"dependencies": {
"@restatedev/restate-sdk": "^1.9.1",
"@restatedev/restate-sdk-clients": "^1.9.1"
"@restatedev/restate-sdk": "^1.10.1",
"@restatedev/restate-sdk-clients": "^1.10.1"
},
"devDependencies": {
"@types/node": "^20.12.12",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"stable-diffusion-service": "ts-node-dev --watch ./src --respawn --transpile-only src/stable_diffusion.ts"
},
"dependencies": {
"@restatedev/restate-sdk": "^1.9.1",
"@restatedev/restate-sdk": "^1.10.1",
"axios": "^1.6.7",
"axios-retry": "^4.0.0",
"jimp": "^0.22.10",
Expand Down
2 changes: 1 addition & 1 deletion typescript/end-to-end-applications/chat-bot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"flights-task": "RESTATE_LOGGING=INFO ts-node-dev --watch ./src --transpile-only ./src/tasks/flight_prices.ts"
},
"dependencies": {
"@restatedev/restate-sdk": "^1.9.1",
"@restatedev/restate-sdk": "^1.10.1",
"@slack/bolt": "^3.19.0",
"@slack/web-api": "^7.0.4"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"dev": "RESTATE_DEBUG_LOGGING=JOURNAL ts-node-dev --watch src --respawn --transpile-only src/order-app/app.ts"
},
"dependencies": {
"@restatedev/restate-sdk": "^1.9.1",
"@restatedev/restate-sdk": "^1.10.1",
"@types/node": "^20.6.3",
"@types/uuid": "^9.0.0",
"axios": "^1.4.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"node": "14.17.3"
},
"dependencies": {
"@restatedev/restate-sdk-clients": "^1.9.1",
"@restatedev/restate-sdk-clients": "^1.10.1",
"axios": "^0.26.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
Expand Down
2 changes: 1 addition & 1 deletion typescript/integrations/deployment-lambda-cdk/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"typescript": "^5.5.4"
},
"dependencies": {
"@restatedev/restate-sdk": "^1.9.1",
"@restatedev/restate-sdk": "^1.10.1",
"aws-cdk-lib": "^2.155.0",
"constructs": "^10.3.0",
"source-map-support": "^0.5.21"
Expand Down
4 changes: 2 additions & 2 deletions typescript/patterns-use-cases/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
"format": "prettier --ignore-path .eslintignore --write \"**/*.+(js|ts|json)\""
},
"dependencies": {
"@restatedev/restate-sdk": "^1.9.1",
"@restatedev/restate-sdk-clients": "^1.9.1",
"@restatedev/restate-sdk": "^1.10.1",
"@restatedev/restate-sdk-clients": "^1.10.1",
"cron-parser": "^5.2.0",
"express": "^5.0.0",
"pg": "^8.10.0",
Expand Down
90 changes: 47 additions & 43 deletions typescript/templates/bun/.claude/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,9 @@ ctx.workflowSendClient(myWorkflow, "wf-id").run("Hi");
#### Delayed Messages

```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#delayed_messages"} theme={null}
ctx.serviceSendClient(myService).myHandler(
"Hi",
restate.rpc.sendOpts({ delay: { hours: 5 } })
);
ctx
.serviceSendClient(myService)
.myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } }));
```

#### Generic Calls
Expand Down Expand Up @@ -169,17 +168,16 @@ const result = await ctx.run("my-side-effect", async () => {
await ctx.sleep({ seconds: 30 });

// Schedule delayed call (different from sleep + send)
ctx.serviceSendClient(myService).myHandler(
"Hi",
restate.rpc.sendOpts({ delay: { hours: 5 } })
);
ctx
.serviceSendClient(myService)
.myHandler("Hi", restate.rpc.sendOpts({ delay: { hours: 5 } }));
```

### Awakeables (External Events)

```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#awakeables"} theme={null}
// Create awakeable
const {id, promise} = ctx.awakeable<string>();
const { id, promise } = ctx.awakeable<string>();

// Send ID to external system
await ctx.run(() => requestHumanReview(name, id));
Expand Down Expand Up @@ -248,7 +246,7 @@ const result1 = await Promise.any([call1, call2]);
// ✅ GOOD
const result2 = await RestatePromise.any([
ctx.run(() => callLLM("gpt-4", prompt)),
ctx.run(() => callLLM("claude", prompt))
ctx.run(() => callLLM("claude", prompt)),
]);
```

Expand All @@ -263,7 +261,7 @@ const results1 = await Promise.allSettled([call1, call2]);
// ✅ GOOD
const results2 = await RestatePromise.allSettled([
ctx.serviceClient(service1).call(),
ctx.serviceClient(service2).call()
ctx.serviceClient(service2).call(),
]);

results2.forEach((result, i) => {
Expand All @@ -278,10 +276,9 @@ results2.forEach((result, i) => {
### Invocation Management

```ts {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-actions.ts#cancel"} theme={null}
const handle = ctx.serviceSendClient(myService).myHandler(
"Hi",
restate.rpc.sendOpts({ idempotencyKey: "my-key" })
);
const handle = ctx
.serviceSendClient(myService)
.myHandler("Hi", restate.rpc.sendOpts({ idempotencyKey: "my-key" }));
const invocationId = await handle.invocationId;
const response = await ctx.attach(invocationId);

Expand Down Expand Up @@ -370,51 +367,58 @@ throw new Error("Temporary failure - will retry");
import { RestateTestEnvironment } from "@restatedev/restate-sdk-testcontainers";
import * as clients from "@restatedev/restate-sdk-clients";
import { describe, it, beforeAll, afterAll, expect } from "vitest";
import {greeter} from "./greeter-service";
import { greeter } from "./greeter-service";

describe("MyService", () => {
let restateTestEnvironment: RestateTestEnvironment;
let restateIngress: clients.Ingress;
let restateTestEnvironment: RestateTestEnvironment;
let restateIngress: clients.Ingress;

beforeAll(async () => {
restateTestEnvironment = await RestateTestEnvironment.start({services: [greeter]});
restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() });
}, 20_000);

afterAll(async () => {
await restateTestEnvironment?.stop();
});

it("Can call methods", async () => {
const client = restateIngress.objectClient(greeter, "myKey");
await client.greet("Test!");
});

it("Can read/write state", async () => {
const state = restateTestEnvironment.stateOf(greeter, "myKey");
await state.set("count", 123);
expect(await state.get("count")).toBe(123);
beforeAll(async () => {
restateTestEnvironment = await RestateTestEnvironment.start({
services: [greeter],
});
restateIngress = clients.connect({ url: restateTestEnvironment.baseUrl() });
}, 20_000);

afterAll(async () => {
await restateTestEnvironment?.stop();
});

it("Can call methods", async () => {
const client = restateIngress.objectClient(greeter, "myKey");
await client.greet("Test!");
});

it("Can read/write state", async () => {
const state = restateTestEnvironment.stateOf(greeter, "myKey");
await state.set("count", 123);
expect(await state.get("count")).toBe(123);
});
});
```

## SDK Clients (External Invocations)

```typescript {"CODE_LOAD::ts/src/develop/agentsmd/agentsmd-clients.ts#here"} theme={null}
const restateClient = clients.connect({url: "http://localhost:8080"});
const restateClient = clients.connect({ url: "http://localhost:8080" });

// Request-response
const result = await restateClient
.serviceClient<MyService>({name: "MyService"})
.myHandler("Hi");
.serviceClient<MyService>({ name: "MyService" })
.myHandler("Hi");

// One-way
await restateClient
.serviceSendClient<MyService>({name: "MyService"})
.myHandler("Hi");
.serviceSendClient<MyService>({ name: "MyService" })
.myHandler("Hi");

// Delayed
await restateClient
.serviceSendClient<MyService>({name: "MyService"})
.myHandler("Hi", clients.rpc.sendOpts({delay: {seconds: 1}}));
.serviceSendClient<MyService>({ name: "MyService" })
.myHandler("Hi", clients.rpc.sendOpts({ delay: { seconds: 1 } }));
```


---

> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://docs.restate.dev/llms.txt
Loading
Loading