Clean up & Add connection setup

This commit is contained in:
Thomas Nordquist
2019-01-06 13:30:35 +01:00
parent ad7794b30d
commit 32c3079821
26 changed files with 809 additions and 356 deletions

55
events/EventBus.ts Normal file
View 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
View 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
View 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
View File

3
events/index.ts Normal file
View File

@@ -0,0 +1,3 @@
export * from './Events'
export * from './EventDispatcher'
export * from './EventBus'

9
events/test.js Normal file
View 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')