shared: add stream+consumer policy helpers; NATS context header builder aggregate/runner/projection: centralize stream validation and header usage; set bounded consumer params projection: add QueryService gRPC and wire into main; settings include PROJECTION_GRPC_ADDR gateway: gRPC routing to Projection/Runner with deadlines; bounded read-only retries; pooled gRPC channels (bounded LRU+TTL); admin proxy forwards to gRPC; probes use concurrency limiter + TTL cache runner: add RunnerAdmin gRPC server (drain, status, reload) and wire into main; settings include RUNNER_GRPC_ADDR tests: add gateway authz for runner admin, projection tenant isolation, runner admin drain semantics docs: update TRANSPORT_DEVELOPMENT_PLAN to reflect completed milestones and details
50 lines
1.5 KiB
Rust
50 lines
1.5 KiB
Rust
use async_nats::jetstream::{self, stream::Config as StreamConfig};
|
|
use runner::config::Settings;
|
|
use runner::stream::JetStreamClient;
|
|
use runner::types::{
|
|
CommandId, EffectName, EffectResultEnvelope, EffectResultType, MessageMetadata, TenantId,
|
|
};
|
|
use serde_json::json;
|
|
|
|
#[test]
|
|
#[ignore]
|
|
fn jetstream_connects_and_can_publish_effect_result() {
|
|
let Ok(nats_url) = std::env::var("RUNNER_TEST_NATS_URL") else {
|
|
return;
|
|
};
|
|
|
|
let rt = tokio::runtime::Runtime::new().unwrap();
|
|
rt.block_on(async move {
|
|
let client = async_nats::connect(&nats_url).await.unwrap();
|
|
let js = jetstream::new(client);
|
|
|
|
let _ = js
|
|
.get_or_create_stream(StreamConfig {
|
|
name: "AGGREGATE_EVENTS".to_string(),
|
|
subjects: vec!["tenant.*.aggregate.*.*".to_string()],
|
|
..Default::default()
|
|
})
|
|
.await
|
|
.unwrap();
|
|
|
|
let settings = Settings {
|
|
nats_url,
|
|
..Default::default()
|
|
};
|
|
|
|
let runner_js = JetStreamClient::connect(&settings).await.unwrap();
|
|
|
|
let result = EffectResultEnvelope {
|
|
tenant_id: TenantId::new("t1"),
|
|
command_id: CommandId::new("c1"),
|
|
effect_name: EffectName::new("noop"),
|
|
result_type: EffectResultType::Succeeded,
|
|
payload: json!({"ok": true}),
|
|
timestamp: chrono::Utc::now(),
|
|
metadata: MessageMetadata::default(),
|
|
};
|
|
|
|
runner_js.publish_effect_result(&result).await.unwrap();
|
|
});
|
|
}
|