mirror of https://github.com/dapr/rust-sdk.git
Compare commits
63 Commits
v0.16.0-rc
...
main
Author | SHA1 | Date |
---|---|---|
|
407447816c | |
|
06ea44e8d3 | |
|
942263938a | |
|
9537a3b826 | |
|
35930ebc5f | |
|
acb829cdb5 | |
|
26f4ee6d32 | |
|
4fb85abcea | |
|
f1e469cf57 | |
|
1cdcc272ce | |
|
185dc72889 | |
|
1508ea24cb | |
|
99d099f15e | |
|
c0b7155093 | |
|
ab219049a4 | |
|
57347e70c3 | |
|
93322c0e86 | |
|
52f095f8e7 | |
|
a532ee1a50 | |
|
8bf6013eee | |
|
6973b7d9be | |
|
5241ce696c | |
|
2deed2baa8 | |
|
b9de85f885 | |
|
0c909c544b | |
|
f0498dcc3f | |
|
abecc5c70b | |
|
4da565cbae | |
|
1d88e2074f | |
|
1ac019159c | |
|
c4675a6a09 | |
|
85ed911b1d | |
|
95b009baaf | |
|
e15f65b435 | |
|
fcff470451 | |
|
ae9bcda712 | |
|
851abcae57 | |
|
b2be904225 | |
|
4cfa9a3db2 | |
|
e78cab477e | |
|
709c67e856 | |
|
b1cacef2d7 | |
|
597aa46f0e | |
|
0183be5baa | |
|
580b88ff8a | |
|
e04157d7d7 | |
|
b81f8f387b | |
|
df0bf8818c | |
|
04375f4fd2 | |
|
80a3a90f82 | |
|
fbb81bf518 | |
|
dbc7a80ef1 | |
|
12dd8af64f | |
|
0f29428a55 | |
|
981340a5d8 | |
|
5fd49f196f | |
|
7322ec4cc3 | |
|
8f00930ebc | |
|
f70a18f896 | |
|
78ad9fd685 | |
|
01d2214a0d | |
|
d0b6490d9c | |
|
4e2d316032 |
|
@ -16,13 +16,12 @@ on:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
CARGO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}
|
|
||||||
PROTOC_VERSION: 24.4
|
PROTOC_VERSION: 24.4
|
||||||
RUSTFLAGS: "-D warnings"
|
RUSTFLAGS: "-D warnings"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
name: Lint
|
name: Check and Lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
@ -37,14 +36,20 @@ jobs:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
version: ${{ env.PROTOC_VERSION }}
|
version: ${{ env.PROTOC_VERSION }}
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Check compiled protos for a diff
|
||||||
|
run: |
|
||||||
|
make proto-gen check-diff-proto
|
||||||
|
|
||||||
- name: cargo fmt
|
- name: cargo fmt
|
||||||
run: cargo fmt -- --check --color ${{ env.CARGO_TERM_COLOR }}
|
run: cargo fmt -- --check --color ${{ env.CARGO_TERM_COLOR }}
|
||||||
|
|
||||||
- name: cargo clippy
|
- name: cargo clippy
|
||||||
run: cargo clippy
|
run: cargo clippy
|
||||||
|
|
||||||
|
|
||||||
build:
|
build:
|
||||||
name: Build on rust-${{ matrix.rust-version}}
|
name: Test and Build on rust-${{ matrix.rust-version }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
@ -71,33 +76,60 @@ jobs:
|
||||||
- name: Run Tests
|
- name: Run Tests
|
||||||
run: cargo test --workspace --all-targets --all-features
|
run: cargo test --workspace --all-targets --all-features
|
||||||
|
|
||||||
test-docs-sdk:
|
test-docs:
|
||||||
name: Docs SDK
|
name: Check Docs - ${{ matrix.crate }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
crate:
|
||||||
|
- dapr
|
||||||
|
- dapr-macros
|
||||||
env:
|
env:
|
||||||
RUSTDOCFLAGS: -Dwarnings
|
RUSTDOCFLAGS: -Dwarnings
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
- uses: dtolnay/rust-toolchain@nightly
|
||||||
- uses: dtolnay/install@cargo-docs-rs
|
- uses: dtolnay/install@cargo-docs-rs
|
||||||
- run: cargo docs-rs -p dapr
|
- run: cargo docs-rs -p ${{ matrix.crate }}
|
||||||
|
|
||||||
test-docs-macros:
|
publish-dry:
|
||||||
name: Docs Macros
|
name: Publish Test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
strategy:
|
||||||
RUSTDOCFLAGS: -Dwarnings
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
crate:
|
||||||
|
- dapr
|
||||||
|
- dapr-macros
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: Install Rust
|
||||||
|
uses: dtolnay/rust-toolchain@master
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
components: clippy, rustfmt
|
||||||
|
- name: Install Protoc
|
||||||
|
uses: arduino/setup-protoc@v3
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
version: ${{ env.PROTOC_VERSION }}
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: dtolnay/rust-toolchain@nightly
|
- name: cargo publish - ${{ matrix.crate }}
|
||||||
- uses: dtolnay/install@cargo-docs-rs
|
run: cargo publish --manifest-path ${{ matrix.crate }}/Cargo.toml --dry-run
|
||||||
- run: cargo docs-rs -p dapr-macros
|
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
name: Publish
|
name: Publish
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [test-docs-sdk, test-docs-macros, lint, build]
|
needs: [test-docs, lint, build, publish-dry]
|
||||||
if: startswith(github.ref, 'refs/tags/v')
|
if: startswith(github.ref, 'refs/tags/v')
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
crate:
|
||||||
|
- dapr
|
||||||
|
- dapr-macros
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Install Rust
|
- name: Install Rust
|
||||||
|
@ -111,7 +143,7 @@ jobs:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
version: ${{ env.PROTOC_VERSION }}
|
version: ${{ env.PROTOC_VERSION }}
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: cargo publish dapr-macros
|
- name: cargo publish - ${{ matrix.crate }}
|
||||||
run: cargo publish --manifest-path dapr-macros/Cargo.toml --token ${{ env.CARGO_TOKEN }}
|
env:
|
||||||
- name: cargo publish dapr
|
CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }}
|
||||||
run: cargo publish --manifest-path dapr/Cargo.toml --token ${{ env.CARGO_TOKEN }}
|
run: cargo publish --manifest-path ${{ matrix.crate }}/Cargo.toml --token ${{ env.CARGO_TOKEN }}
|
||||||
|
|
|
@ -11,6 +11,6 @@ rust-version = "1.70.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
exitcode = "1.1.2"
|
exitcode = "1.1.2"
|
||||||
octocrab = "0.34.1"
|
octocrab = "0.42.1"
|
||||||
serde_json = "1.0.114"
|
serde_json = "1.0.114"
|
||||||
tokio = { version = "1.36.0", features = ["full"] }
|
tokio = { version = "1.36.0", features = ["full"] }
|
||||||
|
|
|
@ -76,14 +76,14 @@ jobs:
|
||||||
- name: Determine latest Dapr Runtime version
|
- name: Determine latest Dapr Runtime version
|
||||||
if: env.DAPR_RUNTIME_VERSION == ''
|
if: env.DAPR_RUNTIME_VERSION == ''
|
||||||
run: |
|
run: |
|
||||||
RUNTIME_VERSION=$(curl -s "https://api.github.com/repos/dapr/dapr/releases/latest" | grep '"tag_name"' | cut -d ':' -f2 | tr -d '",v')
|
RUNTIME_VERSION=$(curl -s "https://api.github.com/repos/dapr/dapr/releases/latest" | grep '"tag_name"' | cut -d ':' -f2 | tr -d ' ",v')
|
||||||
echo "DAPR_RUNTIME_VERSION=$RUNTIME_VERSION" >> $GITHUB_ENV
|
echo "DAPR_RUNTIME_VERSION=$RUNTIME_VERSION" >> $GITHUB_ENV
|
||||||
echo "Found $RUNTIME_VERSION"
|
echo "Found $RUNTIME_VERSION"
|
||||||
|
|
||||||
- name: Determine latest Dapr Cli version
|
- name: Determine latest Dapr Cli version
|
||||||
if: env.DAPR_CLI_VERSION == ''
|
if: env.DAPR_CLI_VERSION == ''
|
||||||
run: |
|
run: |
|
||||||
CLI_VERSION=$(curl -s "https://api.github.com/repos/dapr/cli/releases/latest" | grep '"tag_name"' | cut -d ':' -f2 | tr -d '",v')
|
CLI_VERSION=$(curl -s "https://api.github.com/repos/dapr/cli/releases/latest" | grep '"tag_name"' | cut -d ':' -f2 | tr -d ' ",v')
|
||||||
echo "DAPR_CLI_VERSION=$CLI_VERSION" >> $GITHUB_ENV
|
echo "DAPR_CLI_VERSION=$CLI_VERSION" >> $GITHUB_ENV
|
||||||
echo "Found $CLI_VERSION"
|
echo "Found $CLI_VERSION"
|
||||||
|
|
||||||
|
@ -127,6 +127,7 @@ jobs:
|
||||||
cd dapr_runtime
|
cd dapr_runtime
|
||||||
make
|
make
|
||||||
echo "artifactPath=~/artifacts/$GITHUB_SHA/" >> $GITHUB_ENV
|
echo "artifactPath=~/artifacts/$GITHUB_SHA/" >> $GITHUB_ENV
|
||||||
|
mkdir -p $HOME/artifacts/$GITHUB_SHA/
|
||||||
RUNTIME_VERSION=edge
|
RUNTIME_VERSION=edge
|
||||||
echo "DAPR_RUNTIME_VERSION=$RUNTIME_VERSION" >> $GITHUB_ENV
|
echo "DAPR_RUNTIME_VERSION=$RUNTIME_VERSION" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
@ -135,7 +136,7 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
mkdir ~/dapr_docker
|
mkdir ~/dapr_docker
|
||||||
cd dapr_runtime
|
cd dapr_runtime
|
||||||
docker build --build-arg "PKG_FILES=*" -f ./docker/Dockerfile ./dist/linux_amd64/release -t daprio/dapr:0.0.0-dev
|
docker build --build-arg "PKG_FILES=*" -f ./docker/Dockerfile ./dist/linux_amd64/release -t daprio/dapr:9.0.0-dev
|
||||||
|
|
||||||
- name: Download Install Bundle CLI
|
- name: Download Install Bundle CLI
|
||||||
if: env.DAPR_REF != '' && env.DAPR_CLI_REF == ''
|
if: env.DAPR_REF != '' && env.DAPR_CLI_REF == ''
|
||||||
|
@ -147,14 +148,14 @@ jobs:
|
||||||
ls -la
|
ls -la
|
||||||
|
|
||||||
- name: Build Custom Install Bundle
|
- name: Build Custom Install Bundle
|
||||||
if: env.DAPR_REF != '' && env.DAPR_CLI_REF != ''
|
if: env.DAPR_REF != '' || env.DAPR_CLI_REF != ''
|
||||||
run: |
|
run: |
|
||||||
: # Create daprbundle directory
|
: # Create daprbundle directory
|
||||||
mkdir ~/daprbundle
|
mkdir ~/daprbundle
|
||||||
cp .github/workflows/validate-examples/details.json ~/daprbundle/
|
cp .github/workflows/validate-examples/details.json ~/daprbundle/
|
||||||
|
|
||||||
: # Add cli
|
: # Add cli
|
||||||
cp ~/artifacts/$GITHUB_SHA/dapr ~/daprbundle/dapr
|
cp cli/dist/linux_amd64/release/dapr ~/daprbundle/dapr
|
||||||
|
|
||||||
: # Compress executables to /dist/ appending _linux_amd64 to the name
|
: # Compress executables to /dist/ appending _linux_amd64 to the name
|
||||||
mkdir ~/daprbundle/dist
|
mkdir ~/daprbundle/dist
|
||||||
|
@ -169,7 +170,7 @@ jobs:
|
||||||
|
|
||||||
: # Add docker image
|
: # Add docker image
|
||||||
mkdir ~/daprbundle/docker
|
mkdir ~/daprbundle/docker
|
||||||
docker save daprio/dapr:0.0.0-dev | gzip > ~/daprbundle/docker/daprio-dapr-0.0.0-dev.tar.gz
|
docker save daprio/dapr:9.0.0-dev | gzip > ~/daprbundle/docker/daprio-dapr-9.0.0-dev.tar.gz
|
||||||
|
|
||||||
: # Bundle
|
: # Bundle
|
||||||
cd ~/daprbundle
|
cd ~/daprbundle
|
||||||
|
@ -219,7 +220,7 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
examples:
|
examples:
|
||||||
[ "actors", "bindings", "client", "configuration", "crypto", "invoke/grpc", "invoke/grpc-proxying", "jobs", "pubsub", "query_state", "secrets-bulk" ]
|
[ "actors", "bindings", "client", "configuration", "conversation", "crypto", "invoke/grpc", "invoke/grpc-proxying", "jobs", "pubsub", "query_state", "secrets-bulk" ]
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"daprd": "0.0.0-dev",
|
"daprd": "9.0.0-dev",
|
||||||
"dashboard": "0.0.0-dev",
|
"dashboard": "9.0.0-dev",
|
||||||
"cli": "0.0.0-dev",
|
"cli": "9.0.0-dev",
|
||||||
"daprBinarySubDir": "dist",
|
"daprBinarySubDir": "dist",
|
||||||
"dockerImageSubDir": "docker",
|
"dockerImageSubDir": "docker",
|
||||||
"daprImageName": "daprio/dapr:0.0.0-dev",
|
"daprImageName": "daprio/dapr:9.0.0-dev",
|
||||||
"daprImageFileName": "daprio-dapr-0.0.0-dev.tar.gz"
|
"daprImageFileName": "daprio-dapr-9.0.0-dev.tar.gz"
|
||||||
}
|
}
|
15
Cargo.toml
15
Cargo.toml
|
@ -12,26 +12,21 @@ resolver = "2"
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
async-trait = "0.1"
|
async-trait = "0.1"
|
||||||
|
prost = "0.13.4"
|
||||||
dapr-macros = { version = "0.16.0-rc.2", path = "./dapr-macros" }
|
prost-types = "0.13.4"
|
||||||
|
|
||||||
prost = "0.13.1"
|
|
||||||
prost-build = "0.13.1"
|
|
||||||
prost-types = "0.13.1"
|
|
||||||
|
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
|
||||||
tokio = "1.39"
|
tokio = "1.39"
|
||||||
tokio-stream = "0.1"
|
tokio-stream = "0.1"
|
||||||
tokio-test = "0.4"
|
|
||||||
tokio-util = "0.7"
|
tokio-util = "0.7"
|
||||||
|
|
||||||
tonic = "0.12.1"
|
tonic = "0.12.3"
|
||||||
tonic-build = "0.12.1"
|
tonic-build = "0.12.3"
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.16.0-rc.2"
|
version = "0.16.0"
|
||||||
authors = [
|
authors = [
|
||||||
"Mike Nguyen <hey@mike.ee>",
|
"Mike Nguyen <hey@mike.ee>",
|
||||||
"The Dapr Authors <dapr@dapr.io>"
|
"The Dapr Authors <dapr@dapr.io>"
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
.PHONY: proto-gen
|
||||||
|
proto-gen:
|
||||||
|
cargo run --bin proto-gen
|
||||||
|
|
||||||
|
.PHONY: check-diff-proto
|
||||||
|
check-diff-proto:
|
||||||
|
git diff --exit-code ./proto/
|
|
@ -53,7 +53,7 @@ Add the following to your `Cargo.toml` file:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
dapr = "0.16.0-rc.2"
|
dapr = "0.16.0"
|
||||||
```
|
```
|
||||||
|
|
||||||
Here's a basic example to create a client:
|
Here's a basic example to create a client:
|
||||||
|
|
|
@ -12,9 +12,6 @@ rust-version.workspace = true
|
||||||
proc-macro = true
|
proc-macro = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
async-trait = { workspace = true }
|
|
||||||
axum = "0.7"
|
|
||||||
log = "0.4"
|
|
||||||
proc-macro2 = "1.0"
|
proc-macro2 = "1.0"
|
||||||
quote = "1.0"
|
quote = "1.0"
|
||||||
syn = { version = "2.0", features = ["full"] }
|
syn = { version = "2.0", features = ["full"] }
|
||||||
|
|
|
@ -81,7 +81,7 @@ pub fn actor(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||||
Ok(actor_struct) => actor_struct.ident.clone(),
|
Ok(actor_struct) => actor_struct.ident.clone(),
|
||||||
Err(_) => match syn::parse::<syn::ItemType>(item.clone()) {
|
Err(_) => match syn::parse::<syn::ItemType>(item.clone()) {
|
||||||
Ok(ty) => ty.ident.clone(),
|
Ok(ty) => ty.ident.clone(),
|
||||||
Err(e) => panic!("Error parsing actor struct: {}", e),
|
Err(e) => panic!("Error parsing actor struct: {e}"),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,7 @@ rust-version.workspace = true
|
||||||
[dependencies]
|
[dependencies]
|
||||||
async-trait = { workspace = true }
|
async-trait = { workspace = true }
|
||||||
axum = "0.7"
|
axum = "0.7"
|
||||||
bytes = "1.7"
|
|
||||||
chrono = "0.4"
|
chrono = "0.4"
|
||||||
dapr-macros = { workspace = true }
|
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
prost = { workspace = true }
|
prost = { workspace = true }
|
||||||
|
@ -28,10 +26,15 @@ tokio-util = { workspace = true, features = ["io"] }
|
||||||
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
axum-test = "15.3"
|
axum-test = "=16.4.0" # TODO: Remove problematic dep
|
||||||
|
litemap = "=0.7.4" # TODO: Remove pinned - linked to axum_test
|
||||||
|
zerofrom = "=0.1.5" # TODO: Remove pinned - linked to axum_test
|
||||||
|
reserve-port = "=2.1.0" # TODO: Remove pinned - linked to axum_test
|
||||||
|
idna_adapter = "=1.2.0"
|
||||||
|
|
||||||
once_cell = "1.19"
|
once_cell = "1.19"
|
||||||
dapr = { path = "./" }
|
dapr = { path = "./" }
|
||||||
|
dapr-macros = { path = "../dapr-macros" }
|
||||||
tokio = { workspace = true, features = ["full"] }
|
tokio = { workspace = true, features = ["full"] }
|
||||||
uuid = { version = "1.10", features = ["v4"] }
|
uuid = { version = "1.10", features = ["v4"] }
|
||||||
tokio-test = { workspace = true }
|
|
||||||
tokio-stream = { workspace = true }
|
tokio-stream = { workspace = true }
|
|
@ -1,37 +1,36 @@
|
||||||
use crate::dapr;
|
|
||||||
use crate::dapr::proto::runtime::v1::app_callback_server::AppCallback;
|
use crate::dapr::proto::runtime::v1::app_callback_server::AppCallback;
|
||||||
use crate::dapr::proto::{common, runtime};
|
use crate::dapr::proto::{common, runtime};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use tonic::{Code, Request, Response, Status};
|
use tonic::{Code, Request, Response, Status};
|
||||||
|
|
||||||
/// InvokeRequest is the message to invoke a method with the data.
|
/// InvokeRequest is the message to invoke a method with the data.
|
||||||
pub type InvokeRequest = dapr::proto::common::v1::InvokeRequest;
|
pub type InvokeRequest = common::v1::InvokeRequest;
|
||||||
|
|
||||||
/// InvokeResponse is the response message inclduing data and its content type
|
/// InvokeResponse is the response message inclduing data and its content type
|
||||||
/// from app callback.
|
/// from app callback.
|
||||||
pub type InvokeResponse = dapr::proto::common::v1::InvokeResponse;
|
pub type InvokeResponse = common::v1::InvokeResponse;
|
||||||
|
|
||||||
/// ListTopicSubscriptionsResponse is the message including the list of the subscribing topics.
|
/// ListTopicSubscriptionsResponse is the message including the list of the subscribing topics.
|
||||||
pub type ListTopicSubscriptionsResponse = dapr::proto::runtime::v1::ListTopicSubscriptionsResponse;
|
pub type ListTopicSubscriptionsResponse = runtime::v1::ListTopicSubscriptionsResponse;
|
||||||
|
|
||||||
/// TopicSubscription represents a topic and it's metadata (session id etc.)
|
/// TopicSubscription represents a topic and it's metadata (session id etc.)
|
||||||
pub type TopicSubscription = dapr::proto::runtime::v1::TopicSubscription;
|
pub type TopicSubscription = runtime::v1::TopicSubscription;
|
||||||
|
|
||||||
/// TopicEventRequest message is compatiable with CloudEvent spec v1.0.
|
/// TopicEventRequest message is compatiable with CloudEvent spec v1.0.
|
||||||
pub type TopicEventRequest = dapr::proto::runtime::v1::TopicEventRequest;
|
pub type TopicEventRequest = runtime::v1::TopicEventRequest;
|
||||||
|
|
||||||
/// TopicEventResponse is response from app on published message
|
/// TopicEventResponse is response from app on published message
|
||||||
pub type TopicEventResponse = dapr::proto::runtime::v1::TopicEventResponse;
|
pub type TopicEventResponse = runtime::v1::TopicEventResponse;
|
||||||
|
|
||||||
/// ListInputBindingsResponse is the message including the list of input bindings.
|
/// ListInputBindingsResponse is the message including the list of input bindings.
|
||||||
pub type ListInputBindingsResponse = dapr::proto::runtime::v1::ListInputBindingsResponse;
|
pub type ListInputBindingsResponse = runtime::v1::ListInputBindingsResponse;
|
||||||
|
|
||||||
/// BindingEventRequest represents input bindings event.
|
/// BindingEventRequest represents input bindings event.
|
||||||
pub type BindingEventRequest = dapr::proto::runtime::v1::BindingEventRequest;
|
pub type BindingEventRequest = runtime::v1::BindingEventRequest;
|
||||||
|
|
||||||
/// BindingEventResponse includes operations to save state or
|
/// BindingEventResponse includes operations to save state or
|
||||||
/// send data to output bindings optionally.
|
/// send data to output bindings optionally.
|
||||||
pub type BindingEventResponse = dapr::proto::runtime::v1::BindingEventResponse;
|
pub type BindingEventResponse = runtime::v1::BindingEventResponse;
|
||||||
|
|
||||||
impl ListTopicSubscriptionsResponse {
|
impl ListTopicSubscriptionsResponse {
|
||||||
/// Create `ListTopicSubscriptionsResponse` with a topic.
|
/// Create `ListTopicSubscriptionsResponse` with a topic.
|
||||||
|
|
|
@ -25,7 +25,27 @@ impl<T: DaprInterface> Client<T> {
|
||||||
pub async fn connect(addr: String) -> Result<Self, Error> {
|
pub async fn connect(addr: String) -> Result<Self, Error> {
|
||||||
// Get the Dapr port to create a connection
|
// Get the Dapr port to create a connection
|
||||||
let port: u16 = std::env::var("DAPR_GRPC_PORT")?.parse()?;
|
let port: u16 = std::env::var("DAPR_GRPC_PORT")?.parse()?;
|
||||||
let address = format!("{}:{}", addr, port);
|
let address = format!("{addr}:{port}");
|
||||||
|
|
||||||
|
Ok(Client(T::connect(address).await?))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Connect to the Dapr sidecar with a specific port.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `addr` - Address of gRPC server to connect to.
|
||||||
|
/// * `port` - Port of the gRPC server to connect to.
|
||||||
|
pub async fn connect_with_port(addr: String, port: String) -> Result<Self, Error> {
|
||||||
|
// assert that port is between 1 and 65535
|
||||||
|
let port: u16 = match port.parse::<u16>() {
|
||||||
|
Ok(p) => p,
|
||||||
|
Err(_) => {
|
||||||
|
panic!("Port must be a number between 1 and 65535");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let address = format!("{addr}:{port}");
|
||||||
|
|
||||||
Ok(Client(T::connect(address).await?))
|
Ok(Client(T::connect(address).await?))
|
||||||
}
|
}
|
||||||
|
@ -172,6 +192,7 @@ impl<T: DaprInterface> Client<T> {
|
||||||
///
|
///
|
||||||
/// * `store_name` - The name of state store.
|
/// * `store_name` - The name of state store.
|
||||||
/// * `key` - The key of the desired state.
|
/// * `key` - The key of the desired state.
|
||||||
|
/// * `metadata` - Any metadata pairs to include in the request.
|
||||||
pub async fn get_state<S>(
|
pub async fn get_state<S>(
|
||||||
&mut self,
|
&mut self,
|
||||||
store_name: S,
|
store_name: S,
|
||||||
|
@ -198,19 +219,54 @@ impl<T: DaprInterface> Client<T> {
|
||||||
|
|
||||||
/// Save an array of state objects.
|
/// Save an array of state objects.
|
||||||
///
|
///
|
||||||
|
/// This does not include any etag or metadata options.
|
||||||
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
///
|
///
|
||||||
/// * `store_name` - The name of state store.
|
/// * `store_name` - The name of state store.
|
||||||
/// * `states` - The array of the state key values.
|
/// * `key` - The key for the value
|
||||||
pub async fn save_state<I, K>(&mut self, store_name: K, states: I) -> Result<(), Error>
|
/// * `value` - The value to be saved for the key
|
||||||
|
/// * `etag` - The etag identifier
|
||||||
|
/// * `metadata` - Any metadata pairs to include in the request.
|
||||||
|
/// * `options` - Any state option
|
||||||
|
pub async fn save_state<S>(
|
||||||
|
&mut self,
|
||||||
|
store_name: S,
|
||||||
|
key: S,
|
||||||
|
value: Vec<u8>,
|
||||||
|
etag: Option<Etag>,
|
||||||
|
metadata: Option<HashMap<String, String>>,
|
||||||
|
options: Option<StateOptions>,
|
||||||
|
) -> Result<(), Error>
|
||||||
where
|
where
|
||||||
I: IntoIterator<Item = (K, Vec<u8>)>,
|
S: Into<String>,
|
||||||
K: Into<String>,
|
{
|
||||||
|
let states = vec![StateItem {
|
||||||
|
key: key.into(),
|
||||||
|
value,
|
||||||
|
etag,
|
||||||
|
metadata: metadata.unwrap_or_default(),
|
||||||
|
options,
|
||||||
|
}];
|
||||||
|
|
||||||
|
self.save_bulk_states(store_name, states).await
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Save an array of state objects.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `store_name` - The name of state store.
|
||||||
|
/// * `items` - The array of the state items.
|
||||||
|
pub async fn save_bulk_states<S, I>(&mut self, store_name: S, items: I) -> Result<(), Error>
|
||||||
|
where
|
||||||
|
S: Into<String>,
|
||||||
|
I: Into<Vec<StateItem>>,
|
||||||
{
|
{
|
||||||
self.0
|
self.0
|
||||||
.save_state(SaveStateRequest {
|
.save_state(SaveStateRequest {
|
||||||
store_name: store_name.into(),
|
store_name: store_name.into(),
|
||||||
states: states.into_iter().map(|pair| pair.into()).collect(),
|
states: items.into(),
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
@ -533,6 +589,18 @@ impl<T: DaprInterface> Client<T> {
|
||||||
};
|
};
|
||||||
self.0.delete_job_alpha1(request).await
|
self.0.delete_job_alpha1(request).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Converse with an LLM
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * ConversationRequest - The request containing inputs to send to the LLM
|
||||||
|
pub async fn converse_alpha1(
|
||||||
|
&mut self,
|
||||||
|
request: ConversationRequest,
|
||||||
|
) -> Result<ConversationResponse, Error> {
|
||||||
|
self.0.converse_alpha1(request).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
|
@ -595,6 +663,11 @@ pub trait DaprInterface: Sized {
|
||||||
&mut self,
|
&mut self,
|
||||||
request: DeleteJobRequest,
|
request: DeleteJobRequest,
|
||||||
) -> Result<DeleteJobResponse, Error>;
|
) -> Result<DeleteJobResponse, Error>;
|
||||||
|
|
||||||
|
async fn converse_alpha1(
|
||||||
|
&mut self,
|
||||||
|
request: ConversationRequest,
|
||||||
|
) -> Result<ConversationResponse, Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
|
@ -603,6 +676,13 @@ impl DaprInterface for dapr_v1::dapr_client::DaprClient<TonicChannel> {
|
||||||
Ok(dapr_v1::dapr_client::DaprClient::connect(addr).await?)
|
Ok(dapr_v1::dapr_client::DaprClient::connect(addr).await?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn publish_event(&mut self, request: PublishEventRequest) -> Result<(), Error> {
|
||||||
|
self.publish_event(Request::new(request))
|
||||||
|
.await?
|
||||||
|
.into_inner();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
async fn invoke_service(
|
async fn invoke_service(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: InvokeServiceRequest,
|
request: InvokeServiceRequest,
|
||||||
|
@ -623,13 +703,6 @@ impl DaprInterface for dapr_v1::dapr_client::DaprClient<TonicChannel> {
|
||||||
.into_inner())
|
.into_inner())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn publish_event(&mut self, request: PublishEventRequest) -> Result<(), Error> {
|
|
||||||
self.publish_event(Request::new(request))
|
|
||||||
.await?
|
|
||||||
.into_inner();
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn get_secret(&mut self, request: GetSecretRequest) -> Result<GetSecretResponse, Error> {
|
async fn get_secret(&mut self, request: GetSecretRequest) -> Result<GetSecretResponse, Error> {
|
||||||
Ok(self.get_secret(Request::new(request)).await?.into_inner())
|
Ok(self.get_secret(Request::new(request)).await?.into_inner())
|
||||||
}
|
}
|
||||||
|
@ -648,6 +721,11 @@ impl DaprInterface for dapr_v1::dapr_client::DaprClient<TonicChannel> {
|
||||||
Ok(self.get_state(Request::new(request)).await?.into_inner())
|
Ok(self.get_state(Request::new(request)).await?.into_inner())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn save_state(&mut self, request: SaveStateRequest) -> Result<(), Error> {
|
||||||
|
self.save_state(Request::new(request)).await?.into_inner();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
async fn query_state_alpha1(
|
async fn query_state_alpha1(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: QueryStateRequest,
|
request: QueryStateRequest,
|
||||||
|
@ -658,11 +736,6 @@ impl DaprInterface for dapr_v1::dapr_client::DaprClient<TonicChannel> {
|
||||||
.into_inner())
|
.into_inner())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn save_state(&mut self, request: SaveStateRequest) -> Result<(), Error> {
|
|
||||||
self.save_state(Request::new(request)).await?.into_inner();
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn delete_state(&mut self, request: DeleteStateRequest) -> Result<(), Error> {
|
async fn delete_state(&mut self, request: DeleteStateRequest) -> Result<(), Error> {
|
||||||
self.delete_state(Request::new(request)).await?.into_inner();
|
self.delete_state(Request::new(request)).await?.into_inner();
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -789,6 +862,16 @@ impl DaprInterface for dapr_v1::dapr_client::DaprClient<TonicChannel> {
|
||||||
.await?
|
.await?
|
||||||
.into_inner())
|
.into_inner())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn converse_alpha1(
|
||||||
|
&mut self,
|
||||||
|
request: ConversationRequest,
|
||||||
|
) -> Result<ConversationResponse, Error> {
|
||||||
|
Ok(self
|
||||||
|
.converse_alpha1(Request::new(request))
|
||||||
|
.await?
|
||||||
|
.into_inner())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A request from invoking a service
|
/// A request from invoking a service
|
||||||
|
@ -815,6 +898,15 @@ pub type GetStateResponse = dapr_v1::GetStateResponse;
|
||||||
/// A request for saving state
|
/// A request for saving state
|
||||||
pub type SaveStateRequest = dapr_v1::SaveStateRequest;
|
pub type SaveStateRequest = dapr_v1::SaveStateRequest;
|
||||||
|
|
||||||
|
/// A state item
|
||||||
|
pub type StateItem = common_v1::StateItem;
|
||||||
|
|
||||||
|
/// State options
|
||||||
|
pub type StateOptions = common_v1::StateOptions;
|
||||||
|
|
||||||
|
/// Etag identifier
|
||||||
|
pub type Etag = common_v1::Etag;
|
||||||
|
|
||||||
/// A request for querying state
|
/// A request for querying state
|
||||||
pub type QueryStateRequest = dapr_v1::QueryStateRequest;
|
pub type QueryStateRequest = dapr_v1::QueryStateRequest;
|
||||||
|
|
||||||
|
@ -907,6 +999,18 @@ pub type DeleteJobRequest = crate::dapr::proto::runtime::v1::DeleteJobRequest;
|
||||||
/// A response from a delete job request
|
/// A response from a delete job request
|
||||||
pub type DeleteJobResponse = crate::dapr::proto::runtime::v1::DeleteJobResponse;
|
pub type DeleteJobResponse = crate::dapr::proto::runtime::v1::DeleteJobResponse;
|
||||||
|
|
||||||
|
/// A request to conversate with an LLM
|
||||||
|
pub type ConversationRequest = crate::dapr::proto::runtime::v1::ConversationRequest;
|
||||||
|
|
||||||
|
/// A response from conversating with an LLM
|
||||||
|
pub type ConversationResponse = crate::dapr::proto::runtime::v1::ConversationResponse;
|
||||||
|
|
||||||
|
/// A result from an interacting with a LLM
|
||||||
|
pub type ConversationResult = crate::dapr::proto::runtime::v1::ConversationResult;
|
||||||
|
|
||||||
|
/// An input to the conversation
|
||||||
|
pub type ConversationInput = crate::dapr::proto::runtime::v1::ConversationInput;
|
||||||
|
|
||||||
type StreamPayload = crate::dapr::proto::common::v1::StreamPayload;
|
type StreamPayload = crate::dapr::proto::common::v1::StreamPayload;
|
||||||
impl<K> From<(K, Vec<u8>)> for common_v1::StateItem
|
impl<K> From<(K, Vec<u8>)> for common_v1::StateItem
|
||||||
where
|
where
|
||||||
|
@ -987,3 +1091,62 @@ impl JobBuilder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct ConversationInputBuilder {
|
||||||
|
content: String,
|
||||||
|
role: Option<String>,
|
||||||
|
scrub_pii: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ConversationInputBuilder {
|
||||||
|
pub fn new(message: &str) -> Self {
|
||||||
|
ConversationInputBuilder {
|
||||||
|
content: message.to_string(),
|
||||||
|
role: None,
|
||||||
|
scrub_pii: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build(self) -> ConversationInput {
|
||||||
|
ConversationInput {
|
||||||
|
content: self.content,
|
||||||
|
role: self.role,
|
||||||
|
scrub_pii: self.scrub_pii,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ConversationRequestBuilder {
|
||||||
|
name: String,
|
||||||
|
context_id: Option<String>,
|
||||||
|
inputs: Vec<ConversationInput>,
|
||||||
|
parameters: HashMap<String, Any>,
|
||||||
|
metadata: HashMap<String, String>,
|
||||||
|
scrub_pii: Option<bool>,
|
||||||
|
temperature: Option<f64>,
|
||||||
|
}
|
||||||
|
impl ConversationRequestBuilder {
|
||||||
|
pub fn new(name: &str, inputs: Vec<ConversationInput>) -> Self {
|
||||||
|
ConversationRequestBuilder {
|
||||||
|
name: name.to_string(),
|
||||||
|
context_id: None,
|
||||||
|
inputs,
|
||||||
|
parameters: Default::default(),
|
||||||
|
metadata: Default::default(),
|
||||||
|
scrub_pii: None,
|
||||||
|
temperature: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build(self) -> ConversationRequest {
|
||||||
|
ConversationRequest {
|
||||||
|
name: self.name,
|
||||||
|
context_id: self.context_id,
|
||||||
|
inputs: self.inputs,
|
||||||
|
parameters: self.parameters,
|
||||||
|
metadata: self.metadata,
|
||||||
|
scrub_pii: self.scrub_pii,
|
||||||
|
temperature: self.temperature,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2373,9 +2373,18 @@ pub struct GetMetadataResponse {
|
||||||
pub runtime_version: ::prost::alloc::string::String,
|
pub runtime_version: ::prost::alloc::string::String,
|
||||||
#[prost(string, repeated, tag = "9")]
|
#[prost(string, repeated, tag = "9")]
|
||||||
pub enabled_features: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
|
pub enabled_features: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
|
||||||
/// TODO: Cassie: probably add scheduler runtime status
|
|
||||||
#[prost(message, optional, tag = "10")]
|
#[prost(message, optional, tag = "10")]
|
||||||
pub actor_runtime: ::core::option::Option<ActorRuntime>,
|
pub actor_runtime: ::core::option::Option<ActorRuntime>,
|
||||||
|
#[prost(message, optional, tag = "11")]
|
||||||
|
pub scheduler: ::core::option::Option<MetadataScheduler>,
|
||||||
|
}
|
||||||
|
/// MetadataScheduler is a message that contains the list of addresses of the
|
||||||
|
/// scheduler connections.
|
||||||
|
#[derive(Clone, PartialEq, ::prost::Message)]
|
||||||
|
pub struct MetadataScheduler {
|
||||||
|
/// connected_addresses the list of addresses of the scheduler connections.
|
||||||
|
#[prost(string, repeated, tag = "1")]
|
||||||
|
pub connected_addresses: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
|
||||||
}
|
}
|
||||||
#[derive(Clone, PartialEq, ::prost::Message)]
|
#[derive(Clone, PartialEq, ::prost::Message)]
|
||||||
pub struct ActorRuntime {
|
pub struct ActorRuntime {
|
||||||
|
@ -3154,7 +3163,7 @@ pub struct Job {
|
||||||
///
|
///
|
||||||
/// Systemd timer style cron accepts 6 fields:
|
/// Systemd timer style cron accepts 6 fields:
|
||||||
/// seconds | minutes | hours | day of month | month | day of week
|
/// seconds | minutes | hours | day of month | month | day of week
|
||||||
/// 0-59 | 0-59 | 0-23 | 1-31 | 1-12/jan-dec | 0-7/sun-sat
|
/// 0-59 | 0-59 | 0-23 | 1-31 | 1-12/jan-dec | 0-6/sun-sat
|
||||||
///
|
///
|
||||||
/// "0 30 * * * *" - every hour on the half hour
|
/// "0 30 * * * *" - every hour on the half hour
|
||||||
/// "0 15 3 * * *" - every day at 03:15
|
/// "0 15 3 * * *" - every day at 03:15
|
||||||
|
@ -3228,6 +3237,72 @@ pub struct DeleteJobRequest {
|
||||||
/// Empty
|
/// Empty
|
||||||
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
|
#[derive(Clone, Copy, PartialEq, ::prost::Message)]
|
||||||
pub struct DeleteJobResponse {}
|
pub struct DeleteJobResponse {}
|
||||||
|
/// ConversationRequest is the request object for Conversation.
|
||||||
|
#[derive(Clone, PartialEq, ::prost::Message)]
|
||||||
|
pub struct ConversationRequest {
|
||||||
|
/// The name of Conversation component
|
||||||
|
#[prost(string, tag = "1")]
|
||||||
|
pub name: ::prost::alloc::string::String,
|
||||||
|
/// The ID of an existing chat (like in ChatGPT)
|
||||||
|
#[prost(string, optional, tag = "2")]
|
||||||
|
pub context_id: ::core::option::Option<::prost::alloc::string::String>,
|
||||||
|
/// Inputs for the conversation, support multiple input in one time.
|
||||||
|
#[prost(message, repeated, tag = "3")]
|
||||||
|
pub inputs: ::prost::alloc::vec::Vec<ConversationInput>,
|
||||||
|
/// Parameters for all custom fields.
|
||||||
|
#[prost(map = "string, message", tag = "4")]
|
||||||
|
pub parameters: ::std::collections::HashMap<
|
||||||
|
::prost::alloc::string::String,
|
||||||
|
::prost_types::Any,
|
||||||
|
>,
|
||||||
|
/// The metadata passing to conversation components.
|
||||||
|
#[prost(map = "string, string", tag = "5")]
|
||||||
|
pub metadata: ::std::collections::HashMap<
|
||||||
|
::prost::alloc::string::String,
|
||||||
|
::prost::alloc::string::String,
|
||||||
|
>,
|
||||||
|
/// Scrub PII data that comes back from the LLM
|
||||||
|
#[prost(bool, optional, tag = "6")]
|
||||||
|
pub scrub_pii: ::core::option::Option<bool>,
|
||||||
|
/// Temperature for the LLM to optimize for creativity or predictability
|
||||||
|
#[prost(double, optional, tag = "7")]
|
||||||
|
pub temperature: ::core::option::Option<f64>,
|
||||||
|
}
|
||||||
|
#[derive(Clone, PartialEq, ::prost::Message)]
|
||||||
|
pub struct ConversationInput {
|
||||||
|
/// The content to send to the llm
|
||||||
|
#[prost(string, tag = "1")]
|
||||||
|
pub content: ::prost::alloc::string::String,
|
||||||
|
/// The role to set for the message
|
||||||
|
#[prost(string, optional, tag = "2")]
|
||||||
|
pub role: ::core::option::Option<::prost::alloc::string::String>,
|
||||||
|
/// Scrub PII data that goes into the LLM
|
||||||
|
#[prost(bool, optional, tag = "3")]
|
||||||
|
pub scrub_pii: ::core::option::Option<bool>,
|
||||||
|
}
|
||||||
|
/// ConversationResult is the result for one input.
|
||||||
|
#[derive(Clone, PartialEq, ::prost::Message)]
|
||||||
|
pub struct ConversationResult {
|
||||||
|
/// Result for the one conversation input.
|
||||||
|
#[prost(string, tag = "1")]
|
||||||
|
pub result: ::prost::alloc::string::String,
|
||||||
|
/// Parameters for all custom fields.
|
||||||
|
#[prost(map = "string, message", tag = "2")]
|
||||||
|
pub parameters: ::std::collections::HashMap<
|
||||||
|
::prost::alloc::string::String,
|
||||||
|
::prost_types::Any,
|
||||||
|
>,
|
||||||
|
}
|
||||||
|
/// ConversationResponse is the response for Conversation.
|
||||||
|
#[derive(Clone, PartialEq, ::prost::Message)]
|
||||||
|
pub struct ConversationResponse {
|
||||||
|
/// The ID of an existing chat (like in ChatGPT)
|
||||||
|
#[prost(string, optional, tag = "1")]
|
||||||
|
pub context_id: ::core::option::Option<::prost::alloc::string::String>,
|
||||||
|
/// An array of results.
|
||||||
|
#[prost(message, repeated, tag = "2")]
|
||||||
|
pub outputs: ::prost::alloc::vec::Vec<ConversationResult>,
|
||||||
|
}
|
||||||
/// PubsubSubscriptionType indicates the type of subscription
|
/// PubsubSubscriptionType indicates the type of subscription
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
|
||||||
#[repr(i32)]
|
#[repr(i32)]
|
||||||
|
@ -4414,6 +4489,7 @@ pub mod dapr_client {
|
||||||
self.inner.unary(req, path, codec).await
|
self.inner.unary(req, path, codec).await
|
||||||
}
|
}
|
||||||
/// Starts a new instance of a workflow
|
/// Starts a new instance of a workflow
|
||||||
|
#[deprecated]
|
||||||
pub async fn start_workflow_alpha1(
|
pub async fn start_workflow_alpha1(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: impl tonic::IntoRequest<super::StartWorkflowRequest>,
|
request: impl tonic::IntoRequest<super::StartWorkflowRequest>,
|
||||||
|
@ -4441,6 +4517,7 @@ pub mod dapr_client {
|
||||||
self.inner.unary(req, path, codec).await
|
self.inner.unary(req, path, codec).await
|
||||||
}
|
}
|
||||||
/// Gets details about a started workflow instance
|
/// Gets details about a started workflow instance
|
||||||
|
#[deprecated]
|
||||||
pub async fn get_workflow_alpha1(
|
pub async fn get_workflow_alpha1(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: impl tonic::IntoRequest<super::GetWorkflowRequest>,
|
request: impl tonic::IntoRequest<super::GetWorkflowRequest>,
|
||||||
|
@ -4468,6 +4545,7 @@ pub mod dapr_client {
|
||||||
self.inner.unary(req, path, codec).await
|
self.inner.unary(req, path, codec).await
|
||||||
}
|
}
|
||||||
/// Purge Workflow
|
/// Purge Workflow
|
||||||
|
#[deprecated]
|
||||||
pub async fn purge_workflow_alpha1(
|
pub async fn purge_workflow_alpha1(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: impl tonic::IntoRequest<super::PurgeWorkflowRequest>,
|
request: impl tonic::IntoRequest<super::PurgeWorkflowRequest>,
|
||||||
|
@ -4492,6 +4570,7 @@ pub mod dapr_client {
|
||||||
self.inner.unary(req, path, codec).await
|
self.inner.unary(req, path, codec).await
|
||||||
}
|
}
|
||||||
/// Terminates a running workflow instance
|
/// Terminates a running workflow instance
|
||||||
|
#[deprecated]
|
||||||
pub async fn terminate_workflow_alpha1(
|
pub async fn terminate_workflow_alpha1(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: impl tonic::IntoRequest<super::TerminateWorkflowRequest>,
|
request: impl tonic::IntoRequest<super::TerminateWorkflowRequest>,
|
||||||
|
@ -4519,6 +4598,7 @@ pub mod dapr_client {
|
||||||
self.inner.unary(req, path, codec).await
|
self.inner.unary(req, path, codec).await
|
||||||
}
|
}
|
||||||
/// Pauses a running workflow instance
|
/// Pauses a running workflow instance
|
||||||
|
#[deprecated]
|
||||||
pub async fn pause_workflow_alpha1(
|
pub async fn pause_workflow_alpha1(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: impl tonic::IntoRequest<super::PauseWorkflowRequest>,
|
request: impl tonic::IntoRequest<super::PauseWorkflowRequest>,
|
||||||
|
@ -4543,6 +4623,7 @@ pub mod dapr_client {
|
||||||
self.inner.unary(req, path, codec).await
|
self.inner.unary(req, path, codec).await
|
||||||
}
|
}
|
||||||
/// Resumes a paused workflow instance
|
/// Resumes a paused workflow instance
|
||||||
|
#[deprecated]
|
||||||
pub async fn resume_workflow_alpha1(
|
pub async fn resume_workflow_alpha1(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: impl tonic::IntoRequest<super::ResumeWorkflowRequest>,
|
request: impl tonic::IntoRequest<super::ResumeWorkflowRequest>,
|
||||||
|
@ -4567,6 +4648,7 @@ pub mod dapr_client {
|
||||||
self.inner.unary(req, path, codec).await
|
self.inner.unary(req, path, codec).await
|
||||||
}
|
}
|
||||||
/// Raise an event to a running workflow instance
|
/// Raise an event to a running workflow instance
|
||||||
|
#[deprecated]
|
||||||
pub async fn raise_event_workflow_alpha1(
|
pub async fn raise_event_workflow_alpha1(
|
||||||
&mut self,
|
&mut self,
|
||||||
request: impl tonic::IntoRequest<super::RaiseEventWorkflowRequest>,
|
request: impl tonic::IntoRequest<super::RaiseEventWorkflowRequest>,
|
||||||
|
@ -4871,6 +4953,31 @@ pub mod dapr_client {
|
||||||
);
|
);
|
||||||
self.inner.unary(req, path, codec).await
|
self.inner.unary(req, path, codec).await
|
||||||
}
|
}
|
||||||
|
/// Converse with a LLM service
|
||||||
|
pub async fn converse_alpha1(
|
||||||
|
&mut self,
|
||||||
|
request: impl tonic::IntoRequest<super::ConversationRequest>,
|
||||||
|
) -> std::result::Result<
|
||||||
|
tonic::Response<super::ConversationResponse>,
|
||||||
|
tonic::Status,
|
||||||
|
> {
|
||||||
|
self.inner
|
||||||
|
.ready()
|
||||||
|
.await
|
||||||
|
.map_err(|e| {
|
||||||
|
tonic::Status::unknown(
|
||||||
|
format!("Service was not ready: {}", e.into()),
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
let codec = tonic::codec::ProstCodec::default();
|
||||||
|
let path = http::uri::PathAndQuery::from_static(
|
||||||
|
"/dapr.proto.runtime.v1.Dapr/ConverseAlpha1",
|
||||||
|
);
|
||||||
|
let mut req = request.into_request();
|
||||||
|
req.extensions_mut()
|
||||||
|
.insert(GrpcMethod::new("dapr.proto.runtime.v1.Dapr", "ConverseAlpha1"));
|
||||||
|
self.inner.unary(req, path, codec).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// Generated server implementations.
|
/// Generated server implementations.
|
||||||
|
@ -5318,6 +5425,14 @@ pub mod dapr_server {
|
||||||
tonic::Response<super::DeleteJobResponse>,
|
tonic::Response<super::DeleteJobResponse>,
|
||||||
tonic::Status,
|
tonic::Status,
|
||||||
>;
|
>;
|
||||||
|
/// Converse with a LLM service
|
||||||
|
async fn converse_alpha1(
|
||||||
|
&self,
|
||||||
|
request: tonic::Request<super::ConversationRequest>,
|
||||||
|
) -> std::result::Result<
|
||||||
|
tonic::Response<super::ConversationResponse>,
|
||||||
|
tonic::Status,
|
||||||
|
>;
|
||||||
}
|
}
|
||||||
/// Dapr service provides APIs to user application to access Dapr building blocks.
|
/// Dapr service provides APIs to user application to access Dapr building blocks.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -8000,6 +8115,49 @@ pub mod dapr_server {
|
||||||
};
|
};
|
||||||
Box::pin(fut)
|
Box::pin(fut)
|
||||||
}
|
}
|
||||||
|
"/dapr.proto.runtime.v1.Dapr/ConverseAlpha1" => {
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
struct ConverseAlpha1Svc<T: Dapr>(pub Arc<T>);
|
||||||
|
impl<T: Dapr> tonic::server::UnaryService<super::ConversationRequest>
|
||||||
|
for ConverseAlpha1Svc<T> {
|
||||||
|
type Response = super::ConversationResponse;
|
||||||
|
type Future = BoxFuture<
|
||||||
|
tonic::Response<Self::Response>,
|
||||||
|
tonic::Status,
|
||||||
|
>;
|
||||||
|
fn call(
|
||||||
|
&mut self,
|
||||||
|
request: tonic::Request<super::ConversationRequest>,
|
||||||
|
) -> Self::Future {
|
||||||
|
let inner = Arc::clone(&self.0);
|
||||||
|
let fut = async move {
|
||||||
|
<T as Dapr>::converse_alpha1(&inner, request).await
|
||||||
|
};
|
||||||
|
Box::pin(fut)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let accept_compression_encodings = self.accept_compression_encodings;
|
||||||
|
let send_compression_encodings = self.send_compression_encodings;
|
||||||
|
let max_decoding_message_size = self.max_decoding_message_size;
|
||||||
|
let max_encoding_message_size = self.max_encoding_message_size;
|
||||||
|
let inner = self.inner.clone();
|
||||||
|
let fut = async move {
|
||||||
|
let method = ConverseAlpha1Svc(inner);
|
||||||
|
let codec = tonic::codec::ProstCodec::default();
|
||||||
|
let mut grpc = tonic::server::Grpc::new(codec)
|
||||||
|
.apply_compression_config(
|
||||||
|
accept_compression_encodings,
|
||||||
|
send_compression_encodings,
|
||||||
|
)
|
||||||
|
.apply_max_message_size_config(
|
||||||
|
max_decoding_message_size,
|
||||||
|
max_encoding_message_size,
|
||||||
|
);
|
||||||
|
let res = grpc.unary(method, req).await;
|
||||||
|
Ok(res)
|
||||||
|
};
|
||||||
|
Box::pin(fut)
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
let mut response = http::Response::new(empty_body());
|
let mut response = http::Response::new(empty_body());
|
||||||
|
|
Binary file not shown.
|
@ -13,7 +13,7 @@ pub enum Error {
|
||||||
|
|
||||||
impl Display for Error {
|
impl Display for Error {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "{:?}", self)
|
write!(f, "{self:?}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,6 +50,6 @@ pub struct GrpcError {
|
||||||
|
|
||||||
impl Display for GrpcError {
|
impl Display for GrpcError {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "{:?}", self)
|
write!(f, "{self:?}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,18 @@
|
||||||
#![doc = include_str!("../README.md")]
|
#![doc = include_str!("../README.md")]
|
||||||
|
|
||||||
extern crate dapr_macros;
|
|
||||||
|
|
||||||
pub use serde;
|
pub use serde;
|
||||||
pub use serde_json;
|
pub use serde_json;
|
||||||
|
|
||||||
pub use client::Client;
|
pub use client::Client;
|
||||||
pub use dapr_macros::actor;
|
|
||||||
|
|
||||||
/// Module containing the Dapr Callback SDK.
|
/// Module containing the Dapr Callback SDK.
|
||||||
pub mod appcallback;
|
pub mod appcallback;
|
||||||
/// Module containing the 'Client' implementation.
|
/// Module containing the 'Client' implementation.
|
||||||
pub mod client;
|
pub mod client;
|
||||||
|
|
||||||
/// Module importing the Dapr runtime implementation.
|
/// Module importing the Dapr runtime implementation.
|
||||||
pub mod dapr {
|
pub mod dapr {
|
||||||
|
#![allow(clippy::large_enum_variant)]
|
||||||
pub mod proto {
|
pub mod proto {
|
||||||
pub mod common {
|
pub mod common {
|
||||||
pub mod v1 {
|
pub mod v1 {
|
||||||
|
|
|
@ -37,7 +37,7 @@ impl Display for ActorError {
|
||||||
ActorError::CorruptedState => write!(f, "Actor state corrupted"),
|
ActorError::CorruptedState => write!(f, "Actor state corrupted"),
|
||||||
ActorError::MethodNotFound => write!(f, "Method not found"),
|
ActorError::MethodNotFound => write!(f, "Method not found"),
|
||||||
ActorError::ActorNotFound => write!(f, "Actor not found"),
|
ActorError::ActorNotFound => write!(f, "Actor not found"),
|
||||||
ActorError::MethodError(e) => write!(f, "Method error: {}", e),
|
ActorError::MethodError(e) => write!(f, "Method error: {e}"),
|
||||||
ActorError::SerializationError() => write!(f, "Serialization error"),
|
ActorError::SerializationError() => write!(f, "Serialization error"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,9 +102,9 @@ impl ActorTypeRegistration {
|
||||||
/// # Arguments:
|
/// # Arguments:
|
||||||
/// * `method_name` - The name of the method to be registered. This name will be used by actor clients to invoke the method.
|
/// * `method_name` - The name of the method to be registered. This name will be used by actor clients to invoke the method.
|
||||||
/// * `handler` - The handler function to be invoked when the method is called.
|
/// * `handler` - The handler function to be invoked when the method is called.
|
||||||
/// Can be any valid [Axum handler](https://docs.rs/axum/latest/axum/handler/index.html),
|
/// Can be any valid [Axum handler](https://docs.rs/axum/latest/axum/handler/index.html),
|
||||||
/// use [Axum extractors](https://docs.rs/axum/latest/axum/extract/index.html) to access the incoming request and return an [`impl IntoResponse`](https://docs.rs/axum/latest/axum/response/trait.IntoResponse.html).
|
/// use [Axum extractors](https://docs.rs/axum/latest/axum/extract/index.html) to access the incoming request and return an [`impl IntoResponse`](https://docs.rs/axum/latest/axum/response/trait.IntoResponse.html).
|
||||||
/// Use the `DaprJson` extractor to deserialize the request from Json coming from a Dapr sidecar.
|
/// Use the `DaprJson` extractor to deserialize the request from Json coming from a Dapr sidecar.
|
||||||
/// # Example:
|
/// # Example:
|
||||||
/// ```ignore
|
/// ```ignore
|
||||||
/// # use std::sync::Arc;
|
/// # use std::sync::Arc;
|
||||||
|
@ -174,7 +174,7 @@ impl ActorTypeRegistration {
|
||||||
T: 'static,
|
T: 'static,
|
||||||
{
|
{
|
||||||
let actor_type = self.name.clone();
|
let actor_type = self.name.clone();
|
||||||
let method_path = format!("/actors/{}/:actor_id/method/{}", actor_type, method_name);
|
let method_path = format!("/actors/{actor_type}/:actor_id/method/{method_name}");
|
||||||
|
|
||||||
let reg_func = move |router: Router, runtime: Arc<ActorRuntime>| {
|
let reg_func = move |router: Router, runtime: Arc<ActorRuntime>| {
|
||||||
router.route(
|
router.route(
|
||||||
|
@ -224,7 +224,7 @@ impl ActorRuntime {
|
||||||
let name = registration.name.clone();
|
let name = registration.name.clone();
|
||||||
let mut g = self.registered_actors_types.write().await;
|
let mut g = self.registered_actors_types.write().await;
|
||||||
g.insert(name.clone(), registration);
|
g.insert(name.clone(), registration);
|
||||||
log::info!("registered actor {}", name);
|
log::info!("registered actor {name}");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn configure_method_routes(
|
pub async fn configure_method_routes(
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#[cfg(test)]
|
||||||
use std::{collections::HashMap, sync::Arc};
|
use std::{collections::HashMap, sync::Arc};
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
@ -96,7 +97,7 @@ async fn test_actor_invoke() {
|
||||||
let server = TestServer::new(app.into_make_service()).unwrap();
|
let server = TestServer::new(app.into_make_service()).unwrap();
|
||||||
|
|
||||||
let invoke_resp = server
|
let invoke_resp = server
|
||||||
.put(&format!("/actors/MyActor/{}/method/do_stuff", actor_id))
|
.put(&format!("/actors/MyActor/{actor_id}/method/do_stuff"))
|
||||||
.json(&json!({ "name": "foo" }))
|
.json(&json!({ "name": "foo" }))
|
||||||
.await;
|
.await;
|
||||||
invoke_resp.assert_status_ok();
|
invoke_resp.assert_status_ok();
|
||||||
|
@ -117,7 +118,7 @@ async fn test_actor_invoke() {
|
||||||
);
|
);
|
||||||
|
|
||||||
let invoke_resp2 = server
|
let invoke_resp2 = server
|
||||||
.put(&format!("/actors/MyActor/{}/method/do_stuff", actor_id))
|
.put(&format!("/actors/MyActor/{actor_id}/method/do_stuff"))
|
||||||
.json(&json!({ "name": "foo" }))
|
.json(&json!({ "name": "foo" }))
|
||||||
.await;
|
.await;
|
||||||
invoke_resp2.assert_status_ok();
|
invoke_resp2.assert_status_ok();
|
||||||
|
@ -168,19 +169,15 @@ async fn test_actor_deactivate() {
|
||||||
let actor_id = Uuid::new_v4().to_string();
|
let actor_id = Uuid::new_v4().to_string();
|
||||||
|
|
||||||
let invoke_resp = server
|
let invoke_resp = server
|
||||||
.put(&format!("/actors/MyActor/{}/method/do_stuff", actor_id))
|
.put(&format!("/actors/MyActor/{actor_id}/method/do_stuff"))
|
||||||
.json(&json!({ "name": "foo" }))
|
.json(&json!({ "name": "foo" }))
|
||||||
.await;
|
.await;
|
||||||
invoke_resp.assert_status_ok();
|
invoke_resp.assert_status_ok();
|
||||||
|
|
||||||
let deactivate_resp1 = server
|
let deactivate_resp1 = server.delete(&format!("/actors/MyActor/{actor_id}")).await;
|
||||||
.delete(&format!("/actors/MyActor/{}", actor_id))
|
|
||||||
.await;
|
|
||||||
deactivate_resp1.assert_status_ok();
|
deactivate_resp1.assert_status_ok();
|
||||||
|
|
||||||
let deactivate_resp2 = server
|
let deactivate_resp2 = server.delete(&format!("/actors/MyActor/{actor_id}")).await;
|
||||||
.delete(&format!("/actors/MyActor/{}", actor_id))
|
|
||||||
.await;
|
|
||||||
deactivate_resp2.assert_status_not_found();
|
deactivate_resp2.assert_status_not_found();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use axum::{
|
use axum::{
|
||||||
extract::{Path, State},
|
extract::{OriginalUri, Path, State},
|
||||||
http::StatusCode,
|
http::StatusCode,
|
||||||
response::IntoResponse,
|
response::IntoResponse,
|
||||||
routing::{delete, get, put},
|
routing::{delete, get, put},
|
||||||
|
@ -84,6 +84,12 @@ pub struct DaprHttpServer {
|
||||||
|
|
||||||
impl DaprHttpServer {
|
impl DaprHttpServer {
|
||||||
/// Creates a new instance of the Dapr HTTP server with default options.
|
/// Creates a new instance of the Dapr HTTP server with default options.
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
///
|
||||||
|
/// This function panics if the Dapr Sidecar cannot be reached!
|
||||||
|
/// For a non-panicking version that allows you to handle any errors yourself, see:
|
||||||
|
/// [DaprHttpServer::try_new_with_dapr_port]
|
||||||
pub async fn new() -> Self {
|
pub async fn new() -> Self {
|
||||||
let dapr_port: u16 = std::env::var("DAPR_GRPC_PORT")
|
let dapr_port: u16 = std::env::var("DAPR_GRPC_PORT")
|
||||||
.unwrap_or("3501".into())
|
.unwrap_or("3501".into())
|
||||||
|
@ -92,19 +98,38 @@ impl DaprHttpServer {
|
||||||
Self::with_dapr_port(dapr_port).await
|
Self::with_dapr_port(dapr_port).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a new instance of the Dapr HTTP server that connects to the Dapr sidecar on the
|
||||||
|
/// given dapr_port.
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
///
|
||||||
|
/// This function panics if the Dapr Sidecar cannot be reached!
|
||||||
|
/// For a non-panicking version that allows you to handle any errors yourself, see:
|
||||||
|
/// [DaprHttpServer::try_new_with_dapr_port]
|
||||||
pub async fn with_dapr_port(dapr_port: u16) -> Self {
|
pub async fn with_dapr_port(dapr_port: u16) -> Self {
|
||||||
let dapr_addr = format!("https://127.0.0.1:{}", dapr_port);
|
match Self::try_new_with_dapr_port(dapr_port).await {
|
||||||
|
|
||||||
let cc = match TonicClient::connect(dapr_addr).await {
|
|
||||||
Ok(c) => c,
|
Ok(c) => c,
|
||||||
Err(err) => panic!("failed to connect to dapr: {}", err),
|
Err(err) => panic!("failed to connect to dapr: {err}"),
|
||||||
};
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new instance of the Dapr HTTP server that connects to the Dapr sidecar on the
|
||||||
|
/// given dapr_port.
|
||||||
|
///
|
||||||
|
/// In contrast to the other functions that create a DaprHttpServer, this function does
|
||||||
|
/// not panic, but instead returns a Result.
|
||||||
|
pub async fn try_new_with_dapr_port(
|
||||||
|
dapr_port: u16,
|
||||||
|
) -> Result<Self, Box<dyn std::error::Error>> {
|
||||||
|
let dapr_addr = format!("https://127.0.0.1:{dapr_port}");
|
||||||
|
|
||||||
|
let cc = TonicClient::connect(dapr_addr).await?;
|
||||||
let rt = ActorRuntime::new(cc);
|
let rt = ActorRuntime::new(cc);
|
||||||
|
|
||||||
DaprHttpServer {
|
Ok(DaprHttpServer {
|
||||||
actor_runtime: Arc::new(rt),
|
actor_runtime: Arc::new(rt),
|
||||||
shutdown_signal: None,
|
shutdown_signal: None,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn with_graceful_shutdown<F>(self, signal: F) -> Self
|
pub fn with_graceful_shutdown<F>(self, signal: F) -> Self
|
||||||
|
@ -138,7 +163,7 @@ impl DaprHttpServer {
|
||||||
.unwrap_or(8080);
|
.unwrap_or(8080);
|
||||||
|
|
||||||
let address = format!("127.0.0.1:{}", port.unwrap_or(default_port));
|
let address = format!("127.0.0.1:{}", port.unwrap_or(default_port));
|
||||||
let listener = TcpListener::bind(address).await.unwrap();
|
let listener = TcpListener::bind(address).await?;
|
||||||
|
|
||||||
let server = axum::serve(listener, app.into_make_service());
|
let server = axum::serve(listener, app.into_make_service());
|
||||||
|
|
||||||
|
@ -182,7 +207,8 @@ impl DaprHttpServer {
|
||||||
.route(
|
.route(
|
||||||
"/actors/:actor_type/:actor_id/method/timer/:timer_name",
|
"/actors/:actor_type/:actor_id/method/timer/:timer_name",
|
||||||
put(invoke_timer).with_state(rt.clone()),
|
put(invoke_timer).with_state(rt.clone()),
|
||||||
);
|
)
|
||||||
|
.fallback(fallback_handler);
|
||||||
|
|
||||||
self.actor_runtime
|
self.actor_runtime
|
||||||
.configure_method_routes(app, rt.clone())
|
.configure_method_routes(app, rt.clone())
|
||||||
|
@ -190,6 +216,14 @@ impl DaprHttpServer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn fallback_handler(OriginalUri(uri): OriginalUri) -> impl IntoResponse {
|
||||||
|
log::warn!("Returning 404 for request: {uri}");
|
||||||
|
(
|
||||||
|
StatusCode::NOT_FOUND,
|
||||||
|
format!("The URI '{uri}' could not be found!"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
async fn health_check() -> impl IntoResponse {
|
async fn health_check() -> impl IntoResponse {
|
||||||
log::debug!("recieved health check request");
|
log::debug!("recieved health check request");
|
||||||
StatusCode::OK
|
StatusCode::OK
|
||||||
|
@ -210,11 +244,11 @@ async fn deactivate_actor(
|
||||||
match runtime.deactivate_actor(&actor_type, &actor_id).await {
|
match runtime.deactivate_actor(&actor_type, &actor_id).await {
|
||||||
Ok(_) => StatusCode::OK,
|
Ok(_) => StatusCode::OK,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("invoke_actor: {:?}", err);
|
log::error!("invoke_actor: {err:?}");
|
||||||
match err {
|
match err {
|
||||||
super::actor::ActorError::ActorNotFound => StatusCode::NOT_FOUND,
|
super::actor::ActorError::ActorNotFound => StatusCode::NOT_FOUND,
|
||||||
_ => {
|
_ => {
|
||||||
log::error!("deactivate_actor: {:?}", err);
|
log::error!("deactivate_actor: {err:?}");
|
||||||
StatusCode::INTERNAL_SERVER_ERROR
|
StatusCode::INTERNAL_SERVER_ERROR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -227,13 +261,7 @@ async fn invoke_reminder(
|
||||||
Path((actor_type, actor_id, reminder_name)): Path<(String, String, String)>,
|
Path((actor_type, actor_id, reminder_name)): Path<(String, String, String)>,
|
||||||
Json(payload): Json<ReminderPayload>,
|
Json(payload): Json<ReminderPayload>,
|
||||||
) -> impl IntoResponse {
|
) -> impl IntoResponse {
|
||||||
log::debug!(
|
log::debug!("invoke_reminder: {actor_type} {actor_id} {reminder_name} {payload:?}");
|
||||||
"invoke_reminder: {} {} {} {:?}",
|
|
||||||
actor_type,
|
|
||||||
actor_id,
|
|
||||||
reminder_name,
|
|
||||||
payload
|
|
||||||
);
|
|
||||||
|
|
||||||
match runtime
|
match runtime
|
||||||
.invoke_reminder(
|
.invoke_reminder(
|
||||||
|
@ -246,11 +274,11 @@ async fn invoke_reminder(
|
||||||
{
|
{
|
||||||
Ok(_output) => StatusCode::OK,
|
Ok(_output) => StatusCode::OK,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("invoke_actor: {:?}", err);
|
log::error!("invoke_actor: {err:?}");
|
||||||
match err {
|
match err {
|
||||||
super::actor::ActorError::ActorNotFound => StatusCode::NOT_FOUND,
|
super::actor::ActorError::ActorNotFound => StatusCode::NOT_FOUND,
|
||||||
_ => {
|
_ => {
|
||||||
log::error!("invoke_reminder: {:?}", err);
|
log::error!("invoke_reminder: {err:?}");
|
||||||
StatusCode::INTERNAL_SERVER_ERROR
|
StatusCode::INTERNAL_SERVER_ERROR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -263,13 +291,7 @@ async fn invoke_timer(
|
||||||
Path((actor_type, actor_id, timer_name)): Path<(String, String, String)>,
|
Path((actor_type, actor_id, timer_name)): Path<(String, String, String)>,
|
||||||
Json(payload): Json<TimerPayload>,
|
Json(payload): Json<TimerPayload>,
|
||||||
) -> impl IntoResponse {
|
) -> impl IntoResponse {
|
||||||
log::debug!(
|
log::debug!("invoke_timer: {actor_type} {actor_id} {timer_name}, {payload:?}");
|
||||||
"invoke_timer: {} {} {}, {:?}",
|
|
||||||
actor_type,
|
|
||||||
actor_id,
|
|
||||||
timer_name,
|
|
||||||
payload
|
|
||||||
);
|
|
||||||
|
|
||||||
match runtime
|
match runtime
|
||||||
.invoke_timer(
|
.invoke_timer(
|
||||||
|
@ -282,11 +304,11 @@ async fn invoke_timer(
|
||||||
{
|
{
|
||||||
Ok(_output) => StatusCode::OK,
|
Ok(_output) => StatusCode::OK,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("invoke_actor: {:?}", err);
|
log::error!("invoke_actor: {err:?}");
|
||||||
match err {
|
match err {
|
||||||
super::actor::ActorError::ActorNotFound => StatusCode::NOT_FOUND,
|
super::actor::ActorError::ActorNotFound => StatusCode::NOT_FOUND,
|
||||||
_ => {
|
_ => {
|
||||||
log::error!("invoke_timer: {:?}", err);
|
log::error!("invoke_timer: {err:?}");
|
||||||
StatusCode::INTERNAL_SERVER_ERROR
|
StatusCode::INTERNAL_SERVER_ERROR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,14 +28,14 @@ where
|
||||||
let bytes = match axum::body::Bytes::from_request(req, state).await {
|
let bytes = match axum::body::Bytes::from_request(req, state).await {
|
||||||
Ok(bytes) => bytes,
|
Ok(bytes) => bytes,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
log::error!("Error getting bytes: {}", e);
|
log::error!("Error getting bytes: {e}");
|
||||||
return Err(JsonRejection::JsonError(e.to_string()));
|
return Err(JsonRejection::JsonError(e.to_string()));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let value = match serde_json::from_slice::<T>(&bytes) {
|
let value = match serde_json::from_slice::<T>(&bytes) {
|
||||||
Ok(value) => value,
|
Ok(value) => value,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
log::error!("Error deserializing JSON: {}", e);
|
log::error!("Error deserializing JSON: {e}");
|
||||||
return Err(JsonRejection::JsonError(e.to_string()));
|
return Err(JsonRejection::JsonError(e.to_string()));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,13 +8,14 @@ All Dapr documentation is hosted at [docs.dapr.io](https://docs.dapr.io), includ
|
||||||
|
|
||||||
### Rust SDK docs source
|
### Rust SDK docs source
|
||||||
|
|
||||||
Although the docs site code and content is in the [docs repo](https://github.com/dapr/docs), the Go SDK content and images are within the `content` and `static` directories, respectively.
|
Although the docs site code and content is in the [docs repo](https://github.com/dapr/docs), the Rust SDK content and images are within the `content` and `static` directories, respectively.
|
||||||
|
|
||||||
This allows separation of roles and expertise between maintainers, and makes it easy to find the docs files you are looking for.
|
This allows separation of roles and expertise between maintainers, and makes it easy to find the docs files you are looking for.
|
||||||
|
|
||||||
## Writing Rust SDK docs
|
## Writing Rust SDK docs
|
||||||
|
|
||||||
To get up and running to write Go SDK docs, visit the [docs repo](https://github.com/dapr/docs) to initialize your environment. It will clone both the docs repo and this repo, so you can make changes and see it rendered within the site instantly, as well as commit and PR into this repo.
|
To get up and running to write Rust SDK docs, visit the [docs repo](https://github.com/dapr/docs) to initialize your
|
||||||
|
environment. It will clone both the docs repo and this repo, so you can make changes and see it rendered within the site instantly, as well as commit and PR into this repo.
|
||||||
|
|
||||||
Make sure to read the [docs contributing guide](https://docs.dapr.io/contributing/contributing-docs/) for information on style/semantics/etc.
|
Make sure to read the [docs contributing guide](https://docs.dapr.io/contributing/contributing-docs/) for information on style/semantics/etc.
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ When contributing to the [Rust SDK](https://github.com/dapr/rust-sdk) the follow
|
||||||
|
|
||||||
The `examples` directory contains code samples for users to run to try out specific functionality of the various Rust SDK packages and extensions. It also hosts component examples used for validation. When writing new and updated samples keep in mind:
|
The `examples` directory contains code samples for users to run to try out specific functionality of the various Rust SDK packages and extensions. It also hosts component examples used for validation. When writing new and updated samples keep in mind:
|
||||||
|
|
||||||
- All examples should be runnable on Windows, Linux, and MacOS. While Rust code is consistent among operating systems aside from minor OS-feature gating, any pre/post example commands should provide options through [codetabs]({{< ref "contributing-docs.md#tabbed-content" >}})
|
- All examples should be runnable on Windows, Linux, and MacOS. While Rust code is consistent among operating systems aside from minor OS-feature gating, any pre/post example commands should provide options through [tabpane]({{% ref "contributing-docs.md#tabbed-content" %}})
|
||||||
- Contain steps to download/install any required pre-requisites. Someone coming in with a fresh OS install should be able to start on the example and complete it without an error. Links to external download pages are fine.
|
- Contain steps to download/install any required pre-requisites. Someone coming in with a fresh OS install should be able to start on the example and complete it without an error. Links to external download pages are fine.
|
||||||
- Examples should be pass validation and include mechanical markdown steps and be added to the validation workflow [TBA](#)
|
- Examples should be pass validation and include mechanical markdown steps and be added to the validation workflow [TBA](#)
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ The `examples` directory contains code samples for users to run to try out speci
|
||||||
|
|
||||||
The `daprdocs` directory contains the markdown files that are rendered into the [Dapr Docs](https://docs.dapr.io) website. When the documentation website is built this repo is cloned and configured so that its contents are rendered with the docs content. When writing docs keep in mind:
|
The `daprdocs` directory contains the markdown files that are rendered into the [Dapr Docs](https://docs.dapr.io) website. When the documentation website is built this repo is cloned and configured so that its contents are rendered with the docs content. When writing docs keep in mind:
|
||||||
|
|
||||||
- All rules in the [docs guide]({{< ref contributing-docs.md >}}) should be followed in addition to these.
|
- All rules in the [docs guide]({{% ref contributing-docs.md %}}) should be followed in addition to these.
|
||||||
- All files and directories should be prefixed with `rust-` to ensure all file/directory names are globally unique across all Dapr documentation.
|
- All files and directories should be prefixed with `rust-` to ensure all file/directory names are globally unique across all Dapr documentation.
|
||||||
|
|
||||||
## Update Protobufs
|
## Update Protobufs
|
||||||
|
|
|
@ -22,6 +22,6 @@ A client library to help build Dapr applications using Rust. This client is targ
|
||||||
{{< card title="**Client**">}}
|
{{< card title="**Client**">}}
|
||||||
Use the Rust Client SDK for invoking public Dapr APIs
|
Use the Rust Client SDK for invoking public Dapr APIs
|
||||||
|
|
||||||
[**Learn more about the Rust Client SDK**]({{< ref rust-client >}})
|
[**Learn more about the Rust Client SDK**]({{% ref rust-client %}})
|
||||||
{{< /card >}}
|
{{< /card >}}
|
||||||
{{< /cardpane >}}
|
{{< /cardpane >}}
|
||||||
|
|
|
@ -7,19 +7,20 @@ description: How to get up and running with the Dapr Rust SDK
|
||||||
no_list: true
|
no_list: true
|
||||||
---
|
---
|
||||||
|
|
||||||
The Dapr client package allows you to interact with other Dapr applications from a Rust application.
|
The Dapr client package allows you to interact with other Dapr applications from
|
||||||
|
a Rust application.
|
||||||
|
|
||||||
{{% alert title="Note" color="primary" %}}
|
{{% alert title="Note" color="primary" %}}
|
||||||
The Dapr Rust-SDK is currently in Alpha. Work is underway to bring it to a stable release and will likely involve breaking changes.
|
The Dapr Rust-SDK is currently in Alpha. Work is underway to bring it to a
|
||||||
|
stable release and will likely involve breaking changes.
|
||||||
{{% /alert %}}
|
{{% /alert %}}
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- [Dapr CLI]({{< ref install-dapr-cli.md >}}) installed
|
- [Dapr CLI]({{% ref install-dapr-cli.md %}}) installed
|
||||||
- Initialized [Dapr environment]({{< ref install-dapr-selfhost.md >}})
|
- Initialized [Dapr environment]({{% ref install-dapr-selfhost.md %}})
|
||||||
- [Rust installed](https://www.rust-lang.org/tools/install)
|
- [Rust installed](https://www.rust-lang.org/tools/install)
|
||||||
|
|
||||||
|
|
||||||
## Import the client package
|
## Import the client package
|
||||||
|
|
||||||
Add Dapr to your `cargo.toml`
|
Add Dapr to your `cargo.toml`
|
||||||
|
@ -27,34 +28,42 @@ Add Dapr to your `cargo.toml`
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Other dependencies
|
# Other dependencies
|
||||||
dapr = "0.13.0"
|
dapr = "0.16.0"
|
||||||
```
|
```
|
||||||
|
|
||||||
You can either reference `dapr::Client` or bind the full path to a new name as follows:
|
You can either reference `dapr::Client` or bind the full path to a new name as follows:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
use dapr::Client as DaprClient
|
use dapr::Client as DaprClient;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Instantiating the Dapr client
|
## Instantiating the Dapr client
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
const addr: String = "https://127.0.0.1";
|
let addr = "https://127.0.0.1".to_string();
|
||||||
const port: String = "50001";
|
|
||||||
|
|
||||||
let mut client = dapr::Client::<dapr::client::TonicClient>::connect(addr,
|
let mut client = dapr::Client::<dapr::client::TonicClient>::connect(addr,
|
||||||
port).await?;
|
port).await?;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Alternatively if you would like to specify a custom port, this can be done by using this connect method:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let mut client = dapr::Client::<dapr::client::TonicClient>::connect_with_port(addr, "3500".to_string()).await?;
|
||||||
|
```
|
||||||
|
|
||||||
## Building blocks
|
## Building blocks
|
||||||
|
|
||||||
The Rust SDK allows you to interface with the [Dapr building blocks]({{< ref building-blocks >}}).
|
The Rust SDK allows you to interface with the
|
||||||
|
[Dapr building blocks]({{% ref building-blocks %}}).
|
||||||
|
|
||||||
### Service Invocation
|
### Service Invocation (gRPC)
|
||||||
|
|
||||||
To invoke a specific method on another service running with Dapr sidecar, the Dapr client Go SDK provides two options:
|
To invoke a specific method on another service running with Dapr sidecar, the
|
||||||
|
Dapr client provides two options:
|
||||||
|
|
||||||
|
Invoke a (gRPC) service
|
||||||
|
|
||||||
Invoke a service
|
|
||||||
```rust
|
```rust
|
||||||
let response = client
|
let response = client
|
||||||
.invoke_service("service-to-invoke", "method-to-invoke", Some(data))
|
.invoke_service("service-to-invoke", "method-to-invoke", Some(data))
|
||||||
|
@ -62,36 +71,43 @@ let response = client
|
||||||
.unwrap();
|
.unwrap();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For a full guide on service invocation, visit
|
||||||
For a full guide on service invocation, visit [How-To: Invoke a service]({{< ref howto-invoke-discover-services.md >}}).
|
[How-To: Invoke a service]({{% ref howto-invoke-discover-services.md %}}).
|
||||||
|
|
||||||
### State Management
|
### State Management
|
||||||
|
|
||||||
The Dapr Client provides access to these state management methods: `save_state`, `get_state`, `delete_state` that can be used like so:
|
The Dapr Client provides access to these state management methods: `save_state`
|
||||||
|
, `get_state`, `delete_state` that can be used like so:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
let store_name = "store-name";
|
let store_name = String::from("statestore");
|
||||||
let state_key = "state-key";
|
|
||||||
|
|
||||||
let states = vec![(state_key, ("state-value").as_bytes().to_vec())];
|
let key = String::from("hello");
|
||||||
|
let val = String::from("world").into_bytes();
|
||||||
|
|
||||||
// save state with the key "state-key" and value "state-value"
|
// save key-value pair in the state store
|
||||||
client.save_state(store_name, states).await?;
|
client
|
||||||
|
.save_state(store_name, key, val, None, None, None)
|
||||||
|
.await?;
|
||||||
|
|
||||||
// get state for key "state-key"
|
let get_response = client
|
||||||
let response = client.get_state(store_name, state_key, None).await.unwrap();
|
.get_state("statestore", "hello", None)
|
||||||
|
.await?;
|
||||||
|
|
||||||
// delete state for key "state-key"
|
// delete a value from the state store
|
||||||
client.delete_state(store_name, state_key, None).await?;
|
client
|
||||||
|
.delete_state("statestore", "hello", None)
|
||||||
|
.await?;
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Note:** The `save_state` method currently performs a 'bulk' save but this will be refactored
|
Multiple states can be sent with the `save_bulk_states` method.
|
||||||
|
|
||||||
|
For a full guide on state management, visit
|
||||||
For a full guide on state management, visit [How-To: Save & get state]({{< ref howto-get-save-state.md >}}).
|
[How-To: Save & get state]({{% ref howto-get-save-state.md %}}).
|
||||||
|
|
||||||
### Publish Messages
|
### Publish Messages
|
||||||
To publish data onto a topic, the Dapr Go client provides a simple method:
|
|
||||||
|
To publish data onto a topic, the Dapr client provides a simple method:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
let pubsub_name = "pubsub-name".to_string();
|
let pubsub_name = "pubsub-name".to_string();
|
||||||
|
@ -104,7 +120,9 @@ client
|
||||||
.await?;
|
.await?;
|
||||||
```
|
```
|
||||||
|
|
||||||
For a full guide on pub/sub, visit [How-To: Publish & subscribe]({{< ref howto-publish-subscribe.md >}}).
|
For a full guide on pub/sub, visit
|
||||||
|
[How-To: Publish & subscribe]({{% ref howto-publish-subscribe.md %}}).
|
||||||
|
|
||||||
## Related links
|
## Related links
|
||||||
|
|
||||||
[Rust SDK Examples](https://github.com/dapr/rust-sdk/tree/master/examples)
|
[Rust SDK Examples](https://github.com/dapr/rust-sdk/tree/master/examples)
|
||||||
|
|
|
@ -10,7 +10,6 @@ rust-version.workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
async-trait = { workspace = true }
|
async-trait = { workspace = true }
|
||||||
base64 = "0.22"
|
|
||||||
dapr = { path = "../dapr" }
|
dapr = { path = "../dapr" }
|
||||||
dapr-macros = { path = "../dapr-macros" }
|
dapr-macros = { path = "../dapr-macros" }
|
||||||
env_logger = "0.11"
|
env_logger = "0.11"
|
||||||
|
@ -47,6 +46,10 @@ path = "src/client/client.rs"
|
||||||
name = "configuration"
|
name = "configuration"
|
||||||
path = "src/configuration/main.rs"
|
path = "src/configuration/main.rs"
|
||||||
|
|
||||||
|
[[example]]
|
||||||
|
name = "conversation"
|
||||||
|
path = "src/conversation/main.rs"
|
||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
name = "crypto"
|
name = "crypto"
|
||||||
path = "src/crypto/main.rs"
|
path = "src/crypto/main.rs"
|
||||||
|
|
|
@ -14,7 +14,7 @@ pub struct MyRequest {
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// TODO: Handle this issue in the sdk
|
// TODO: Handle this issue in the sdk
|
||||||
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
||||||
std::thread::sleep(std::time::Duration::new(2, 0));
|
tokio::time::sleep(std::time::Duration::new(2, 0)).await;
|
||||||
|
|
||||||
// Define the Dapr address
|
// Define the Dapr address
|
||||||
let addr = "https://127.0.0.1".to_string();
|
let addr = "https://127.0.0.1".to_string();
|
||||||
|
@ -30,7 +30,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
.invoke_actor("MyActor", "a1", "do_stuff", data, None)
|
.invoke_actor("MyActor", "a1", "do_stuff", data, None)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
println!("Response: {:#?}", resp);
|
println!("Response: {resp:#?}");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ impl MyActor {
|
||||||
println!("doing stuff with {}", req.name);
|
println!("doing stuff with {}", req.name);
|
||||||
let mut dapr = self.client.clone();
|
let mut dapr = self.client.clone();
|
||||||
let r = dapr.get_actor_state("key1").await.unwrap();
|
let r = dapr.get_actor_state("key1").await.unwrap();
|
||||||
println!("get_actor_state {:?}", r);
|
println!("get_actor_state {r:?}");
|
||||||
Json(MyResponse { available: true })
|
Json(MyResponse { available: true })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ impl AppCallback for AppCallbackService {
|
||||||
let name = &r.name;
|
let name = &r.name;
|
||||||
let data = &r.data;
|
let data = &r.data;
|
||||||
|
|
||||||
let message = String::from_utf8_lossy(&data);
|
let message = String::from_utf8_lossy(data);
|
||||||
println!("Binding Name: {}", &name);
|
println!("Binding Name: {}", &name);
|
||||||
println!("Message: {}", &message);
|
println!("Message: {}", &message);
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
let callback_service = AppCallbackService::default();
|
let callback_service = AppCallbackService::default();
|
||||||
|
|
||||||
println!("AppCallback server listening on: {}", addr);
|
println!("AppCallback server listening on: {addr}");
|
||||||
|
|
||||||
// Create a gRPC server with the callback_service.
|
// Create a gRPC server with the callback_service.
|
||||||
Server::builder()
|
Server::builder()
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use std::{collections::HashMap, thread, time::Duration};
|
use std::{collections::HashMap, time::Duration};
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// TODO: Handle this issue in the sdk
|
// TODO: Handle this issue in the sdk
|
||||||
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
||||||
thread::sleep(Duration::from_secs(2));
|
tokio::time::sleep(Duration::from_secs(2)).await;
|
||||||
|
|
||||||
// Get the Dapr port and create a connection
|
// Get the Dapr port and create a connection
|
||||||
let addr = "https://127.0.0.1".to_string();
|
let addr = "https://127.0.0.1".to_string();
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// TODO: Handle this issue in the sdk
|
// TODO: Handle this issue in the sdk
|
||||||
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
||||||
std::thread::sleep(std::time::Duration::new(2, 0));
|
tokio::time::sleep(std::time::Duration::new(2, 0)).await;
|
||||||
|
|
||||||
// Set the Dapr address
|
// Set the Dapr address
|
||||||
let addr = "https://127.0.0.1".to_string();
|
let addr = "https://127.0.0.1".to_string();
|
||||||
|
@ -17,7 +17,9 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let store_name = String::from("statestore");
|
let store_name = String::from("statestore");
|
||||||
|
|
||||||
// save key-value pair in the state store
|
// save key-value pair in the state store
|
||||||
client.save_state(store_name, vec![(key, val)]).await?;
|
client
|
||||||
|
.save_state(store_name, key, val, None, None, None)
|
||||||
|
.await?;
|
||||||
|
|
||||||
println!("Successfully saved!");
|
println!("Successfully saved!");
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ type DaprClient = dapr::Client<dapr::client::TonicClient>;
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// TODO: Handle this issue in the sdk
|
// TODO: Handle this issue in the sdk
|
||||||
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
||||||
std::thread::sleep(std::time::Duration::new(2, 0));
|
tokio::time::sleep(std::time::Duration::new(2, 0)).await;
|
||||||
|
|
||||||
// Set the Dapr address
|
// Set the Dapr address
|
||||||
let addr = "https://127.0.0.1".to_string();
|
let addr = "https://127.0.0.1".to_string();
|
||||||
|
@ -19,14 +19,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
// get key-value pair in the state store
|
// get key-value pair in the state store
|
||||||
let response = client
|
let response = client
|
||||||
.get_configuration(CONFIGSTORE_NAME, vec![(&key)], None)
|
.get_configuration(CONFIGSTORE_NAME, vec![&key], None)
|
||||||
.await?;
|
.await?;
|
||||||
let val = response.items.get("hello").unwrap();
|
let val = response.items.get("hello").unwrap();
|
||||||
println!("Configuration value: {val:?}");
|
println!("Configuration value: {val:?}");
|
||||||
|
|
||||||
// Subscribe for configuration changes
|
// Subscribe for configuration changes
|
||||||
let mut stream = client
|
let mut stream = client
|
||||||
.subscribe_configuration(CONFIGSTORE_NAME, vec![(&key)], None)
|
.subscribe_configuration(CONFIGSTORE_NAME, vec![&key], None)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut subscription_id = String::new();
|
let mut subscription_id = String::new();
|
||||||
|
@ -52,7 +52,7 @@ async fn unsubscribe(client: &mut DaprClient, subscription_id: &str) {
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(_) => println!("App unsubscribed from config changes"),
|
Ok(_) => println!("App unsubscribed from config changes"),
|
||||||
Err(e) => println!("Error unsubscribing from config updates: {}", e),
|
Err(e) => println!("Error unsubscribing from config updates: {e}"),
|
||||||
}
|
}
|
||||||
std::process::exit(0);
|
std::process::exit(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
# Dapr Conversation Example with the Rust-SDK
|
||||||
|
|
||||||
|
This example uses the echo component to send a request and the component response will be the exact message received.
|
||||||
|
|
||||||
|
## Step
|
||||||
|
|
||||||
|
### Prepare
|
||||||
|
|
||||||
|
- Dapr installed
|
||||||
|
|
||||||
|
### Run Conversation Example
|
||||||
|
|
||||||
|
1. To run the example we need to first build the examples using the following command:
|
||||||
|
|
||||||
|
<!-- STEP
|
||||||
|
name: Build
|
||||||
|
background: false
|
||||||
|
sleep: 30
|
||||||
|
timeout: 60
|
||||||
|
-->
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo build --examples
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END_STEP -->
|
||||||
|
|
||||||
|
2. Run the example using the Dapr CLI
|
||||||
|
|
||||||
|
<!-- STEP
|
||||||
|
name: Run Conversation
|
||||||
|
output_match_mode: substring
|
||||||
|
expected_stdout_lines:
|
||||||
|
- 'conversation input: "hello world"'
|
||||||
|
- 'conversation output: "hello world"'
|
||||||
|
|
||||||
|
background: true
|
||||||
|
sleep: 15
|
||||||
|
timeout_seconds: 30
|
||||||
|
-->
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dapr run --app-id=conversation --resources-path ./config --dapr-grpc-port 3500 -- cargo run --example conversation
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- END_STEP -->
|
||||||
|
|
||||||
|
## Result
|
||||||
|
|
||||||
|
```
|
||||||
|
- 'conversation input: hello world'
|
||||||
|
- 'conversation output: hello world'
|
||||||
|
```
|
|
@ -0,0 +1,7 @@
|
||||||
|
apiVersion: dapr.io/v1alpha1
|
||||||
|
kind: Component
|
||||||
|
metadata:
|
||||||
|
name: echo
|
||||||
|
spec:
|
||||||
|
type: conversation.echo
|
||||||
|
version: v1
|
|
@ -0,0 +1,30 @@
|
||||||
|
use dapr::client::{ConversationInputBuilder, ConversationRequestBuilder};
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
type DaprClient = dapr::Client<dapr::client::TonicClient>;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
// Sleep to allow for the server to become available
|
||||||
|
tokio::time::sleep(Duration::from_secs(5)).await;
|
||||||
|
|
||||||
|
// Set the Dapr address
|
||||||
|
let address = "https://127.0.0.1".to_string();
|
||||||
|
let port = "3500".to_string();
|
||||||
|
|
||||||
|
let mut client = DaprClient::connect_with_port(address, port).await?;
|
||||||
|
|
||||||
|
let input = ConversationInputBuilder::new("hello world").build();
|
||||||
|
|
||||||
|
let conversation_component = "echo";
|
||||||
|
|
||||||
|
let request =
|
||||||
|
ConversationRequestBuilder::new(conversation_component, vec![input.clone()]).build();
|
||||||
|
|
||||||
|
println!("conversation input: {:?}", input.content);
|
||||||
|
|
||||||
|
let response = client.converse_alpha1(request).await?;
|
||||||
|
|
||||||
|
println!("conversation output: {:?}", response.outputs[0].result);
|
||||||
|
Ok(())
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
use std::{thread, time::Duration};
|
use std::time::Duration;
|
||||||
|
|
||||||
use hello_world::{greeter_client::GreeterClient, HelloRequest};
|
use hello_world::{greeter_client::GreeterClient, HelloRequest};
|
||||||
|
|
||||||
|
@ -11,11 +11,11 @@ pub mod hello_world {
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// Sleep to allow for the server to become available
|
// Sleep to allow for the server to become available
|
||||||
thread::sleep(Duration::from_secs(5));
|
tokio::time::sleep(Duration::from_secs(5)).await;
|
||||||
|
|
||||||
// Get the Dapr port and create a connection
|
// Get the Dapr port and create a connection
|
||||||
let port: u16 = std::env::var("DAPR_GRPC_PORT").unwrap().parse().unwrap();
|
let port: u16 = std::env::var("DAPR_GRPC_PORT").unwrap().parse().unwrap();
|
||||||
let address = format!("https://127.0.0.1:{}", port);
|
let address = format!("https://127.0.0.1:{port}");
|
||||||
|
|
||||||
let mut client = GreeterClient::connect(address).await?;
|
let mut client = GreeterClient::connect(address).await?;
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let response = client.say_hello(request).await.unwrap();
|
let response = client.say_hello(request).await.unwrap();
|
||||||
let hello_reply = response.into_inner();
|
let hello_reply = response.into_inner();
|
||||||
|
|
||||||
println!("Response: {:#?}", hello_reply);
|
println!("Response: {hello_reply:#?}");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
let greeter_service = GreeterService::default();
|
let greeter_service = GreeterService::default();
|
||||||
|
|
||||||
println!("AppCallback server listening on: {}", server_address);
|
println!("AppCallback server listening on: {server_address}");
|
||||||
// Create a gRPC server with the callback_service.
|
// Create a gRPC server with the callback_service.
|
||||||
Server::builder()
|
Server::builder()
|
||||||
.add_service(GreeterServer::new(greeter_service))
|
.add_service(GreeterServer::new(greeter_service))
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::hello_world::HelloReply;
|
use crate::hello_world::HelloReply;
|
||||||
use std::{thread, time::Duration};
|
use std::time::Duration;
|
||||||
|
|
||||||
use prost::Message;
|
use prost::Message;
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ type DaprClient = dapr::Client<dapr::client::TonicClient>;
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// Sleep to allow for the server to become available
|
// Sleep to allow for the server to become available
|
||||||
thread::sleep(Duration::from_secs(5));
|
tokio::time::sleep(Duration::from_secs(5)).await;
|
||||||
|
|
||||||
// Set the Dapr address
|
// Set the Dapr address
|
||||||
let address = "https://127.0.0.1".to_string();
|
let address = "https://127.0.0.1".to_string();
|
||||||
|
@ -39,7 +39,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
println!("Message: {:#?}", &resp.message);
|
println!("Message: {:#?}", &resp.message);
|
||||||
};
|
};
|
||||||
|
|
||||||
println!("Response: {:#?}", response);
|
println!("Response: {response:#?}");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
let callback_service = AppCallbackService {};
|
let callback_service = AppCallbackService {};
|
||||||
|
|
||||||
println!("AppCallback server listening on: {}", server_address);
|
println!("AppCallback server listening on: {server_address}");
|
||||||
// Create a gRPC server with the callback_service.
|
// Create a gRPC server with the callback_service.
|
||||||
Server::builder()
|
Server::builder()
|
||||||
.add_service(AppCallbackServer::new(callback_service))
|
.add_service(AppCallbackServer::new(callback_service))
|
||||||
|
|
|
@ -44,7 +44,7 @@ async fn backup_job_handler(request: JobEventRequest) -> Result<JobEventResponse
|
||||||
// Deserialize the decoded value into a Backup struct
|
// Deserialize the decoded value into a Backup struct
|
||||||
let backup_val: Backup = serde_json::from_slice(&request.data.unwrap().value).unwrap();
|
let backup_val: Backup = serde_json::from_slice(&request.data.unwrap().value).unwrap();
|
||||||
|
|
||||||
println!("job received: {:?}", backup_val);
|
println!("job received: {backup_val:?}");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(JobEventResponse::default())
|
Ok(JobEventResponse::default())
|
||||||
|
@ -88,9 +88,9 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let client_addr = "https://127.0.0.1".to_string();
|
let client_addr = "https://127.0.0.1".to_string();
|
||||||
|
|
||||||
let port: u16 = std::env::var("DAPR_GRPC_PORT")?.parse()?;
|
let port: u16 = std::env::var("DAPR_GRPC_PORT")?.parse()?;
|
||||||
let address = format!("{}:{}", client_addr, port);
|
let address = format!("{client_addr}:{port}");
|
||||||
|
|
||||||
println!("attempting to create a dapr client: {}", address);
|
println!("attempting to create a dapr client: {address}");
|
||||||
|
|
||||||
// Create the client
|
// Create the client
|
||||||
let mut client = DaprClient::connect(client_addr).await?;
|
let mut client = DaprClient::connect(client_addr).await?;
|
||||||
|
@ -127,7 +127,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let get_resp_backup: Backup =
|
let get_resp_backup: Backup =
|
||||||
serde_json::from_slice(&get_resp.clone().job.unwrap().data.unwrap().value).unwrap();
|
serde_json::from_slice(&get_resp.clone().job.unwrap().data.unwrap().value).unwrap();
|
||||||
|
|
||||||
println!("job retrieved: {:?}", get_resp_backup);
|
println!("job retrieved: {get_resp_backup:?}");
|
||||||
|
|
||||||
let _delete_resp = client.delete_job_alpha1("prod-db-backup").await?;
|
let _delete_resp = client.delete_job_alpha1("prod-db-backup").await?;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::{collections::HashMap, thread, time::Duration};
|
use std::{collections::HashMap, time::Duration};
|
||||||
|
|
||||||
use tokio::time;
|
use tokio::time;
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ struct Refund {
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// TODO: Handle this issue in the sdk
|
// TODO: Handle this issue in the sdk
|
||||||
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
||||||
thread::sleep(Duration::from_secs(2));
|
tokio::time::sleep(Duration::from_secs(2)).await;
|
||||||
|
|
||||||
// Set address for Dapr connection
|
// Set address for Dapr connection
|
||||||
let addr = "https://127.0.0.1".to_string();
|
let addr = "https://127.0.0.1".to_string();
|
||||||
|
@ -45,7 +45,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
for count in 0..10 {
|
for count in 0..10 {
|
||||||
let order = Order {
|
let order = Order {
|
||||||
order_number: count,
|
order_number: count,
|
||||||
order_details: format!("Count is {}", count),
|
order_details: format!("Count is {count}"),
|
||||||
};
|
};
|
||||||
// message metadata
|
// message metadata
|
||||||
let mut metadata = HashMap::<String, String>::new();
|
let mut metadata = HashMap::<String, String>::new();
|
||||||
|
|
|
@ -18,12 +18,12 @@ struct Refund {
|
||||||
|
|
||||||
#[topic(pub_sub_name = "pubsub", topic = "A")]
|
#[topic(pub_sub_name = "pubsub", topic = "A")]
|
||||||
async fn handle_a_event(order: Order) {
|
async fn handle_a_event(order: Order) {
|
||||||
println!("Topic A - {:#?}", order)
|
println!("Topic A - {order:#?}")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[topic(pub_sub_name = "pubsub", topic = "B")]
|
#[topic(pub_sub_name = "pubsub", topic = "B")]
|
||||||
async fn handle_b_event(refund: Refund) {
|
async fn handle_b_event(refund: Refund) {
|
||||||
println!("Topic B - {:#?}", refund)
|
println!("Topic B - {refund:#?}")
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -36,7 +36,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
callback_service.add_handler(HandleBEvent.get_handler());
|
callback_service.add_handler(HandleBEvent.get_handler());
|
||||||
|
|
||||||
println!("AppCallback server listening on: {}", addr);
|
println!("AppCallback server listening on: {addr}");
|
||||||
|
|
||||||
// Create a gRPC server with the callback_service.
|
// Create a gRPC server with the callback_service.
|
||||||
Server::builder()
|
Server::builder()
|
||||||
|
|
|
@ -3,7 +3,7 @@ use serde_json::json;
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
||||||
std::thread::sleep(std::time::Duration::new(5, 0));
|
tokio::time::sleep(std::time::Duration::new(5, 0)).await;
|
||||||
|
|
||||||
// Set the Dapr address and create a connection
|
// Set the Dapr address and create a connection
|
||||||
let addr = "https://127.0.0.1".to_string();
|
let addr = "https://127.0.0.1".to_string();
|
||||||
|
@ -29,7 +29,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
{
|
{
|
||||||
Ok(response) => response.results,
|
Ok(response) => response.results,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("Error: {:?}", e);
|
println!("Error: {e:?}");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -43,7 +43,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
"value": value
|
"value": value
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
println!("Query results: {:?}", results);
|
println!("Query results: {results:?}");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ use serde_json::json;
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
// Introduce delay so that dapr grpc port is assigned before app tries to connect
|
||||||
std::thread::sleep(std::time::Duration::new(5, 0));
|
tokio::time::sleep(std::time::Duration::new(5, 0)).await;
|
||||||
|
|
||||||
// Set the Dapr address and create a connection
|
// Set the Dapr address and create a connection
|
||||||
let addr = "https://127.0.0.1".to_string();
|
let addr = "https://127.0.0.1".to_string();
|
||||||
|
@ -23,7 +23,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
{
|
{
|
||||||
Ok(response) => response.results,
|
Ok(response) => response.results,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("Error: {:?}", e);
|
println!("Error: {e:?}");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -37,7 +37,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
"value": value
|
"value": value
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
println!("Query results: {:?}", results);
|
println!("Query results: {results:?}");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,16 +51,16 @@ fn proto_gen(
|
||||||
.map(|path| format!("{}/{}", root_dir.to_str().unwrap(), path))
|
.map(|path| format!("{}/{}", root_dir.to_str().unwrap(), path))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
println!("included {:?}", include_dirs);
|
println!("included {include_dirs:?}");
|
||||||
|
|
||||||
let interface = interface
|
let interface = interface
|
||||||
.iter()
|
.iter()
|
||||||
.map(|path| format!("{}/{}", root_dir.to_str().unwrap(), path))
|
.map(|path| format!("{}/{}", root_dir.to_str().unwrap(), path))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
println!("interface {:?}", interface);
|
println!("interface {interface:?}");
|
||||||
|
|
||||||
let out_dir = root_dir.join(out_dir);
|
let out_dir = root_dir.join(out_dir);
|
||||||
println!("outdir {:?}", out_dir);
|
println!("outdir {out_dir:?}");
|
||||||
|
|
||||||
tonic_build::configure()
|
tonic_build::configure()
|
||||||
.build_client(build_client)
|
.build_client(build_client)
|
||||||
|
|
|
@ -151,25 +151,39 @@ service Dapr {
|
||||||
rpc SubtleVerifyAlpha1(SubtleVerifyRequest) returns (SubtleVerifyResponse);
|
rpc SubtleVerifyAlpha1(SubtleVerifyRequest) returns (SubtleVerifyResponse);
|
||||||
|
|
||||||
// Starts a new instance of a workflow
|
// Starts a new instance of a workflow
|
||||||
rpc StartWorkflowAlpha1 (StartWorkflowRequest) returns (StartWorkflowResponse) {}
|
rpc StartWorkflowAlpha1 (StartWorkflowRequest) returns (StartWorkflowResponse) {
|
||||||
|
option deprecated = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Gets details about a started workflow instance
|
// Gets details about a started workflow instance
|
||||||
rpc GetWorkflowAlpha1 (GetWorkflowRequest) returns (GetWorkflowResponse) {}
|
rpc GetWorkflowAlpha1 (GetWorkflowRequest) returns (GetWorkflowResponse) {
|
||||||
|
option deprecated = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Purge Workflow
|
// Purge Workflow
|
||||||
rpc PurgeWorkflowAlpha1 (PurgeWorkflowRequest) returns (google.protobuf.Empty) {}
|
rpc PurgeWorkflowAlpha1 (PurgeWorkflowRequest) returns (google.protobuf.Empty) {
|
||||||
|
option deprecated = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Terminates a running workflow instance
|
// Terminates a running workflow instance
|
||||||
rpc TerminateWorkflowAlpha1 (TerminateWorkflowRequest) returns (google.protobuf.Empty) {}
|
rpc TerminateWorkflowAlpha1 (TerminateWorkflowRequest) returns (google.protobuf.Empty) {
|
||||||
|
option deprecated = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Pauses a running workflow instance
|
// Pauses a running workflow instance
|
||||||
rpc PauseWorkflowAlpha1 (PauseWorkflowRequest) returns (google.protobuf.Empty) {}
|
rpc PauseWorkflowAlpha1 (PauseWorkflowRequest) returns (google.protobuf.Empty) {
|
||||||
|
option deprecated = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Resumes a paused workflow instance
|
// Resumes a paused workflow instance
|
||||||
rpc ResumeWorkflowAlpha1 (ResumeWorkflowRequest) returns (google.protobuf.Empty) {}
|
rpc ResumeWorkflowAlpha1 (ResumeWorkflowRequest) returns (google.protobuf.Empty) {
|
||||||
|
option deprecated = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Raise an event to a running workflow instance
|
// Raise an event to a running workflow instance
|
||||||
rpc RaiseEventWorkflowAlpha1 (RaiseEventWorkflowRequest) returns (google.protobuf.Empty) {}
|
rpc RaiseEventWorkflowAlpha1 (RaiseEventWorkflowRequest) returns (google.protobuf.Empty) {
|
||||||
|
option deprecated = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Starts a new instance of a workflow
|
// Starts a new instance of a workflow
|
||||||
rpc StartWorkflowBeta1 (StartWorkflowRequest) returns (StartWorkflowResponse) {}
|
rpc StartWorkflowBeta1 (StartWorkflowRequest) returns (StartWorkflowResponse) {}
|
||||||
|
@ -191,6 +205,7 @@ service Dapr {
|
||||||
|
|
||||||
// Raise an event to a running workflow instance
|
// Raise an event to a running workflow instance
|
||||||
rpc RaiseEventWorkflowBeta1 (RaiseEventWorkflowRequest) returns (google.protobuf.Empty) {}
|
rpc RaiseEventWorkflowBeta1 (RaiseEventWorkflowRequest) returns (google.protobuf.Empty) {}
|
||||||
|
|
||||||
// Shutdown the sidecar
|
// Shutdown the sidecar
|
||||||
rpc Shutdown (ShutdownRequest) returns (google.protobuf.Empty) {}
|
rpc Shutdown (ShutdownRequest) returns (google.protobuf.Empty) {}
|
||||||
|
|
||||||
|
@ -202,6 +217,9 @@ service Dapr {
|
||||||
|
|
||||||
// Delete a job
|
// Delete a job
|
||||||
rpc DeleteJobAlpha1(DeleteJobRequest) returns (DeleteJobResponse) {}
|
rpc DeleteJobAlpha1(DeleteJobRequest) returns (DeleteJobResponse) {}
|
||||||
|
|
||||||
|
// Converse with a LLM service
|
||||||
|
rpc ConverseAlpha1(ConversationRequest) returns (ConversationResponse) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
// InvokeServiceRequest represents the request message for Service invocation.
|
// InvokeServiceRequest represents the request message for Service invocation.
|
||||||
|
@ -676,7 +694,14 @@ message GetMetadataResponse {
|
||||||
string runtime_version = 8 [json_name = "runtimeVersion"];
|
string runtime_version = 8 [json_name = "runtimeVersion"];
|
||||||
repeated string enabled_features = 9 [json_name = "enabledFeatures"];
|
repeated string enabled_features = 9 [json_name = "enabledFeatures"];
|
||||||
ActorRuntime actor_runtime = 10 [json_name = "actorRuntime"];
|
ActorRuntime actor_runtime = 10 [json_name = "actorRuntime"];
|
||||||
//TODO: Cassie: probably add scheduler runtime status
|
optional MetadataScheduler scheduler = 11 [json_name = "scheduler"];
|
||||||
|
}
|
||||||
|
|
||||||
|
// MetadataScheduler is a message that contains the list of addresses of the
|
||||||
|
// scheduler connections.
|
||||||
|
message MetadataScheduler {
|
||||||
|
// connected_addresses the list of addresses of the scheduler connections.
|
||||||
|
repeated string connected_addresses = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ActorRuntime {
|
message ActorRuntime {
|
||||||
|
@ -1206,20 +1231,20 @@ message Job {
|
||||||
//
|
//
|
||||||
// Systemd timer style cron accepts 6 fields:
|
// Systemd timer style cron accepts 6 fields:
|
||||||
// seconds | minutes | hours | day of month | month | day of week
|
// seconds | minutes | hours | day of month | month | day of week
|
||||||
// 0-59 | 0-59 | 0-23 | 1-31 | 1-12/jan-dec | 0-7/sun-sat
|
// 0-59 | 0-59 | 0-23 | 1-31 | 1-12/jan-dec | 0-6/sun-sat
|
||||||
//
|
//
|
||||||
// "0 30 * * * *" - every hour on the half hour
|
// "0 30 * * * *" - every hour on the half hour
|
||||||
// "0 15 3 * * *" - every day at 03:15
|
// "0 15 3 * * *" - every day at 03:15
|
||||||
//
|
//
|
||||||
// Period string expressions:
|
// Period string expressions:
|
||||||
// Entry | Description | Equivalent To
|
// Entry | Description | Equivalent To
|
||||||
// ----- | ----------- | -------------
|
// ----- | ----------- | -------------
|
||||||
// @every `<duration>` | Run every `<duration>` (e.g. '@every 1h30m') | N/A
|
// @every `<duration>` | Run every `<duration>` (e.g. '@every 1h30m') | N/A
|
||||||
// @yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 0 1 1 *
|
// @yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 0 1 1 *
|
||||||
// @monthly | Run once a month, midnight, first of month | 0 0 0 1 * *
|
// @monthly | Run once a month, midnight, first of month | 0 0 0 1 * *
|
||||||
// @weekly | Run once a week, midnight on Sunday | 0 0 0 * * 0
|
// @weekly | Run once a week, midnight on Sunday | 0 0 0 * * 0
|
||||||
// @daily (or @midnight) | Run once a day, midnight | 0 0 0 * * *
|
// @daily (or @midnight) | Run once a day, midnight | 0 0 0 * * *
|
||||||
// @hourly | Run once an hour, beginning of hour | 0 0 * * * *
|
// @hourly | Run once an hour, beginning of hour | 0 0 * * * *
|
||||||
optional string schedule = 2 [json_name = "schedule"];
|
optional string schedule = 2 [json_name = "schedule"];
|
||||||
|
|
||||||
// repeats is the optional number of times in which the job should be
|
// repeats is the optional number of times in which the job should be
|
||||||
|
@ -1275,3 +1300,55 @@ message DeleteJobRequest {
|
||||||
message DeleteJobResponse {
|
message DeleteJobResponse {
|
||||||
// Empty
|
// Empty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConversationRequest is the request object for Conversation.
|
||||||
|
message ConversationRequest {
|
||||||
|
// The name of Conversation component
|
||||||
|
string name = 1;
|
||||||
|
|
||||||
|
// The ID of an existing chat (like in ChatGPT)
|
||||||
|
optional string contextID = 2;
|
||||||
|
|
||||||
|
// Inputs for the conversation, support multiple input in one time.
|
||||||
|
repeated ConversationInput inputs = 3;
|
||||||
|
|
||||||
|
// Parameters for all custom fields.
|
||||||
|
map<string, google.protobuf.Any> parameters = 4;
|
||||||
|
|
||||||
|
// The metadata passing to conversation components.
|
||||||
|
map<string, string> metadata = 5;
|
||||||
|
|
||||||
|
// Scrub PII data that comes back from the LLM
|
||||||
|
optional bool scrubPII = 6;
|
||||||
|
|
||||||
|
// Temperature for the LLM to optimize for creativity or predictability
|
||||||
|
optional double temperature = 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ConversationInput {
|
||||||
|
// The content to send to the llm
|
||||||
|
string content = 1;
|
||||||
|
|
||||||
|
// The role to set for the message
|
||||||
|
optional string role = 2;
|
||||||
|
|
||||||
|
// Scrub PII data that goes into the LLM
|
||||||
|
optional bool scrubPII = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConversationResult is the result for one input.
|
||||||
|
message ConversationResult {
|
||||||
|
// Result for the one conversation input.
|
||||||
|
string result = 1;
|
||||||
|
// Parameters for all custom fields.
|
||||||
|
map<string, google.protobuf.Any> parameters = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConversationResponse is the response for Conversation.
|
||||||
|
message ConversationResponse {
|
||||||
|
// The ID of an existing chat (like in ChatGPT)
|
||||||
|
optional string contextID = 1;
|
||||||
|
|
||||||
|
// An array of results.
|
||||||
|
repeated ConversationResult outputs = 2;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue