circles/examples/ourworld/README.md
2025-06-19 05:17:14 +03:00

69 lines
4.1 KiB
Markdown

# OurWorld Example
This directory contains a complete example demonstrating a simulated "OurWorld" network, consisting of multiple interconnected "circles" (nodes). Each circle runs its own WebSocket server and a Rhai script worker, all managed by a central launcher.
This example is designed to showcase:
1. **Multi-Circle Configuration**: How to define and configure multiple circles in a single `circles.json` file.
2. **Programmatic Launching**: How to use the `launcher` library to start, manage, and monitor these circles from within a Rust application.
3. **Dynamic Key Generation**: The launcher generates unique cryptographic keypairs for each circle upon startup.
4. **Output Generation**: How to use the `--output` functionality to get a JSON file containing the connection details (public keys, WebSocket URLs, etc.) for each running circle.
5. **Graceful Shutdown**: How the launcher handles a `Ctrl+C` signal to shut down all running circles cleanly.
## Directory Contents
- `circles.json`: The main configuration file that defines the 7 circles in the OurWorld network, including their names, ports, and associated Rhai scripts.
- `scripts/`: This directory contains the individual Rhai scripts that define the behavior of each circle.
- `ourworld_output.json` (Generated): This file is created after running the example and contains the runtime details of each circle.
## How to Run the Example
There are two ways to run this example, each demonstrating a different way to use the launcher.
### 1. As a Root Example (Recommended)
This method runs the launcher programmatically from the root of the workspace and is the simplest way to see the system in action. It uses the `examples/ourworld.rs` file.
```sh
# From the root of the workspace
cargo run --example ourworld
```
### 2. As a Crate-Level Example
This method runs a similar launcher, but as an example *within* the `launcher` crate itself. It uses the `src/launcher/examples/ourworld/main.rs` file. This is useful for testing the launcher in a more isolated context.
```sh
# Navigate to the launcher's crate directory
cd src/launcher
# Run the 'ourworld' example using cargo
cargo run --example ourworld
```
### 3. Using the Launcher Binary
This method uses the main `launcher` binary to run the configuration, which is useful for testing the command-line interface.
```sh
# From the root of the workspace
cargo run -p launcher -- --config examples/ourworld/circles.json --output examples/ourworld/ourworld_output.json
```
## What to Expect
When you run the example, you will see log output indicating that the launcher is starting up, followed by a table summarizing the running circles:
```
+-----------------+------------------------------------------------------------------+------------------------------------------+-----------------------+
| Name | Public Key | Worker Queue | WS URL |
+=================+==================================================================+==========================================+=======================+
| OurWorld | 02... | rhai_tasks:02... | ws://127.0.0.1:9000/ws|
+-----------------+------------------------------------------------------------------+------------------------------------------+-----------------------+
| Dunia Cybercity | 03... | rhai_tasks:03... | ws://127.0.0.1:9001/ws|
+-----------------+------------------------------------------------------------------+------------------------------------------+-----------------------+
| ... (and so on for all 7 circles) |
+-----------------+------------------------------------------------------------------+------------------------------------------+-----------------------+
```
The launcher will then wait for you to press `Ctrl+C` to initiate a graceful shutdown of all services.