MCPcopy Index your code
hub / github.com/asaskevich/EventBus

github.com/asaskevich/EventBus @main sqlite

repository ↗ · DeepWiki ↗
76 symbols 249 edges 6 files 41 documented · 54% 1 cross-repo links
README

EventBus

GoDoc Coverage Status Build Status

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:

import "github.com/asaskevich/EventBus"

If you unhappy to use long EventBus, you can do something like this:

import (
    evbus "github.com/asaskevich/EventBus"
)

Example

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.

bus := EventBus.New();

Subscribe(topic string, fn interface{}) error

Subscribe to a topic. Returns error if fn is not a function.

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.

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.

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.

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.

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

func main() {
    server := NewServer(":2010", "/_server_bus_", New())
    server.Start()
    // ...
    server.EventBus().Publish("main:calculator", 4, 6)
    // ...
    server.Stop()
}

client.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. Full information about code coverage is also available here: EventBus on gocover.io.

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

Extension points exported contracts — how you extend this code

BusSubscriber (Interface)
BusSubscriber defines subscription-related bus behavior [1 implementers]
event_bus.go
BusPublisher (Interface)
BusPublisher defines publishing-related bus behavior [1 implementers]
event_bus.go
BusController (Interface)
BusController defines bus control behavior (checking handler's presence, synchronization) [1 implementers]
event_bus.go
Bus (Interface)
Bus englobes global (subscribe, publish, control) bus behavior
event_bus.go

Core symbols most depended-on inside this repo

New
called by 18
event_bus.go
Publish
called by 14
event_bus.go
Subscribe
called by 13
event_bus.go
HasCallback
called by 5
event_bus.go
NewServer
called by 4
server.go
SubscribeOnce
called by 4
event_bus.go
Unsubscribe
called by 4
event_bus.go
WaitAsync
called by 4
event_bus.go

Shape

Method 39
Function 21
Struct 11
Interface 4
TypeAlias 1

Languages

Go100%

Modules by API surface

event_bus.go29 symbols
event_bus_test.go13 symbols
server.go11 symbols
client.go11 symbols
network_bus_test.go6 symbols
network_bus.go6 symbols

Used by 1 indexed graphs manifest dependencies, hub-wide

For agents

$ claude mcp add EventBus \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact