Clean up & Add connection setup
This commit is contained in:
55
events/EventBus.ts
Normal file
55
events/EventBus.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
import { Event } from './Events'
|
||||
import { ipcMain, ipcRenderer, IpcRenderer, IpcMain } from 'electron'
|
||||
|
||||
interface EventBusInterface {
|
||||
subscribe<MessageType>(event: Event<MessageType>, callback:(msg: MessageType) => void): void
|
||||
unsubscribeAll<MessageType>(event: Event<MessageType>): void
|
||||
emit<MessageType>(event: Event<MessageType>, msg: MessageType): void
|
||||
}
|
||||
|
||||
class IpcMainEventBus implements EventBusInterface {
|
||||
private ipc: IpcMain
|
||||
private client: any
|
||||
constructor(ipc: IpcMain) {
|
||||
this.ipc = ipc
|
||||
}
|
||||
|
||||
public subscribe<MessageType>(event: Event<MessageType>, callback:(msg: MessageType) => void) {
|
||||
console.log('subscribing', event.topic)
|
||||
this.ipc.on(event.topic, (event: any, arg: any) => {
|
||||
this.client = event.sender
|
||||
callback(arg)
|
||||
})
|
||||
}
|
||||
|
||||
public unsubscribeAll<MessageType>(event: Event<MessageType>) {
|
||||
this.ipc.removeAllListeners(event.topic)
|
||||
}
|
||||
|
||||
public emit<MessageType>(event: Event<MessageType>, msg: MessageType) {
|
||||
this.client.send(event.topic, msg)
|
||||
}
|
||||
}
|
||||
|
||||
class IpcRendererEventBus implements EventBusInterface {
|
||||
private ipc: IpcRenderer
|
||||
constructor(ipc: IpcRenderer) {
|
||||
this.ipc = ipc
|
||||
}
|
||||
|
||||
public subscribe<MessageType>(event: Event<MessageType>, callback:(msg: MessageType) => void) {
|
||||
this.ipc.on(event.topic, (_event: any, arg: any) => callback(arg))
|
||||
}
|
||||
|
||||
public unsubscribeAll<MessageType>(event: Event<MessageType>) {
|
||||
this.ipc.removeAllListeners(event.topic)
|
||||
}
|
||||
|
||||
public emit<MessageType>(event: Event<MessageType>, msg: MessageType) {
|
||||
console.log(event.topic, msg)
|
||||
this.ipc.send(event.topic, msg)
|
||||
}
|
||||
}
|
||||
|
||||
export const rendererEvents = new IpcRendererEventBus(ipcRenderer)
|
||||
export const backendEvents = new IpcMainEventBus(ipcMain)
|
||||
47
events/EventDispatcher.ts
Normal file
47
events/EventDispatcher.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { EventEmitter } from 'events'
|
||||
|
||||
interface CallbackStore {
|
||||
wrappedCallback: any
|
||||
callback: any
|
||||
}
|
||||
|
||||
export class EventDispatcher<Message, Dispatcher> {
|
||||
private emitter = new EventEmitter()
|
||||
private dispatcher: Dispatcher
|
||||
private callbacks: CallbackStore[] = []
|
||||
|
||||
constructor(dispatcher: Dispatcher) {
|
||||
this.dispatcher = dispatcher
|
||||
}
|
||||
|
||||
public dispatch(msg: Message) {
|
||||
this.emitter.emit('event', msg)
|
||||
}
|
||||
|
||||
public subscribe(callback: (msg: Message, dispatcher: Dispatcher) => void) {
|
||||
const wrappedCallback = (msg: Message) => {
|
||||
callback(msg, this.dispatcher)
|
||||
}
|
||||
this.emitter.on('event', wrappedCallback)
|
||||
|
||||
this.callbacks.push({
|
||||
callback,
|
||||
wrappedCallback,
|
||||
})
|
||||
}
|
||||
|
||||
public unsubscribe(callback: (msg: Message, dispatcher: Dispatcher) => void) {
|
||||
const item = this.callbacks.find(store => store.callback === callback)
|
||||
if (!item) {
|
||||
return
|
||||
}
|
||||
|
||||
this.emitter.removeListener('event', item.wrappedCallback)
|
||||
this.callbacks = this.callbacks.filter(a => a !== item)
|
||||
}
|
||||
|
||||
public removeAllListeners() {
|
||||
this.emitter.removeAllListeners()
|
||||
this.callbacks = []
|
||||
}
|
||||
}
|
||||
39
events/Events.ts
Normal file
39
events/Events.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import { MqttOptions, DataSourceState } from '../backend/src/DataSource'
|
||||
|
||||
export interface Event<MessageType> {
|
||||
topic: string
|
||||
}
|
||||
|
||||
export interface AddMqttConnection {
|
||||
id: string,
|
||||
options: MqttOptions
|
||||
}
|
||||
|
||||
export const addMqttConnectionEvent: Event<AddMqttConnection> = {
|
||||
topic: 'connection/add/mqtt',
|
||||
}
|
||||
|
||||
interface RemoveConnection {
|
||||
connectionId: string,
|
||||
}
|
||||
|
||||
export const removeConnection: Event<string> = {
|
||||
topic: 'connection/remove',
|
||||
}
|
||||
|
||||
export function makeConnectionStateEvent(connectionId: string): Event<DataSourceState> {
|
||||
return {
|
||||
topic: `conn/state/${connectionId}`,
|
||||
}
|
||||
}
|
||||
|
||||
interface Message {
|
||||
topic: string,
|
||||
payload: any
|
||||
}
|
||||
|
||||
export function makeConnectionMessageEvent(connectionId: string): Event<Message> {
|
||||
return {
|
||||
topic: `conn/${connectionId}`,
|
||||
}
|
||||
}
|
||||
0
events/Server/index.ts
Normal file
0
events/Server/index.ts
Normal file
3
events/index.ts
Normal file
3
events/index.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
export * from './Events'
|
||||
export * from './EventDispatcher'
|
||||
export * from './EventBus'
|
||||
9
events/test.js
Normal file
9
events/test.js
Normal file
@@ -0,0 +1,9 @@
|
||||
const { EventEmitter } = require('events');
|
||||
|
||||
const a = new EventEmitter()
|
||||
a.on('test', () => console.log('test'))
|
||||
a.on('test2', () => console.log('test2'))
|
||||
a.removeAllListeners('test')
|
||||
|
||||
a.emit('test')
|
||||
a.emit('test2')
|
||||
Reference in New Issue
Block a user