]> Repos - mime-chat/commitdiff
refactor background.ts
authorEnrique Hernandez <hernandeze2@xavier.edu>
Thu, 4 Feb 2021 16:12:21 +0000 (10:12 -0600)
committerEnrique Hernandez <hernandeze2@xavier.edu>
Thu, 4 Feb 2021 16:12:21 +0000 (10:12 -0600)
src/background.ts
src/background/initApp.ts [new file with mode: 0644]
src/background/recorder.ts

index e53ab80b65c9bc153c4aa034e0e64cc04369c73f..d3cecd9761d3f911f6d2631d48b555bdd4c33f05 100644 (file)
 "use strict";
+import {initApp} from './background/initApp';
+import {Recorder} from './background/recorder';
+var portAudio = require('naudiodon');
 
-import { app, protocol, BrowserWindow, ipcMain } from "electron";
-import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
-import installExtension, { VUEJS_DEVTOOLS } from "electron-devtools-installer";
-const isDevelopment = process.env.NODE_ENV !== "production";
-import * as path from "path";
-const fs = require('fs');
-import WebSocket from "ws";
-const portAudio = require('naudiodon');
 
-// const ai = new portAudio.AudioIO({
-//   inOptions: audioOptions
-// });
-//ai.pipe();
-// ai.start();
+// NOTE Program Begins Here
+(async () => {
 
-// Keep a global reference of the window object, if you don't, the window will
-// be closed automatically when the JavaScript object is garbage collected.
-let win: BrowserWindow | null;
+    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 } }
-]);
+    const recorder = new Recorder({
+        channelCount: 1,
+        sampleFormat: portAudio.SampleFormat16Bit,
+        sampleRate: 16000,
+        deviceId: -1, // Use -1 or omit the deviceId to select the default device
+        closeOnError: true
+    }, 'binary');
 
-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);
-    // NOTE uncomment for dev tools on app launch
-    if (!process.env.IS_TEST) win.webContents.openDevTools();
-  } else {
-    createProtocol("app");
-    // Load the index.html when not in development
-    win.loadURL("app://./index.html");
-  }
-
-  win.webContents.on('did-finish-load', () => {
-
-    const ws = new WebSocket("ws://localhost:8080");
-    ws.on("open", function open() {
-      // ws.send("hernandeze2@xavier.edu");
-    });
-    ws.on("message", (message: any) => {
-      const parsed = JSON.parse(message);
-      console.log('new message', message)
-      if (win) {
-        win.webContents.send('render-message', {
-          message: parsed
-        })
-      }
-    });
-
-    ipcMain.on('update-menu-bar', (Event: any, payload: any) => {
-    // win.setTitle("Listening...");
-    })
-
-    ipcMain.on('send-message', (Event: any, payload: any) => {
-      ws.send(JSON.stringify(payload));
-      // win.setTitle("Listening...");
-    })
-
-    ipcMain.on('update-recorder', (Event: any, record: boolean) => {
-     if (record) {
-       // start recording
-     } else {
-       // stop recording
-     }
-    })
-  })
-
-  win.on("closed", () => {
-    win = null;
-  });
-}
-
-// 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();
-  }
-});
-
-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();
-  }
-});
-
-// 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 (isDevelopment && !process.env.IS_TEST) {
-    // Install Vue Devtools
     try {
-      await installExtension(VUEJS_DEVTOOLS);
+        // await authenticate method
+        initApp(isDevelopment);
     } catch (e) {
-      console.error("Vue Devtools failed to install:", e.toString());
+        console.log("Error", e);
     }
-  }
-  createWindow();
-});
 
