]> Repos - mime-chat/commitdiff
add window emitters and stuff
authorEnrique Hernandez <hernandeze2@xavier.edu>
Fri, 5 Feb 2021 02:23:34 +0000 (20:23 -0600)
committerEnrique Hernandez <hernandeze2@xavier.edu>
Fri, 5 Feb 2021 03:25:09 +0000 (21:25 -0600)
src/background.ts
src/background/createWindow.ts [new file with mode: 0644]
src/background/initApp.ts
src/background/main.ts [deleted file]
src/background/recorder.ts
src/background/run.ts [new file with mode: 0644]
src/background/windowEmitter.ts [new file with mode: 0644]

index 4cae5f47d96ec7869ce0101f3135fc07c7a09e58..5b5ceec0a6cc41eb7591148bfc586e2a1cbf6191 100644 (file)
@@ -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 (file)
index 0000000..02aadf9
--- /dev/null
@@ -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;
+}
+
+
index 01910c5fb56ecd1c022e3b0be6d844c8941e3b6b..40de858cf3ef02c65a6dec2a67bdfed462f39fef 100644 (file)
@@ -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 (file)
index b36af61..0000000
+++ /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
-
-}
index cc4570a8f3c6cb48a7ad7ce34fd2d1f2731e4851..4b741d6e6ab20d9b3412e60d54c63158065bc4ab 100644 (file)
@@ -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 (file)
index 0000000..63ad873
--- /dev/null
@@ -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 (file)
index 0000000..65bf9ae
--- /dev/null
@@ -0,0 +1,5 @@
+const EventEmitter = require('events');
+
+class WindowEmitter extends EventEmitter {}
+
+export const windowEmitter = new WindowEmitter();