Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(plugins): Plugin workers and strider #2449

Merged
merged 19 commits into from
May 16, 2023
Merged

Conversation

imsnif
Copy link
Member

@imsnif imsnif commented May 15, 2023

This PR implements plugin workers, allowing plugins to perform background tasks. This PR also includes a draft of a worker implementation for the Strider plugin (searching through files in the background) which will be fleshed out in an upcoming change before the next release.

Worker API

For Rust plugins, in zellij-tile we now provide a ZellijWorker trait. While this API might change a little bit before this feature is released in the next version, this is the general idea:

trait ZellijWorker<'de>: Default + Serialize + Deserialize<'de> {
    fn on_message(&mut self, message: String, payload: String) {}
}

The on_message function will be triggered whenever a message is sent to this worker from the main plugin. Both the message and payload arguments to the function are arbitrary String types, there to allow plugin authors to define their own serializable message types and payloads.

The trait itself requires whatever implements it to also be serializable/deserializable - this is to allow the worker to keep an internal state between runs. The state will be saved on the HD in a temporary folder and used to construct the worker on every run. It is thus advisable to be cognizant of the amount of data placed on the worker state for reasons of performance.

Registering Workers

For Rust plugins, registering workers can be done with the register_worker macro. This macro accepts a struct implementing the above ZellijWorker trait, as well as a namespaced name for the worker with _worker appended to the end. The latter is very important because this is how Zellij recognizes this exported function as a background worker. This namespace is also used to send messages to the worker, see below.

register_worker!(CoolWorker, cool_worker);

Sending messages to workers and back to the main plugin

For Rust plugins, messages can be sent to workers using the post_message_to method:

fn post_message_to(worker_name: &str, message: String, payload: String);

The worker_name argument is used to refer to the namespaced worker we included above. To send a message to the worker we defined above, we would use the cool argument (cool_worker minus the _worker part we use to indicate this is a worker when registering it).

Both message and payload are arbitrary Strings we can use to serialize/deserialize our own private messages. These will be sent as is to the on_message message of the worker.

When a worker wishes to send messages back to the plugin, it can do so using the post_message_to_plugin method:

fn post_message_to_plugin(message: String, payload: String);

This method is similar to post_message_to except it does not accept a worker_name and instead will send the message directly to the plugin. The message will arrive at the plugin's update method with an Event::CustomMessage(message, payload) update event. If you wish to use this functionality, it's important tha the plugin subscribe to these events using the subscribe method, just as it does to all other events.

