https://github.com/asaskevich/EventBus
[Go] Lightweight eventbus with async compatibility for Go
https://github.com/asaskevich/EventBus
Last synced: 8 months ago
JSON representation
[Go] Lightweight eventbus with async compatibility for Go
- Host: GitHub
- URL: https://github.com/asaskevich/EventBus
- Owner: asaskevich
- License: mit
- Created: 2014-12-19T16:38:39.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2024-06-19T06:33:20.000Z (over 1 year ago)
- Last Synced: 2024-10-15T10:21:04.595Z (about 1 year ago)
- Language: Go
- Homepage:
- Size: 45.9 KB
- Stars: 1,727
- Watchers: 31
- Forks: 220
- Open Issues: 26
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-go - EventBus - The lightweight event bus with async compatibility. (Messaging / Search and Analytic Databases)
- go-awesome - EventBus - 事件总线 (开源类库 / 未归类)
- go-awesome - EventBus - event bus (Open source library / Not Categorized)
- awesome-go - EventBus - The lightweight event bus with async compatibility. Stars:`1.9K`. (Messaging / Search and Analytic Databases)
- awesome-go - EventBus - [Go] Lightweight eventbus with async compatibility for Go - ★ 443 (Messaging)
- awesome-go - EventBus - The lightweight event bus with async compatibility. (Messaging / Advanced Console UIs)
- awesome-go-extra - EventBus - 12-19T16:38:39Z|2022-04-14T21:53:38Z| (Messaging / Advanced Console UIs)
- awesome-go-zh - EventBus
- awesome-go-cn - EventBus
- awesome-ccamel - asaskevich/EventBus - [Go] Lightweight eventbus with async compatibility for Go (Go)
- awesome-go-cn - EventBus
- my-awesome - asaskevich/EventBus - 06 star:1.9k fork:0.2k [Go] Lightweight eventbus with async compatibility for Go (Go)
- awesome-go-plus - EventBus - The lightweight event bus with async compatibility.  (Messaging / Search and Analytic Databases)
- fucking-awesome-go - :octocat: EventBus - The lightweight event bus with async compatibility. :star: 144 :fork_and_knife: 18 (Messaging / Advanced Console UIs)
- awesome-go - EventBus - The lightweight event bus with async compatibility. (Messaging / Search and Analytic Databases)
- awesome-go - asaskevich/EventBus
- awesome-go-with-stars - EventBus - The lightweight event bus with async compatibility. (Messaging / Search and Analytic Databases)
- awesome-go - EventBus - The lightweight event bus with async compatibility. (Messaging / Search and Analytic Databases)
- awesome-Char - EventBus - The lightweight event bus with async compatibility. (Messaging / Advanced Console UIs)
- zero-alloc-awesome-go - EventBus - The lightweight event bus with async compatibility. (Messaging / Search and Analytic Databases)
- awesome-go-cn - EventBus
- awesome-go - EventBus - The lightweight event bus with async compatibility. (Messaging / Advanced Console UIs)
README
EventBus
======
[](https://godoc.org/github.com/asaskevich/EventBus) [](https://coveralls.io/r/asaskevich/EventBus?branch=master) [](https://travis-ci.org/asaskevich/EventBus)
Package EventBus is the little and lightweight eventbus with async compatibility for GoLang.
#### Installation
Make sure that Go is installed on your computer.
Type the following command in your terminal:
go get github.com/asaskevich/EventBus
After it the package is ready to use.
#### Import package in your project
Add following line in your `*.go` file:
```go
import "github.com/asaskevich/EventBus"
```
If you unhappy to use long `EventBus`, you can do something like this:
```go
import (
evbus "github.com/asaskevich/EventBus"
)
```
#### Example
```go
func calculator(a int, b int) {
fmt.Printf("%d\n", a + b)
}
func main() {
bus := EventBus.New();
bus.Subscribe("main:calculator", calculator);
bus.Publish("main:calculator", 20, 40);
bus.Unsubscribe("main:calculator", calculator);
}
```
#### Implemented methods
* **New()**
* **Subscribe()**
* **SubscribeOnce()**
* **HasCallback()**
* **Unsubscribe()**
* **Publish()**
* **SubscribeAsync()**
* **SubscribeOnceAsync()**
* **WaitAsync()**
#### New()
New returns new EventBus with empty handlers.
```go
bus := EventBus.New();
```
#### Subscribe(topic string, fn interface{}) error
Subscribe to a topic. Returns error if `fn` is not a function.
```go
func Handler() { ... }
...
bus.Subscribe("topic:handler", Handler)
```
#### SubscribeOnce(topic string, fn interface{}) error
Subscribe to a topic once. Handler will be removed after executing. Returns error if `fn` is not a function.
```go
func HelloWorld() { ... }
...
bus.SubscribeOnce("topic:handler", HelloWorld)
```
#### Unsubscribe(topic string, fn interface{}) error
Remove callback defined for a topic. Returns error if there are no callbacks subscribed to the topic.
```go
bus.Unsubscribe("topic:handler", HelloWord);
```
#### HasCallback(topic string) bool
Returns true if exists any callback subscribed to the topic.
#### Publish(topic string, args ...interface{})
Publish executes callback defined for a topic. Any additional argument will be transferred to the callback.
```go
func Handler(str string) { ... }
...
bus.Subscribe("topic:handler", Handler)
...
bus.Publish("topic:handler", "Hello, World!");
```
#### SubscribeAsync(topic string, fn interface{}, transactional bool)
Subscribe to a topic with an asynchronous callback. Returns error if `fn` is not a function.
```go
func slowCalculator(a, b int) {
time.Sleep(3 * time.Second)
fmt.Printf("%d\n", a + b)
}
bus := EventBus.New()
bus.SubscribeAsync("main:slow_calculator", slowCalculator, false)
bus.Publish("main:slow_calculator", 20, 60)
fmt.Println("start: do some stuff while waiting for a result")
fmt.Println("end: do some stuff while waiting for a result")
bus.WaitAsync() // wait for all async callbacks to complete
fmt.Println("do some stuff after waiting for result")
```
Transactional determines whether subsequent callbacks for a topic are run serially (true) or concurrently(false)
#### SubscribeOnceAsync(topic string, args ...interface{})
SubscribeOnceAsync works like SubscribeOnce except the callback to executed asynchronously
#### WaitAsync()
WaitAsync waits for all async callbacks to complete.
#### Cross Process Events
Works with two rpc services:
- a client service to listen to remotely published events from a server
- a server service to listen to client subscriptions
server.go
```go
func main() {
server := NewServer(":2010", "/_server_bus_", New())
server.Start()
// ...
server.EventBus().Publish("main:calculator", 4, 6)
// ...
server.Stop()
}
```
client.go
```go
func main() {
client := NewClient(":2015", "/_client_bus_", New())
client.Start()
client.Subscribe("main:calculator", calculator, ":2010", "/_server_bus_")
// ...
client.Stop()
}
```
#### Notes
Documentation is available here: [godoc.org](https://godoc.org/github.com/asaskevich/EventBus).
Full information about code coverage is also available here: [EventBus on gocover.io](http://gocover.io/github.com/asaskevich/EventBus).
#### Support
If you do have a contribution for the package feel free to put up a Pull Request or open Issue.
#### Special thanks to [contributors](https://github.com/asaskevich/EventBus/graphs/contributors)
* [Brian Downs](https://github.com/briandowns)
* [Dominik Schulz](https://github.com/gittex)
* [bennAH](https://github.com/bennAH)
* [John Noble] (https://github.com/gaxunil)
* [Evan Borgstrom] (https://github.com/borgstrom)