Skip to content

Event Bus

Develop a simple event bus based on FastEvent to help build event-driven modular applications.

Generally, in modular applications:

  • The application includes 1 FastEventBus instance + multiple FastEventBusNode instances
  • The FastEventBus instance serves as a message center, managing various FastEventBusNode instances
  • Each application module is bound to a FastEventBusNode instance and connects to the bus
  • Supports three communication methods: broadcast messages, publish and subscribe, and point-to-point messages
  • Both FastEventBus and FastEventBusNode inherit from FastEvent

Usage

Step 1: Create an Event Bus

ts
import { FastEventBus } from 'fastevent/eventbus';

const eventbus = new FastEventBus();

Step 2: Create Nodes

ts
import { FastEventBusNode } from 'fastevent/eventbus';

const node1 = new FastEventBusNode({id:'node1'});
node1.connect(eventubs) 

const node2 = new FastEventBusNode({id:'node2'});
node2.connect(eventubs) 

Step 3: Point-to-Point Messages

ts

node1.onMessage = (message,args)=>{
    console.log('node1 receive message',message,args);
}

node2.onMessage = (message,args)=>{
    // message.type='data'
    // message.from==='node'
    // message.to==='node1'
    // message.payload==='hello node2'
}
// Send message to node2
node1.send('node2','hello node2')

Step 4: Broadcast Messages

ts
node1.onMessage = (message,args)=>{ }
node2.onMessage = (message,args)=>{ }
node3.onMessage = (message,args)=>{ }

// Broadcast message to all nodes
node1.broadcast('hello all')

Step 5: Publish and Subscribe

Each FastEventbusNode instance is itself a FastEvent instance. In addition to its own publishing and subscribing, it also supports publishing and subscribing messages to other nodes.

ts
const node1 = new FastEventBusNode({id:'node1'});
const node2 = new FastEventBusNode({id:'node2'});
const node3 = new FastEventBusNode({id:'node3'});
const node4 = new FastEventBusNode({id:'node4'});
const node5 = new FastEventBusNode({id:'node5'});
eventbus.add(node1,node2,node3,node4,node5)

// Trigger an event on node2
node1.emit('node2::test','hello node2')

// Subscribe to events on node2
node1.on('node2::test',(message,args)=>{
    console.log('receive message from node2',message,args);
})

Guide

Creating Nodes

Each Node instance can be created independently or through inheritance.

  • Independent Creation
ts
import { FastEventBus,FastEventBusNode } from 'fastevent/eventbus';

const eventbus = new FastEventBus()

const node = new FastEventBusNode({
    // Node must have a globally unique id
    id:'node1'      //,
    // Receive point-to-point messages and broadcast messages here
    onMessage:(message,args)=>{        //,
    }
});

node.connect(eventbus)
// Or
eventbus.add(node)
  • Creation through Inheritance
ts
import { FastEventBus,FastEventBusNode } from 'fastevent/eventbus';

const eventbus = new FastEventBus()

class MyNode extends FastEventBusNode{
    constructor(){
        super({
            id:'node1'
        });
    }
    onMessage(message,args){
      Receive point-to-point messages and broadcast messages here 
    }
}
node.connect(eventbus)
// Or
eventbus.add(node)
  • onMessage is used to receive point-to-point messages and broadcast messages, no subscription needed.

Broadcast Messages

Each Node instance can receive and send broadcast messages.

ts
import { FastEventBus,FastEventBusNode } from 'fastevent/eventbus';

const eventbus = new FastEventBus()

// Broadcast message, all nodes can receive
eventbus.broadcast('message')
// Broadcast message, retain message, all nodes joining later can also receive
eventbus.broadcast('message',{retain:true})
// Broadcast message
eventbus.broadcast({
    type:'xxx',
    payload:100
})
  • Nodes do not need to subscribe; they can receive broadcast messages in onMessage after connecting.
  • FastEventBus inherits from FastEvent, so broadcast essentially calls the emit method.

Point-to-Point Sending

Each node has a unique id, through which point-to-point messages can be sent.

ts
import { FastEventBus,FastEventBusNode } from 'fastevent/eventbus'; 

const eventbus = new FastEventBus()
const node1 = new FastEventBusNode({id:'node1',onMessage:(message,args)=>{
    // Receive point-to-point and broadcast messages here
});
const node2 = new FastEventBusNode({id:'node2'},onMessage:(message,args)=>{
    // Receive point-to-point and broadcast messages here
});
eventbus.add(node1,node2)

// Send message to node2
node1.send('node2','message')
  • The send method also uses the emit method internally to send messages, so it can also receive return values and all features of FastEvent.

Publish and Subscribe

Both FastEventBus and FastEventBusNode inherit from FastEvent, so they can use all features of FastEvent.

In addition to internal publishing and subscribing within nodes, FastEventBusNode also provides a simplified mechanism for nodes to publish and subscribe to each other.

That is, when the event name is in the form of <target node name>::<event type>, it will automatically publish and subscribe on the target node.

ts
import { FastEventBus,FastEventBusNode } from 'fastevent/eventbus'; 

const eventbus = new FastEventBus()
const node1 = new FastEventBusNode({id:'node1');
const node2 = new FastEventBusNode({id:'node2'});
eventbus.add(node1,node2)

// Subscribe to events on node2
node1.on('node2::message',(message,args)=>{})
// Trigger an event on node2
node1.emit('node2::message',payload)

Note

In cross-node publishing and subscribing, apart from the naming convention, other features are completely consistent with local node publishing and subscribing.