From: Enrique Hernandez Date: Fri, 5 Feb 2021 02:23:34 +0000 (-0600) Subject: add window emitters and stuff X-Git-Tag: v0.9~102 X-Git-Url: https://andrewgundersen.net/repos?a=commitdiff_plain;h=29dc7de3e403603915617962eae5c682e3955cfd;p=mime-chat add window emitters and stuff --- diff --git a/src/background.ts b/src/background.ts index 4cae5f4..5b5ceec 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,29 +1,25 @@ -"use strict"; -import {initApp} from './background/initApp'; -import {Recorder} from './background/recorder'; -var portAudio = require('naudiodon'); +/* + * Entry point for Crimata electron app. + * "Look on my Works, ye Mighty, and despair!" + */ +"use strict"; -// NOTE Program Begins Here -(async () => { +import { protocol } from "electron"; +import { initApp } from './background/initApp'; - console.log(portAudio.getDevices()) - const isDevelopment = process.env.NODE_ENV !== "production"; +// Scheme must be registered before the app is ready +protocol.registerSchemesAsPrivileged([ + { scheme: "app", privileges: { secure: true, standard: true } } +]); +// Load environment variable +const isDevelopment = process.env.NODE_ENV !== "production"; - try { +// NOTE Program Begins Here +(async () => { - const recorder = new Recorder({ - channelCount: 1, - sampleFormat: 16, - sampleRate: 16000, - deviceId: 24, // Use -1 or omit the deviceId to select the default device - closeOnError: true - }, 'binary'); - // await authenticate method - initApp(isDevelopment); - } catch (e) { - console.log("Error", e); - } + console.log('Starting Crimata electron app.'); + initApp(isDevelopment); })(); diff --git a/src/background/createWindow.ts b/src/background/createWindow.ts new file mode 100644 index 0000000..02aadf9 --- /dev/null +++ b/src/background/createWindow.ts @@ -0,0 +1,38 @@ +"use strict"; + +import { BrowserWindow } from "electron"; +import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; +import * as path from "path"; + +export function createWindow(options: { + width: number; + height: number; + resizable: boolean; +}): BrowserWindow { + + const win: BrowserWindow = new BrowserWindow({ + width: options.width, + height: options.height, + resizable: options.resizable, + webPreferences: { + // Use pluginOptions.nodeIntegration, leave this alone + // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info + nodeIntegration: (process.env + .ELECTRON_NODE_INTEGRATION as unknown) as boolean, + preload: path.join(__dirname, "preload.js") + } + }); + + if (process.env.WEBPACK_DEV_SERVER_URL) { + // Load the url of the dev server if in development mode + win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string); + } else { + createProtocol("app"); + // Load the index.html when not in development + win.loadURL("app://./index.html"); + } + + return win; +} + + diff --git a/src/background/initApp.ts b/src/background/initApp.ts index 01910c5..40de858 100644 --- a/src/background/initApp.ts +++ b/src/background/initApp.ts @@ -1,87 +1,39 @@ -"use strict"; - -import { app, protocol, BrowserWindow, ipcMain } from "electron"; -import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; -import installExtension, { VUEJS_DEVTOOLS } from "electron-devtools-installer"; -import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; -import * as path from "path"; - -var win: BrowserWindow | null; - -function createWindow() { - // Create the browser window. - win = new BrowserWindow({ - width: 450, - height: 1025, - resizable: true, - webPreferences: { - // Use pluginOptions.nodeIntegration, leave this alone - // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info - nodeIntegration: (process.env - .ELECTRON_NODE_INTEGRATION as unknown) as boolean, - preload: path.join(__dirname, "preload.js") - } - }); - if (process.env.WEBPACK_DEV_SERVER_URL) { - // Load the url of the dev server if in development mode - win.loadURL(process.env.WEBPACK_DEV_SERVER_URL as string); - } else { - createProtocol("app"); - // Load the index.html when not in development - win.loadURL("app://./index.html"); - } +"use strict"; - win.webContents.on('did-finish-load', () => { - // do stuff once window has finished loading - }) +import { app } from "electron"; +import { main } from './run'; +import { windowEmitter } from './windowEmitter'; - win.on("closed", () => { - win = null; - }); -} +export function initApp(dev: boolean): void { -export function initApp(isDev: boolean){ + let winActive: boolean; - // Scheme must be registered before the app is ready - protocol.registerSchemesAsPrivileged([ - { scheme: "app", privileges: { secure: true, standard: true } } - ]); + windowEmitter.on('window-active', (state: boolean) => { + winActive = state; + }); - // This method will be called when Electron has finished - // initialization and is ready to create browser windows. - // Some APIs can only be used after this event occurs. - app.on("ready", async () => { - if (isDev && !process.env.IS_TEST) { - // Install Vue Devtools - try { - await installExtension(VUEJS_DEVTOOLS); - } catch (e) { - console.error("Vue Devtools failed to install:", e.toString()); - } - } - createWindow(); + app.on("ready", () => { + main(); }); // Quit when all windows are closed. app.on("window-all-closed", () => { - // On macOS it is common for applications and their menu bar - // to stay active until the user quits explicitly with Cmd + Q if (process.platform !== "darwin") { app.quit(); } }); + // TODO: Debug activate functionaity: currently not working. + // Might have to de-reference window object app.on("activate", () => { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (win === null) { - createWindow(); + if (winActive === false) { + main(); } }); // Exit cleanly on request from parent process in development mode. - if (isDev) { + if (dev) { if (process.platform === "win32") { process.on("message", data => { if (data === "graceful-exit") { diff --git a/src/background/main.ts b/src/background/main.ts deleted file mode 100644 index b36af61..0000000 --- a/src/background/main.ts +++ /dev/null @@ -1,39 +0,0 @@ -import {Recorder} from './recorder'; -import { ipcMain } from "electron"; -/* - * this code will be run after window has finished loading - */ -export function main() { - // connect to crimata-platform ws server - - // start recorder - const recorder = new Recorder({ - channelCount: 1, - sampleFormat: 16, - sampleRate: 16000, - deviceId: -1, - closeOnError: false, - }, 'binary'); - - const updateRecorder = (Event: any, record: boolean) => { - if (record) { - console.log('recording') - recorder.resume(); - } else { - console.log('stop recording') - recorder.pause(); - const data = recorder.getData(); - // TODO: send data() - } - } - - const sendMessage = (Event: any, payload: any) => { - - } - - // event handlers - ipcMain.on('update-recorder', updateRecorder); - ipcMain.on('send-message', updateRecorder); - // send message - -} diff --git a/src/background/recorder.ts b/src/background/recorder.ts index cc4570a..4b741d6 100644 --- a/src/background/recorder.ts +++ b/src/background/recorder.ts @@ -4,7 +4,6 @@ const portAudio = require('naudiodon'); const { Writable } = require('stream'); // eslint-disable-next-line @typescript-eslint/no-var-requires const { StringDecoder } = require('string_decoder'); -import { ipcMain } from "electron"; interface RecorderI { stop(): string; @@ -59,7 +58,7 @@ export class Recorder implements RecorderI { try { this.start(); } catch(e) { - console.log('MEGA ERROR!'); + console.log('RECORDER ERROR!', e); } } diff --git a/src/background/run.ts b/src/background/run.ts new file mode 100644 index 0000000..63ad873 --- /dev/null +++ b/src/background/run.ts @@ -0,0 +1,83 @@ +import { createWindow } from './createWindow'; +import WebSocket from 'ws'; +import { Recorder } from './recorder'; +import { ipcMain, BrowserWindow } from "electron"; +import { windowEmitter } from './windowEmitter'; + +/* + * The main function will be run after electron app is ready. + */ +export function main(): void { + + // create main window. + let win: BrowserWindow | null; + win = createWindow({ width: 350, height: 525, resizable: false }); + + // Instantiate ws session with crimata-platorm. + const ws = new WebSocket('ws://localhost:8080'); + + // Instantiate portAudio recorder. + const recorder = new Recorder({ + channelCount: 1, + sampleFormat: 16, + sampleRate: 16000, + deviceId: -1, + closeOnError: false, + }, 'binary'); + + const initSession = (): void => { + ws.send('hernandeze2@xavier.edu'); + } + + const sendMessage = (Event: any, payload: any): void => { + ws.send(JSON.stringify(payload)); + } + + const sendAudio = (data: string): void => { + ws.send(data); + } + + const receiveMessage = (message: string): void => { + // NOTE assuming message is JSON string + const parsed = JSON.parse(message); + win.webContents.send('render-message', { + message: parsed + }); + } + + const updateRecorder = (Event: any, record: boolean): void => { + if (record) { + recorder.resume(); + } else { + recorder.pause(); + const data = recorder.getData(); + sendAudio(data); + } + } + + const windowMount = (): void => { + console.log('testing mount'); + // ipc event handlers + windowEmitter.emit('window-active', true); + ipcMain.on('update-recorder', updateRecorder); + ipcMain.on('send-message', sendMessage); + } + + const windowDismount = (): void => { + console.log('testing dismount'); + // TODO: Gracefully close ws connection + win = null; + windowEmitter.emit('window-active', false); + ipcMain.removeListener('update-recorder', updateRecorder); + ipcMain.removeListener('send-message', sendMessage); + } + + // ws handlers + ws.on('connect', initSession); + ws.on("message", receiveMessage); + + // Handle window mount and dismount. + win.webContents.on('did-finish-load', windowMount); + win.on("closed", windowDismount); + +} diff --git a/src/background/windowEmitter.ts b/src/background/windowEmitter.ts new file mode 100644 index 0000000..65bf9ae --- /dev/null +++ b/src/background/windowEmitter.ts @@ -0,0 +1,5 @@ +const EventEmitter = require('events'); + +class WindowEmitter extends EventEmitter {} + +export const windowEmitter = new WindowEmitter();