# Events _Path: en/lua/core/events_ ## Table of Contents - Event Bus ## Content # Event Bus Publish and subscribe to events across your application for event-driven architectures. ## Loading ```lua local events = require("events") ``` ## Subscribing to Events Subscribe to events from the event bus: ```lua -- Subscribe to all order events local sub, err = events.subscribe("orders.*") if err then return nil, err end -- Subscribe to specific event kind local sub = events.subscribe("users", "user.created") -- Subscribe to all events from a system local sub = events.subscribe("payments") -- Process events local ch = sub:channel() while true do local evt, ok = ch:receive() if not ok then break end logger:info("Received event", { system = evt.system, kind = evt.kind, path = evt.path }) handle_event(evt) end ``` | Parameter | Type | Description | |-----------|------|-------------| | `system` | string | System pattern (supports wildcards like "test.*") | | `kind` | string | Event kind filter (optional) | **Returns:** `Subscription, error` ## Sending Events Send an event to the event bus: ```lua -- Send order created event local ok, err = events.send("orders", "order.created", "/orders/123", { order_id = "123", customer_id = "456", total = 99.99 }) if err then return nil, err end -- Send user event events.send("users", "user.registered", "/users/" .. user.id, { user_id = user.id, email = user.email, created_at = time.now():format("2006-01-02T15:04:05Z07:00") }) -- Send payment event events.send("payments", "payment.completed", "/payments/" .. payment.id, { payment_id = payment.id, order_id = payment.order_id, amount = payment.amount, method = payment.method }) -- Send without data events.send("system", "heartbeat", "/health") ``` | Parameter | Type | Description | |-----------|------|-------------| | `system` | string | System identifier | | `kind` | string | Event kind/type | | `path` | string | Event path for routing | | `data` | any | Event payload (optional) | **Returns:** `boolean, error` ### Getting the Channel Get the channel for receiving events: ```lua local ch = sub:channel() local evt, ok = ch:receive() if ok then print("System:", evt.system) print("Kind:", evt.kind) print("Path:", evt.path) print("Data:", json.encode(evt.data)) end ``` Event fields: `system`, `kind`, `path`, `data` ### Closing Subscription Unsubscribe and close the channel: ```lua sub:close() ``` ## Permissions | Action | Resource | Description | |--------|----------|-------------| | `events.subscribe` | system | Subscribe to events from a system | | `events.send` | system | Send events to a system | ## Errors | Condition | Kind | Retryable | |-----------|------|-----------| | Empty system | `errors.INVALID` | no | | Empty kind | `errors.INVALID` | no | | Empty path | `errors.INVALID` | no | | Policy denied | `errors.INVALID` | no | See [Error Handling](lua/core/errors.md) for working with errors. ## Navigation Previous: Context (lua/core/context) Next: Registry (lua/core/registry)