| Crates.io | greentic-events |
| lib.rs | greentic-events |
| version | 0.4.6 |
| created_at | 2025-11-27 17:21:11.750087+00 |
| updated_at | 2025-12-31 10:49:55.702063+00 |
| description | Greentic event fabric core: publish/subscribe routing, reliability, ACLs, observability, and pack-driven provider/bridge discovery. |
| homepage | |
| repository | https://github.com/greentic-ai/greentic-events |
| max_upload_size | |
| id | 1954126 |
| size | 282,124 |
Multi-tenant event fabric core for Greentic. This crate wires the shared greentic-types::EventEnvelope to provider/bridge registries, retry/DLQ handling, and pack-driven discovery.
retryable_errors, DLQ publishing, idempotency via metadata idempotency_key.events.providers from pack v1; optional overrides via annotations:
events.providers.<name>.dlq_topicevents.providers.<name>.retry.max_retriesevents.providers.<name>.retry.base_delay_msevents.providers.<name>.retry.max_delay_msevents.providers.<name>.retry.strategy (fixed|exponential|exponential_with_jitter)events.providers.<name>.retry.retryable_errors (array of substrings)To plug into a runner client later, replace the in-memory factories with your client wrappers when constructing EventBusBuilder or the CLI (greentic-events-cli).
Optional overrides can be set in pack.yaml annotations:
events.providers.<name>.dlq_topicevents.providers.<name>.retry.max_retriesevents.providers.<name>.retry.base_delay_msevents.providers.<name>.retry.max_delay_msevents.providers.<name>.retry.strategy (fixed|exponential|exponential_with_jitter)events.providers.<name>.retry.retryable_errors (array of substrings)cargo run --bin greentic-events-cli -- --pack path/to/packcargo run --bin greentic-events-cli -- --config /path/to/config.toml --pack ...greentic-events-cli config show or greentic-events-cli config explain (add --json for JSON output)../scripts/inspect_pack.sh tests/fixtures/packs/events_fakeuse greentic_events::{EventBusBuilder, SubscriptionOptions};
use greentic_events::provider::EventProviderFactory;
use futures::StreamExt;
use serde_json::json;
use greentic_types::TenantCtx;
// Implement EventProviderFactory (or use runner-backed factories) and register from a pack:
let factory = MyProviderFactory::new();
let bus = EventBusBuilder::new()
.register_from_pack_dir(pack_path, &factory, None)
.await?
.build();
// Publish
bus.publish(event_envelope).await?;
// Subscribe
let mut handle = bus.subscribe("topic.*", tenant_ctx, SubscriptionOptions::default()).await?;
if let Some(event) = handle.next().await { /* ... */ }
If you just need a generic JSON payload on a string topic, use the helper that builds the envelope for you:
use greentic_events::{EventBusBuilder, SubscriptionOptions};
use greentic_events::provider::EventProviderFactory;
use serde_json::json;
use greentic_types::TenantCtx;
let tenant = TenantCtx::new("dev".try_into()?, "tenant-a".try_into()?);
let bus = EventBusBuilder::new()
// register providers directly or via `register_from_pack_dir(...)`
.register_provider(my_provider_registration)
.build();
bus.publish_event(&tenant, "greentic.repo.build.status", json!({
"status": "succeeded",
"build_id": "b-123",
}))
.await?;
let mut sub = bus
.subscribe_topic("greentic.repo.build.status", &tenant, SubscriptionOptions::default())
.await?;
if let Some(evt) = sub.next().await {
assert_eq!(evt.topic, "greentic.repo.build.status");
assert_eq!(evt.payload["status"], "succeeded");
}
subscribe_topic simply clones the provided tenant context for convenience; full subscribe remains available.
greentic.repo.build.statusgreentic.repo.publish.completedgreentic.repo.component.deprecatedgreentic.repo.component.recalled
These stay string-based only; greentic-events does not ship typed repo event enums.See docs/secrets-events.md for recommended secrets topic patterns and example payloads (redacted metadata only; no secret values).
greentic-events-providers is published as an OCI artifact at oci://ghcr.io/greentic-ai/greentic-events-providers:latest. Pull it with your OCI client (for example, oras pull ghcr.io/greentic-ai/greentic-events-providers:latest -o /tmp/greentic-events-providers) and point the CLI or your host at that directory:
oras pull ghcr.io/greentic-ai/greentic-events-providers:latest -o /tmp/greentic-events-providers
cargo run --bin greentic-events-cli -- --pack /tmp/greentic-events-providers
./scripts/pull_providers.sh [dest_dir] uses oras to fetch the pack locally for quick inspection. This lives at the scripting/CLI layer so the core crate remains transport-agnostic.See src/runner.rs for adapter structs you can back with the Greentic runner to construct providers or bridges from WIT components. These remain thin wrappers: you supply the invocation functions; no Wasm glue lives here. Pair them with the runner/deployer services to spin up providers declared in packs. The core library does not ship a runner/deployer client or pick a transport; hosts inject their own bindings.
cargo test (Rust 1.89). Fixtures live under tests/fixtures/packs. CI sets CLI_SMOKE=1 to ensure the CLI inspector keeps working.
ci/local_check.sh before pushing (fmt, clippy -D warnings, tests)..github/workflows/ci.yml runs the same checks..github/workflows/publish.yml is wired for crates.io publishing via CARGO_REGISTRY_TOKEN but currently skips because this crate is publish = false; flip that and remove the skip when ready to publish.