From: riqo Date: Sat, 19 Jun 2021 16:21:47 +0000 (-0500) Subject: refactor ipc Main X-Git-Tag: v2.0.1~19^2~2 X-Git-Url: https://andrewgundersen.net/repos?a=commitdiff_plain;h=a22b3c68e5843d60863cef41ce0e8ef4ea53b2ee;p=mime-chat refactor ipc Main --- diff --git a/src/audio.ts b/src/audio.ts index 844e791..7ae2562 100644 --- a/src/audio.ts +++ b/src/audio.ts @@ -6,12 +6,12 @@ let buffer: ArrayBuffer[] = []; // place audio data in buffer -export function collect (chunk: ArrayBuffer) { - buffer.push(chunk); +export const collect: IpcListenerCallback = (chunk) => { + if (chunk) buffer.push(chunk); } // return audio and clear buffer -export function flush () { +export const flush = async () => { const bufferCopy = buffer; buffer = []; return bufferCopy; diff --git a/src/composables/useIpcMain.ts b/src/composables/useIpcMain.ts index 0a187b7..57a2cb3 100644 --- a/src/composables/useIpcMain.ts +++ b/src/composables/useIpcMain.ts @@ -1,5 +1,5 @@ -import { ipcMain, IpcMainInvokeEvent } from "electron"; +import { ipcMain, IpcMainInvokeEvent, IpcMainEvent } from "electron"; export class IpcHandler implements IIpcHandler { @@ -16,7 +16,7 @@ export class IpcHandler implements IIpcHandler implements IIpcHandler implements IIpcListener { + + readonly channel: string; + + readonly _listenerCallback: IpcListenerCallback; + + constructor(options: { + channel: string; + listenerCallback: IpcListenerCallback; + }) { + this.channel = options.channel; + this._listenerCallback = options.listenerCallback; + } + + listen() { + console.log(`[IPC] Init: ${this.channel}`); + this.remove(); + ipcMain.on(this.channel, this._onPost); + } + + remove() { + ipcMain.removeAllListeners(this.channel); + } + + private _onPost = (_e: IpcMainEvent, payload?: string | null): void => { + + console.log(`[IPC] Post: ${this.channel}`); + + const params = payload ? JSON.parse(payload) : null; + this._listenerCallback(params); + } + +} diff --git a/src/composables/useWebsockets.ts b/src/composables/useWebsockets.ts index cc272d6..d1cfc02 100644 --- a/src/composables/useWebsockets.ts +++ b/src/composables/useWebsockets.ts @@ -57,7 +57,7 @@ export default function useWebSockets( }); socket.on("message", (event: WebSocket.MessageEvent) => { - console.log("message received", event.data); + console.log("message received", event); messageCallback(event.toString()) }); diff --git a/src/ipc/account.ts b/src/ipc/account.ts deleted file mode 100644 index b8ae1d3..0000000 --- a/src/ipc/account.ts +++ /dev/null @@ -1,23 +0,0 @@ - -"use strict"; - -import { accountLogin, accountLogout } from "@/account"; -import { IpcHandler } from "@/composables/useIpcMain"; - -const LOGIN_CHANNEL = "account-login"; -const LOGOUT_CHANNEL = "account-logout"; - -const loginHandler = new IpcHandler({ - channel: LOGIN_CHANNEL, - handlerCallback: accountLogin -}); - -const logoutHandler = new IpcHandler({ - channel: LOGOUT_CHANNEL, - handlerCallback: accountLogout -}); - -const handlers = [loginHandler, logoutHandler]; - -export default handlers; - diff --git a/src/ipc/audio.ts b/src/ipc/audio.ts deleted file mode 100644 index d3c7685..0000000 --- a/src/ipc/audio.ts +++ /dev/null @@ -1,31 +0,0 @@ - -"use strict"; - -import { ipcMain, IpcMainInvokeEvent, IpcMainEvent } from "electron"; -import { collect, flush } from "@/composbales/audio"; -import { IpcHandler } from "@/composables/useIpcMain"; - -const AUDIO_CHUNK_CHANNEL = 'audio-chunk'; -const GET_AUDIO_CHANNEL = 'get-audio'; - -// handle the new audio data -const onAudioChunk = ( - _e: IpcMainEvent, - payload: ArrayBuffer -) => { - console.log('[IPC]: audio-buffer'); - collect(payload); -} - -const getAudioHandler = new IpcHandler({ - channel: GET_AUDIO_CHANNEL, - handlerCallback: flush -}); - - -export default function useAudioListeners(): void { - - ipcMain.removeAllListeners("audio-chunk"); - ipcMain.on("audio-chunk", onAudioChunk); - -} diff --git a/src/ipc/handlers.ts b/src/ipc/handlers.ts new file mode 100644 index 0000000..bc44fc2 --- /dev/null +++ b/src/ipc/handlers.ts @@ -0,0 +1,27 @@ + +"use strict"; + +import { accountLogin, accountLogout } from "@/account"; +import { IpcHandler } from "@/composables/useIpcMain"; +import { flush } from "@/audio"; + +const LOGIN_CHANNEL = "invoke-account-login"; +const LOGOUT_CHANNEL = "invoke-account-logout"; +const GET_AUDIO_CHANNEL = "invoke-audio-flush"; + +export const loginHandler = new IpcHandler({ + channel: LOGIN_CHANNEL, + handlerCallback: accountLogin +}); + +export const logoutHandler = new IpcHandler({ + channel: LOGOUT_CHANNEL, + handlerCallback: accountLogout +}); + +export const getAudioHandler = new IpcHandler({ + channel: GET_AUDIO_CHANNEL, + handlerCallback: flush +}); + + diff --git a/src/ipc/index.ts b/src/ipc/index.ts index 017a9f2..e6eb90a 100644 --- a/src/ipc/index.ts +++ b/src/ipc/index.ts @@ -1,36 +1,33 @@ "use strict"; -import {IpcHandler} from "@/composables/useIpcMain"; -import accountHandlers from "./account"; -import useSessionListeners from "./session"; -// import useAudioListeners from "./audio"; - -interface IPCHandlers { - [channel: string]: IpcHandler; -} +import * as handlers from "./handlers"; +import * as listeners from "./listeners"; const ipcHandlers: IPCHandlers = {}; - -const _initHandlers = (handlers: Array>) => { - handlers.forEach((h: IpcHandler) => { - if (!(h.channel in ipcHandlers)) { - ipcHandlers[h.channel] = h; - h.handle(); - } - }); -} - -export default function useIpc(): void { - - _initHandlers(accountHandlers); - - // useAccountListeners(); - - useSessionListeners(); - - // useAudioListeners(); - +const ipcListeners: IPCListeners = {}; + +const _initHandlers = (): void => { + for (const [key, handler] of Object.entries(handlers)) { + if (!(key in ipcHandlers)) { + ipcHandlers[key] = handler; + handler.handle(); + } + } +}; + +const _initListeners = (): void => { + for (const [key, listener] of Object.entries(listeners)) { + if (!(key in ipcListeners)) { + ipcListeners[key] = listener; + listener.listen(); + } + } +}; + +export default function initIpcMain(): void { + _initHandlers(); + _initListeners(); } diff --git a/src/ipc/listeners.ts b/src/ipc/listeners.ts new file mode 100644 index 0000000..f88887a --- /dev/null +++ b/src/ipc/listeners.ts @@ -0,0 +1,17 @@ + +import { IpcListener } from "@/composables/useIpcMain" +import { sendMessage } from '@/session'; +import { collect } from "@/audio"; + +const CLIENT_MESSAGE_CHANNEL = "post-session-send" +const GET_AUDIO_CHANNEL = "post-audio-collect"; + +export const messageListener = new IpcListener({ + channel: CLIENT_MESSAGE_CHANNEL, + listenerCallback: sendMessage +}); + +export const audioChunkListener = new IpcListener({ + channel: GET_AUDIO_CHANNEL, + listenerCallback: collect +}); diff --git a/src/ipc/session.ts b/src/ipc/session.ts deleted file mode 100644 index 0d89eb7..0000000 --- a/src/ipc/session.ts +++ /dev/null @@ -1,15 +0,0 @@ - -"use strict"; - -import { ipcMain, IpcMainEvent } from "electron"; -import { sendMessage } from '@/session'; - -// Handle messages from window/client. -function onSendMessage(_event: IpcMainEvent, payload: Message): void { - sendMessage(payload); -} - -export default function useSessionListeners(): void { - ipcMain.removeAllListeners("client-message"); - ipcMain.on("client-message", onSendMessage); -} diff --git a/src/main.ts b/src/main.ts index 9103cae..40dd4da 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,7 +9,7 @@ * */ -import useIpc from "@/ipc/index"; +import initIpcMain from "@/ipc/index"; import { accountAuth } from "./account"; import { launchSession } from "./session"; import { ipcEmit } from "./composables/useEmitter"; @@ -20,7 +20,7 @@ let authState: AuthState | null; export default async function main() { /* initiate controls for frontend to use when needed */ - useIpc(); + initIpcMain(); /* launch browser window */ await createWindow(); diff --git a/src/render/ipc.ts b/src/render/ipc.ts index 9a8e478..e3c3775 100644 --- a/src/render/ipc.ts +++ b/src/render/ipc.ts @@ -13,11 +13,11 @@ const { post, invoke } = useIpc(); export const invokeLogin = async ( payload: LoginPayload ): Promise => ( - await invoke('account-login', JSON.stringify(payload)) + await invoke('invoke-account-login', JSON.stringify(payload)) ); export const invokeLogout = async (): Promise => ( - await invoke("account-logout", null) + await invoke("invoke-account-logout", null) ); /** @@ -27,11 +27,11 @@ export const invokeLogout = async (): Promise => ( */ export const postAudioChunk = (chunk: ArrayBuffer): void => ( - post("audio-chunk", chunk) + post("post-audio-collect", chunk) ); export const invokeReturnAudio = async (): Promise => ( - await invoke("get-audio", null) + await invoke("invoke-audio-flush", null) ); /** @@ -45,5 +45,5 @@ export const invokeSession = async (cid: string): Promise => ( ); export const postMessage = (payload: Message): void => ( - post('client-message', payload) + post('post-session-send', payload) ); diff --git a/src/session.ts b/src/session.ts index 3e844c1..1b278ba 100644 --- a/src/session.ts +++ b/src/session.ts @@ -13,16 +13,16 @@ const uiState: any | null = null; /* start and stop audio functionality */ // const { initAudio, closeAudio } = useAudio(); -let isInitMessage = (message: any): boolean => { +const isInitMessage = (message: any): boolean => { console.log(message) return true; }; -let deauthenticate = (): void => { +const deauthenticate = (): void => { console.log('deauthenticating') }; -let isAddMessage = (message: any): boolean => { +const isAddMessage = (message: any): boolean => { console.log(message) return true; }; @@ -67,7 +67,7 @@ const onConnectionStatusCallback = (alive: boolean) => { const { connect, send, close } = useWebsockets(onMessageCallback, onConnectionStatusCallback); /* send a message to the platform */ -export function sendMessage(message: Message) { +export function sendMessage(message: Message): void { /* socket send */ send(message); diff --git a/src/types.ts b/src/types.ts index 4dfa705..876bf38 100644 --- a/src/types.ts +++ b/src/types.ts @@ -39,14 +39,34 @@ interface AccountCredentials { password: string; } +/* + * Electron Ipc Main + */ interface IpcHandlerCallback { (payload: I | null): Promise; } +interface IpcListenerCallback { + (payload: I | null): void; +} + interface IIpcHandler { handle(): void; remove(): void; readonly _handlerCallback: IpcHandlerCallback; } +interface IIpcListener { + listen(): void; + remove(): void; + readonly _listenerCallback: IpcListenerCallback; +} + +interface IPCHandlers { + [handler: string]: IIpcHandler; +} + +interface IPCListeners { + [listener: string]: IIpcListener; +}