When dropping the `DoraNode`, it waits for the remaining drop tokens. This only works if all the dora events were already dropped before. With the Python GC, this is not guaranteed as some events might still be live on the heap (the user might even use them later). In such cases, we waited until we ran into a timeout, which resulted in very long exit times (see https://github.com/dora-rs/dora/issues/598).
This commit fixes this issue by adding a reference-counted copy of the `DoraNode` and `EventStream` to every event given to Python. This way, we can ensure that the underlying `DoraNode` is only dropped after the last event reference has been freed.
The init function returns an error if another node exited before initialization. In this case, we consider the subsequent error as a cascading error and skip it when printing the error message to the user.
Allows us to mark certain node errors as cascading, which will deprioritize them when printed.
Also updates the error printing code to only print the error that happened first.
Log a warning instead and do a lossy conversion to String. This ensures that `stdout`/`stderr` stay open, which avoids a `SIGPIPE` exit of the node on the next println.
We plan to (soft-)remove operators and simplify the dataflow YAML file by removing the additional nesting caused by the `custom` field. This commit prepares for that. See #474 for context.
We are not interested in the local bind address of the daemon. Instead, we want to use the IP address under which the daemon is available from other machines.
This should also avoids the issue that connecting to 0.0.0.0 is not possible on Windows (we want to use 0.0.0.0 as default bind address).
This commit makes it possible to specify the conda env that we want to use in
a specific operator.
```yaml
- id: robot
operator:
python:
source: ../operators/robot.py
conda_env: robomaster
```
This will call:
```bash
conda run -n robomaster python -c "import dora; dora.start_runtime()"
```