-// Exit cleanly on request from parent process in development mode.
-if (isDevelopment) {
-  if (process.platform === "win32") {
-    process.on("message", data => {
-      if (data === "graceful-exit") {
-        app.quit();
-      }
-    });
-  } else {
-    process.on("SIGTERM", () => {
-      app.quit();
-    });
-  }
-}
\ No newline at end of file
+})();
diff --git a/src/background/initApp.ts b/src/background/initApp.ts
new file mode 100644 (file)
index 0000000..e0ea203
--- /dev/null
@@ -0,0 +1,100 @@
+"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);
+    // NOTE uncomment for dev tools on app launch
+    if (!process.env.IS_TEST) win.webContents.openDevTools();
+  } else {
+    createProtocol("app");
+    // Load the index.html when not in development
+    win.loadURL("app://./index.html");
+  }
+
+  win.webContents.on('did-finish-load', () => {
+      // do stuff once window has finished loading
+  })
+
+  win.on("closed", () => {
+    win = null;
+  });
+}
+
+export function initApp(isDev: boolean){
+
+    // Scheme must be registered before the app is ready
+    protocol.registerSchemesAsPrivileged([
+      { scheme: "app", privileges: { secure: true, standard: true } }
+    ]);
+
+    // 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();
+    });
+
+    // 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();
+      }
+    });
+
+    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();
+      }
+    });
+
+    // Exit cleanly on request from parent process in development mode.
+    if (isDev) {
+      if (process.platform === "win32") {
+        process.on("message", data => {
+          if (data === "graceful-exit") {
+            app.quit();
+          }
+        });
+      } else {
+        process.on("SIGTERM", () => {
+          app.quit();
+        });
+      }
+    }
+}
+
index f47a228af55232441be5c07a048f371c1a102df0..36f93baf73e190c1141413903c6bafb98fad9fb0 100644 (file)
@@ -4,10 +4,11 @@ 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 {
-  start(): void;
   stop(): string;
+  pause(): void;
 }
 
 class StringWritable extends Writable {
@@ -25,55 +26,88 @@ class StringWritable extends Writable {
        chunk = this._decoder.write(chunk);
      }
      this.data += chunk;
+     console.log('writing');
      callback();
    }
 
    _final(callback: (error? : Error) => void) {
+     console.log('yayayay');
      this.data += this._decoder.end();
      callback();
    }
+}
+
+type inputOptions = {clear
 
+    channelCount: number,
+    sampleFormat: string,
+    sampleRate: number,
+    deviceId: number,
+    closeOnError: boolean
 }
 
 export class Recorder implements RecorderI {
-  
+
   private ia: any;
   private micWritable: StringWritable;
+  private recorderOptions: inputOptions;
 
-  constructor(options: {
-
-  }) { 
-    this.ia = new portAudio.AudioIO({ 
-      inOptions: options
-    });   
+  constructor(options: inputOptions, encoding: string) {
+    this.recorderOptions = options;
     this.micWritable = new StringWritable({
-      defaultEncoding: 'binary'
-    });
-    this.start();
-  }
-
-  start(): void {
-    console.log('inititate recording');
-    this.ia.pipe(this.micWritable);
-    this.ia.start();
-    this.ia.pause();
+        defaultEncoding: encoding
+    })
+    this.restart();
+    ipcMain.on('update-recorder', this._update);
   }
 
-  record(): void {
-    this.ia.resume();
+  restart() {
+    this.ia = new portAudio.AudioIO({
+      inOptions: this.recorderOptions
+    });
+    this._start();
   }
 
   pause(): void {
      this.ia.pause();
   }
 
+  resume(){
+      this.ia.resume();
+  }
+
   getData(): string {
     return this.micWritable.data;
   }
 
   stop(): string {
     this.ia.quit();
-    return this.micWritable.data;
+    return this.getData();
+  }
+
+  private _start(): void {
+    this.ia.pipe(this.micWritable);
+    this.ia.start();
+    this.pause();
   }
 
+  private _update = (Event: any, record: boolean) => {
+      if (record) {
+          console.log('recording');
+          this.micWritable.data = '';
+          if(this.ia._readableState.paused){
+            this.resume();
+            return;
+          }
+          this.ia.pipe(this.micWritable);
+
+          console.log(this.ia._readableState.paused);
+      } else {
+          console.log('stop recording');
+          this.ia.unpipe(this.micWritable);
+          this.micWritable.on('finish', () => {
+              console.log('hello');
+          })
+      }
+  }
 }