Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/geofmureithi/cmdpiped
A command-line tool for exposing a wrapped program's standard IO using WebSockets/SSE
https://github.com/geofmureithi/cmdpiped
actix-web daemon sse websocket
Last synced: about 1 month ago
JSON representation
A command-line tool for exposing a wrapped program's standard IO using WebSockets/SSE
- Host: GitHub
- URL: https://github.com/geofmureithi/cmdpiped
- Owner: geofmureithi
- Created: 2022-07-24T00:09:14.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-10-05T11:00:21.000Z (4 months ago)
- Last Synced: 2024-12-10T06:47:54.903Z (2 months ago)
- Topics: actix-web, daemon, sse, websocket
- Language: Rust
- Homepage:
- Size: 155 KB
- Stars: 13
- Watchers: 3
- Forks: 0
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# cmdpiped
`cmdpiped` is a command-line tool for exposing a wrapped cli program's standard IO to WebSockets/SSE
## Installation
Ready to use Binaries are available at the releases page.
For Rust users, you can always use cargo
```
cargo install cmdpiped
```## Usage
```
USAGE:
cmdpiped [OPTIONS] --mode [SUBCOMMAND]OPTIONS:
-h, --host Host address to bind [default: 127.0.0.1]
--help Print help information
-m, --mode Mode to expose events [possible values: ws, sse]
-p, --port Port to bind [default: 9000]
--path Url path to setup [default: /events]
--serve Optional folder path to serve static files
-V, --version Print version information
```You can also use piping
```
$ node ./index.js | cmdpiped -m sse
```## Examples
### Some Basic Examples
`cmdpiped` is language agnostic and should be able to plugin easily for anything that can run on the command line.
Python
```py
from sys import stdout
from time import sleep# Count to 100 sleeping every second
for count in range(0, 100):
print(count + 1)
stdout.flush()
sleep(1)
```Save the file as `counter.py` and run the `cmdpiped`
```
$ cmdpiped -m sse python3 ./counter.py
```Node.js
```js
let count = 0;setInterval(() => {
console.log(count++);
}, 1000);
```Save the file as `index.js` and run the `cmdpiped`
```
$ cmdpiped -m sse node ./index.js
```Bash
```sh
#!/bin/bash# Count from 1 to 100 with a sleep of 1 second
for ((COUNT = 1; COUNT <= 100; COUNT++)); do
echo $COUNT
sleep 1
done
```Save the file as `script.sh` and run the `cmdpiped`
```
$ chmod +x ./script.sh
$ cmdpiped -m sse ./script.sh
```You should be able to get:
```
[2022-07-24T13:41:11Z TRACE actix_server::worker] Service "actix-web-service-127.0.0.1:9000" is available
[2022-07-24T13:41:11Z TRACE cmdpiped::broadcaster] Send: "data: 1\n\n"
[2022-07-24T13:41:11Z TRACE cmdpiped::broadcaster] Send: "data: 2\n\n"
[2022-07-24T13:41:12Z TRACE cmdpiped::broadcaster] Send: "data: 3\n\n"
[2022-07-24T13:41:13Z TRACE cmdpiped::broadcaster] Send: "data: 4\n\n"
...
```### Advanced Example
Using the above example, we can add some frontend code
1. Create a folder called `static`.
2. Add an `index.html` file:```html
var source = new EventSource("http://localhost:9000/events");
source.onmessage = function (event) {
var content = document.getElementById("content");
content.innerHTML = content.innerHTML + event.data + "<br/>";
};
```
Run `cmdpiped` exposing a directory
```
$ cmdpiped -m sse --serve ./static
```### A complete example
A complete example is available in the [examples](./examples/monitor/)
![Complete Example](./examples/monitor/Screenshot.png)
## Roadmap
- [x] SSE Streaming
- [x] Websocket Server -> Client
- [ ] Websocket Client -> Server## Versioning
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/geofmureithi/cmdpiped/tags).
## Authors
- **Njuguna Mureithi** - _Initial work_ - [Njuguna Mureithi](https://github.com/geofmureithi)
See also the list of [contributors](https://github.com/geofmureithi/cmdpiped/contributors) who participated in this project.
## License
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details