@imsnif imsnif temporarily deployed to cachix May 15, 2023 15:04 — with GitHub Actions Inactive
@imsnif imsnif temporarily deployed to cachix May 15, 2023 15:51 — with GitHub Actions Inactive
@imsnif imsnif temporarily deployed to cachix May 15, 2023 15:54 — with GitHub Actions Inactive
@imsnif imsnif temporarily deployed to cachix May 15, 2023 22:46 — with GitHub Actions Inactive
@imsnif imsnif temporarily deployed to cachix May 16, 2023 07:51 — with GitHub Actions Inactive
@imsnif imsnif temporarily deployed to cachix May 16, 2023 09:10 — with GitHub Actions Inactive
@imsnif imsnif merged commit 5fe4d60 into main May 16, 2023
renovate bot added a commit to scottames/dots that referenced this pull request Jun 19, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [aquaproj/aqua-registry](https://togithub.com/aquaproj/aqua-registry)
| minor | `v4.19.0` -> `v4.20.0` |
| [zellij-org/zellij](https://togithub.com/zellij-org/zellij) | minor |
`v0.36.0` -> `v0.37.0` |

---

### Release Notes

<details>
<summary>aquaproj/aqua-registry</summary>

###
[`v4.20.0`](https://togithub.com/aquaproj/aqua-registry/releases/tag/v4.20.0)

[Compare
Source](https://togithub.com/aquaproj/aqua-registry/compare/v4.19.0...v4.20.0)


[Issues](https://togithub.com/aquaproj/aqua-registry/issues?q=is%3Aissue+milestone%3Av4.20.0)
| [Pull
Requests](https://togithub.com/aquaproj/aqua-registry/pulls?q=is%3Apr+milestone%3Av4.20.0)
| aquaproj/aqua-registry@v4.19.0...v4.20.0

#### 🎉 New Packages


[#&#8203;13132](https://togithub.com/aquaproj/aqua-registry/issues/13132)
[segmentio/golines](https://togithub.com/segmentio/golines): A golang
formatter that fixes long lines
[@&#8203;iwata](https://togithub.com/iwata)

#### Fixes


[#&#8203;13143](https://togithub.com/aquaproj/aqua-registry/issues/13143)
[terraform-linters/tflint](https://togithub.com/terraform-linters/tflint):
Support old versions

</details>

<details>
<summary>zellij-org/zellij</summary>

###
[`v0.37.0`](https://togithub.com/zellij-org/zellij/releases/tag/v0.37.0)

[Compare
Source](https://togithub.com/zellij-org/zellij/compare/v0.36.0...v0.37.0)

In this release we've done a lot of work on our WebAssembly / WASI
plugin system and are very excited to invite adventurous Rust developers
to come pioneer our plugin system with us. To read more, please see the
official [Plugin
Documentation](https://zellij.dev/documentation/plugins.html).

Please also drop by our Discord or Matrix and show us the plugins you're
working on!

#### Other Highlights

- Some basic themes are now included with the release, give it a try by
starting Zellij with `zellij options --theme catppuccin-mocha`
-   Layouts now support environment variables and tilde expansions
-   We can now provide a `--cwd` option when starting Zellij

#### All changes

- fix(plugin): respect hide session option on compact-bar by
[@&#8203;pedromfedricci](https://togithub.com/pedromfedricci) in
[zellij-org/zellij#2368
- feat: Add layout configuration to exclude panes from tab sync by
[@&#8203;on3iro](https://togithub.com/on3iro) in
[zellij-org/zellij#2314
- Fix 2205 - Support cwd by
[@&#8203;Kangaxx-0](https://togithub.com/Kangaxx-0) in
[zellij-org/zellij#2290
- feat(plugins): reload plugin at runtime by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2372
- Update architecture doc by
[@&#8203;Kangaxx-0](https://togithub.com/Kangaxx-0) in
[zellij-org/zellij#2371
- feat(themes): add nightfox themes by
[@&#8203;EdenEast](https://togithub.com/EdenEast) in
[zellij-org/zellij#2384
- feat: provide default themes by
[@&#8203;jaeheonji](https://togithub.com/jaeheonji) in
[zellij-org/zellij#2307
- feat(plugins): update and render plugins asynchronously by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2410
- feat(layout): Support environment variables in cwd
([#&#8203;2288](https://togithub.com/zellij-org/zellij/issues/2288)) by
[@&#8203;shahamran](https://togithub.com/shahamran) in
[zellij-org/zellij#2291
- Add file path context to all IO errors in ConfigError by
[@&#8203;Imberflur](https://togithub.com/Imberflur) in
[zellij-org/zellij#2412
- fix(e2e): fix flaky locked mode test by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2413
- Fix error loading non-existant themes directory and use default themes
as the base when merging by
[@&#8203;Imberflur](https://togithub.com/Imberflur) in
[zellij-org/zellij#2411
- improve build/ci times by
[@&#8203;tlinford](https://togithub.com/tlinford) in
[zellij-org/zellij#2396
- Do not unwrap() the sticky bit setting! by
[@&#8203;valpackett](https://togithub.com/valpackett) in
[zellij-org/zellij#2424
- Use rust 1.67 by [@&#8203;har7an](https://togithub.com/har7an) in
[zellij-org/zellij#2375
- Fix issue 2421 - Update config file output by
[@&#8203;Kangaxx-0](https://togithub.com/Kangaxx-0) in
[zellij-org/zellij#2443
- feat(plugins): Plugin workers and strider by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2449
- fix: cwd of newtab action by
[@&#8203;onichandame](https://togithub.com/onichandame) in
[zellij-org/zellij#2455
- feat(wasm-plugin-system): major overhaul and some goodies by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2510
- feat(plugins): extensive plugin api by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2516
- fix: runtime panic because of local cache by
[@&#8203;jaeheonji](https://togithub.com/jaeheonji) in
[zellij-org/zellij#2522
- fix(output): do not hide cursor on a render that does not include
visual assets by [@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2528
- fix(screen): focus tab as well as pane when launching existing plugin
by [@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2530
- fix(strider): clear search term on ESC by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2531
- fix(plugins): only listen to hd if a plugin is subscribed to hd events
by [@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2529
- fix(logs): suppress debug logs when not debugging by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2532
- fix(plugins): allow loading relative urls by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2539
- feat(plugins): plugin pane state events by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2545
- performance(plugins): use a debounced fs watcher by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2546
- feat(plugins): more plugin api methods by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2550
- refactor(plugins): improve api by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2552
- feat(plugins): strider improvements by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2551
- docs(plugins): document the zellij-tile events and commands api by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2554
- docs(plugins): better zellij-tile-docs by
[@&#8203;imsnif](https://togithub.com/imsnif) in
[zellij-org/zellij#2560

#### New Contributors

- [@&#8203;on3iro](https://togithub.com/on3iro) made their first
contribution in
[zellij-org/zellij#2314
- [@&#8203;Kangaxx-0](https://togithub.com/Kangaxx-0) made their first
contribution in
[zellij-org/zellij#2290
- [@&#8203;EdenEast](https://togithub.com/EdenEast) made their first
contribution in
[zellij-org/zellij#2384
- [@&#8203;shahamran](https://togithub.com/shahamran) made their first
contribution in
[zellij-org/zellij#2291
- [@&#8203;Imberflur](https://togithub.com/Imberflur) made their first
contribution in
[zellij-org/zellij#2412
- [@&#8203;valpackett](https://togithub.com/valpackett) made their first
contribution in
[zellij-org/zellij#2424
- [@&#8203;onichandame](https://togithub.com/onichandame) made their
first contribution in
[zellij-org/zellij#2455

**Full Changelog**:
zellij-org/zellij@v0.36.0...v0.37.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://togithub.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/scottames/dots).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4xMjYuMCIsInVwZGF0ZWRJblZlciI6IjM1LjEyNi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant