]> Repos - mime-chat/commitdiff
send auth payload on websocket open
authorEnrique Hernandez <hernandeze2@xavier.edu>
Tue, 1 Jun 2021 13:50:25 +0000 (09:50 -0400)
committerEnrique Hernandez <hernandeze2@xavier.edu>
Sun, 6 Jun 2021 14:08:57 +0000 (10:08 -0400)
close session on logout
add socket reconnect on close

13 files changed:
.env [deleted file]
package.json
src/App.vue
src/background.ts
src/background/authPayload.ts [new file with mode: 0644]
src/background/ipc/account.ts
src/background/ipc/session.ts
src/background/session.ts
src/background/websockets.ts
src/components/login.vue
src/ipcRend/session.ts
src/modules/http.ts
tests/server.js

diff --git a/.env b/.env
deleted file mode 100644 (file)
index 6aa5026..0000000
--- a/.env
+++ /dev/null
@@ -1,4 +0,0 @@
-
-BUSINESS_URL="http://localhost:3000"
-
-PLATFORM_URL="ws://127.0.0.1:8760"
index 38c1348361c9b89f6208c0a29820d9a7ec3f231e..ac64b5a45242e0ba8437bc9129044f101aeb35fd 100644 (file)
@@ -24,7 +24,6 @@
     "animejs": "^3.2.0",
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
-    "dotenv": "^10.0.0",
     "electron-is-dev": "^2.0.0",
     "electron-store": "^8.0.0",
     "electron-updater": "^4.3.8",
index 5a29c17fef61b23420ee734e8b66130bc86e00a6..99ffe6a8971693f7b292b20606c23da03adbb79a 100644 (file)
@@ -85,8 +85,14 @@ export default defineComponent({
 
     }
 
+    const onSessionAuthFail = (_event: IpcRendererEvent, _payload: null) => {
+        clearProfile();
+    }
+
     onMounted(async () => {
       console.log("APP:mounted.");
+
+      window.ipcRenderer.on("session-auth-fail", onSessionAuthFail)
       window.ipcRenderer.on("update-state", updateState)
       window.ipcRenderer.on("update_available", () => {
           console.log('testing auto update');
@@ -99,17 +105,16 @@ export default defineComponent({
       postMount();
 
       try {
-
         const profile = await invokeProfile() as Profile;
         setProfile(profile);
       } catch(e) {
-          console.log('[AUTH]', e);
+          console.log('[REND] Auth:', e);
           clearProfile();
       } finally {
           ready.value = true;
           if (profile.value.crimataId) {
               // start session
-              postInitSession(profile.value.crimataId);
+              postInitSession();
           }
       }
 
@@ -117,6 +122,7 @@ export default defineComponent({
 
     onUnmounted(() => {
       window.ipcRenderer.removeAllListeners("update-state");
+      window.ipcRenderer.removeAllListeners("session-auth-fail");
     })
 
     return {
index 1ecee8380e50ba418692a8fbfa1d5e0b4927dc74..977c265c38a3e4ca5fba2a1f7c2d373316d8a4a5 100644 (file)
@@ -7,7 +7,6 @@
 
 import { initApp } from './background/init';
 import { protocol } from "electron";
-require('dotenv').config()
 
 // Scheme must be registered before the app is ready
 protocol.registerSchemesAsPrivileged([
@@ -18,9 +17,9 @@ protocol.registerSchemesAsPrivileged([
 const isDev = require('electron-is-dev');
 
 // NOTE Program Begins Here
-(async () => {
+(() => {
 
     console.log('Starting Crimata electron app.');
-    await initApp(isDev);
+    initApp(isDev);
 
 })();
diff --git a/src/background/authPayload.ts b/src/background/authPayload.ts
new file mode 100644 (file)
index 0000000..61d68b6
--- /dev/null
@@ -0,0 +1,13 @@
+
+import { store } from "@/background/store";
+
+interface PlatformAuthProtocol {
+    key: string;
+    crimata_id: string;
+}
+
+export const getAuthPayload = (): PlatformAuthProtocol => ({
+    key: store.get('key'),
+    crimata_id: store.get('crimataId')
+});
+
index c336ac35a7bd3c54e2c19c0ab01dad09a6a4197e..589850918e77e263388a4a566082eb89286cf389 100644 (file)
@@ -5,6 +5,7 @@ import { Profile } from "@/types";
 import { submit, fetchProfile, logout } from "@/api/account";
 import { ipcMain, IpcMainInvokeEvent } from "electron";
 import { store } from "@/background/store";
+import { endSession } from "@/background/session";
 
 
 const parseAuthRes = (authRes: any) => {
@@ -70,7 +71,7 @@ const onLogin = async (
                 resolve(parsed.profile);
 
             } catch(e) {
-                console.log('[API]', e.response);
+                console.log('[API]', e);
                 reject(new Error('Failed to authenticate'));
             }
         }
@@ -94,6 +95,7 @@ const onLogout = async (
             store.delete('crimataId');
 
             // TODO: kill crimata platform session
+            endSession();
 
             resolve();
         } catch(e) {
index a2496dc51310231327ced0928759b63fd1e4a0b0..7c42ea20402d1bd91297c3e90a3d5c7f3d3f9896 100644 (file)
@@ -10,12 +10,12 @@ import { ClientMessage } from "@/types";
 // Instantiate socket session with crimata-platorm.
 const onSessionInit = (
     _event: IpcMainInvokeEvent,
-    cid: string
+    _payload: null
 ): void => {
 
     console.log('[IPC]: init-session');
 
-    initSession(cid);
+    initSession();
 
     initAudioIO();
 }
index fc3e4fdf76b95e45b6158a95303536e67f53d61b..c90d32afcc1f69fb8775ea3c725711f0a4f7397d 100644 (file)
@@ -10,6 +10,7 @@
 
 import { backgroundMitt } from "@/modules/emitter";
 import { ipcEmit, loadState } from './helpers';
+import WebSocket from 'ws';
 
 import useWebSockets from "./websockets";
 
@@ -22,11 +23,17 @@ let win = true;
 // Info saved to json on quit (key, newMessages).
 let state: SessionState;
 
+let socket: WebSocket | null = null;
+
 
 // Calls appropriate endpoint for a server message.
 const onMessage = (data: string): void => {
     let message = JSON.parse(data);
-    console.log('received new message', message);
+
+    if (message === "CLOSE_AUTH_FAIL") {
+        ipcEmit("session-auth-fail", null)
+        return;
+    }
 
     // Standard message.
     if (message.content) {
@@ -85,16 +92,24 @@ export const sendMessage = (payload: Record<string, any>): void => {
 
 }
 
+export const endSession = (): void => {
+    if (socket) {
+        socket.close();
+        socket = null;
+    }
+}
+
 
 // Call this to initialize session with Crimata servers.
-export const initSession = (cid: string): void => {
+export const initSession = (): void => {
     console.log("SESS:Creating new session.")
 
     // Load Json or createState.
     state = loadState("session.json");
 
     // Open socket connection.
-    createSocket();
+    if (!socket)
+    socket = createSocket();
 
     // Keep win up-to-date.
     backgroundMitt.on('window-active', (state: boolean) => {
index 9fcc5e8215bafca59145c6c6ee92cac9b25394b6..70eb7ff00515fdd295f854bc8f8469e51ce9913f 100644 (file)
@@ -1,10 +1,12 @@
+
 "use strict";
 
 import WebSocket from 'ws';
+import { getAuthPayload } from "./authPayload";
 
 let socket: WebSocket;
 
-const socketUrl = process.env.PLATFORM_URL;
+const socketUrl = "ws://127.0.0.1:8760"
 
 // Run every time we want to connect to backend.
 export default function useWebSockets(
@@ -41,7 +43,8 @@ export default function useWebSockets(
     const onOpen = (_event: WebSocket.OpenEvent) => {
 
         console.log("WS:Connected to WS Server!");
-
+        const jwt = getAuthPayload();
+        socket.send(JSON.stringify(jwt));
         if (openCallback) openCallback();
 
     }
@@ -54,29 +57,30 @@ export default function useWebSockets(
 
     }
 
-    const onClose = (_event: WebSocket.CloseEvent) => {
-        console.log("WS:Socket closed normally.")
+    const onClose = (event: WebSocket.CloseEvent) => {
+        console.log("WS:Socket closed normally.", event.wasClean)
+        if (!event.wasClean) {
+            setTimeout(createSocket, 1000);
+        }
     }
 
     // Reconnect automatically on error.
     const onError = (event: WebSocket.ErrorEvent) => {
         console.log("WS:WebSocket error: ", event.message);
-
-        console.log("Attempting reconnect in 1s.")
-        setTimeout(createSocket, 1000)
     }
 
-    const createSocket = () => {
-        if (socketUrl)
-        socket = new WebSocket(socketUrl)
+    const createSocket = (): WebSocket => {
+
+        socket = new WebSocket(socketUrl);
 
         // Add listeners.
-        socket.addEventListener("open", onOpen)
-        socket.addEventListener("message", onServerMessage)
-        socket.addEventListener("close", onClose)
-        socket.addEventListener("error", onError)
+        socket.addEventListener("open", onOpen);
+        socket.addEventListener("message", onServerMessage);
+        socket.addEventListener("close", onClose);
+        socket.addEventListener("error", onError);
+
+        return socket;
 
-        console.log("WS:New socket created.")
     }
 
     return {
index 8232a671bf05ecde82d9a812a0a6505d0027afc6..9467a216f46d46a68d72b7fde1786a026cf3aff9 100644 (file)
@@ -40,13 +40,14 @@ import { authRequest } from '@/modules/message';
 import { useProfile } from '@/modules/auth';
 import { invokeLogin } from "@/ipcRend/account";
 import { Profile } from "@/types";
+import { postInitSession } from "@/ipcRend/session";
 
 export default defineComponent({
   name: "Login",
 
   setup() {
 
-    const { setProfile } = useProfile();
+    const { profile, setProfile } = useProfile();
 
     const usr = ref("");
     const pwd = ref("");
@@ -63,6 +64,13 @@ export default defineComponent({
           setProfile(profile);
 
       } catch(e) {
+        console.log('Error login in.')
+      } finally{
+
+          if (profile.value.crimataId) {
+              // start session
+              postInitSession();
+          }
 
       }
     }
index 966b12118a9692e7ee124395e235929987b97e7b..a5ff5fc0dfb00d69206e76dabe996e5eae694992 100644 (file)
@@ -11,11 +11,13 @@ export const postMount = (): void => (
 );
 
 
-export const postInitSession = (cid: string): void => (
-    post("init-session", cid)
+export const postInitSession = (): void => (
+    post("init-session", null)
 );
 
 
 export const postMessage = (payload: ClientMessage): void => (
     post('client-message', payload)
 );
+
+
index de241e0938ff2007ca377d80c411ed2921444693..a9519a81bfd8fd3270ea24934c9959b4f222dbeb 100644 (file)
@@ -3,7 +3,7 @@ import axios, { AxiosRequestConfig } from 'axios';
 
 const preFix = '/api';
 
-const baseURL = process.env.BUSSINESS_URL + preFix;
+const baseURL = "http://127.0.0.1:3000" + preFix;
 
 
 interface Request {
index 6731be96178d94f479a9eb5a2d5c163a381b26b7..9616e8a8ab1cde05bc84d3f8eb45e4515e81286d 100644 (file)
@@ -6,6 +6,7 @@ const wss = new WebSocket.Server({
 let auth = false;
 
 wss.on("connection", function connection(ws, req) {
+
   ws.on("message", function incoming(message) {
 
     console.log(message)
@@ -19,13 +20,13 @@ wss.on("connection", function connection(ws, req) {
         auth = true;
       } else {
         const parsed = JSON.parse(message);
-        console.log('got a message', message)
+        console.log('got a message', message);
 
       }
 
     } else {
       const parsed = JSON.parse(message);
-      console.log('parsed', parsed)
+      console.log('parsed', parsed);
     }
 
   });