]> Repos - mime-chat/commitdiff
add persistent auth session
authorriqo <hernandeze2@xavier.edu>
Sat, 13 Feb 2021 20:01:37 +0000 (14:01 -0600)
committerriqo <hernandeze2@xavier.edu>
Sat, 13 Feb 2021 20:01:37 +0000 (14:01 -0600)
src/background/session.ts
src/components/taInput/inputController.ts
src/components/taInput/textDetails/textVisualizer.ts
src/modules/auth.ts
src/modules/keyDownHandler/useKeyDownHandler.ts
src/router.ts
src/views/login.vue
src/views/register.vue

index fe0fbf12d0139e2233da88a047ea52bb9c5ddf62..50e9ce6832cc8dbaca3af020ed19556b52bfd3e4 100644 (file)
@@ -40,6 +40,7 @@ const authSession = async (_event, payload: string | UserCreds | null): Promise<
             if (res === 'locked') {
                 reject(res);
             } else {
+                console.log('Success!');
                 auth = true;
                 resolve(res);
             }
@@ -48,11 +49,12 @@ const authSession = async (_event, payload: string | UserCreds | null): Promise<
 
         if (!payload) {
             socket.send('no-token');
-        } else if (typeof payload === 'string' || payload instanceof String) {
+        } else if (payload instanceof String || typeof payload === 'string') {
             socket.send(payload);
         } else {
             socket.send(JSON.stringify(payload));
         }
+
     });
 };
 
@@ -95,18 +97,19 @@ export const initSession = () => {
     socket.binaryType = 'arraybuffer';
 
     // handle renderer auth-token event
-    ipcMain.removeHandler('auth-user'); // avoid setting duplicate handlers
-    ipcMain.handle('auth-user', authSession);
+    ipcMain.removeHandler('auth-session'); // avoid setting duplicate handlers
+    ipcMain.handle('auth-session', authSession);
 
     // Connect to the backend.
     socket.on('open', () => {
-        console.log('Success! Connected to Crimata Servers.');
+        console.log('Connected to Crimata Servers.');
 
-        // fetch token from renderer
+        // call auth renderer event on connection
         backgroundMitt.emit('ipc-renderer', {
-            endpoint: 'fetch-token',
+            endpoint: 'auth',
             message: null
         });
+
         success = true;
 
     });
index fd89d2eb5d4e300223eee84f542e44800d914b4f..bc2b1b6dceb1922ba9ea3bf0bdfa8a2414cdcb79 100644 (file)
@@ -1,4 +1,4 @@
-import { ref, watch, onUnmounted, onMounted } from "vue";
+import { ref, watch, onUnmounted, onMounted, inject } from "vue";
 import useKeyDownHandler from "@/modules/keyDownHandler/useKeyDownHandler";
 import useMediaStream from "@/modules/mediaStream";
 import useAudioVisualizer from './audioDetails/audioVisualizer';
@@ -18,10 +18,29 @@ export default function useInputController() {
     const audioBubbleWidth = ref(10);
     let stream: MediaStream;
 
-    const { keyDownHandler, input } = useKeyDownHandler();
-    const { textInputXoffset, renderTextInput } = useTextVisualizer(input);
+    const emitter: any = inject("mitt");
     const { visualizeStreamAsPaths, expandBubble } = useAudioVisualizer(visualizeStream);
 
+    // send message on ENTER
+    const enterCallback = (input: string) => {
+
+        const message = {
+          audio: 0,
+          text: input
+        };
+        emitter.emit("animateSend", message);
+
+        // await response
+        window.postMessage({
+          myTypeField: 'send-message',
+          message: message
+        }, '*')
+
+    }
+
+    const { keyDownHandler, input } = useKeyDownHandler(enterCallback);
+    const { textInputXoffset, renderTextInput } = useTextVisualizer(input);
+
     // stops stream recording on space key up
     function keyupHandler(e: any) {
         if (e.key === " " && visualizeStream.value) {
index 6a27d48385eb130a7c7301979f199b40b9e801ed..8dbda23d657ee0704e9710eb37b81a33a07c8f88 100644 (file)
@@ -32,7 +32,7 @@ export default function useTextVisualizer(input: Ref<string>) {
         }
     }
 
-    emitter.on("newSelfMessage", async (payload: any) => {
+    emitter.on("animateSend", async (payload: any) => {
         const inputEl = document.getElementsByClassName("inputContainer");
         const foreignEl = inputEl[0] as HTMLElement;
         animateSend(foreignEl, inputHeight.value, input);
index 73edaf319fa2874d1492fa6bda8bde62ed7db536..709a262bc72a622347263dd7d9fdfb43059225cf 100644 (file)
@@ -2,12 +2,12 @@ import { reactive, toRefs } from 'vue';
 import { useIpc } from './ipc';
 
 interface AuthState {
-    accessToken?: string | null;
+    accessToken: string | null;
     error?: Error;
 }
 
 const state = reactive<AuthState>({
-    accessToken: undefined,
+    accessToken: null,
     error: undefined,
 });
 
@@ -16,7 +16,7 @@ const AUTH_KEY = 'crimata_token';
 const token = window.localStorage.getItem(AUTH_KEY);
 
 const authToken = async () => {
-   const { data, invoke  } = useIpc('auth-user');
+   const { data, invoke  } = useIpc('auth-session');
     try {
         await invoke(token);
         state.accessToken = data.value;
@@ -28,29 +28,26 @@ const authToken = async () => {
     }
 }
 
-// authenticate on socket connect
-window.ipcRenderer.on("fetch-token", async (_event, _arg) => {
-    authToken();
+// authenticate on auth event
+window.ipcRenderer.on("auth", async (_event, _arg) => {
+    await authToken();
 });
 
 if (token) {
-    authToken();
+    state.accessToken = token;
 }
 
 export const useAuth = () => {
-    const setToken = (token: string, remember: boolean) => {
-        if (remember) {
-            // Save
-            window.localStorage.setItem(AUTH_KEY, token);
-        }
 
+    const setToken = (token: string) => {
+        window.localStorage.setItem(AUTH_KEY, token);
         state.accessToken = token;
         state.error = undefined;
     }
 
-    const logout = (): Promise<void> => {
+    const logout = (): Promise<null> => {
         window.localStorage.removeItem(AUTH_KEY);
-        return Promise.resolve(state.accessToken = undefined);
+        return Promise.resolve(state.accessToken = null);
     }
 
     return {
index 964956d26cb89dc2251c63ca2b19d8358a43fddd..f8336e0f8b95aebefb2cbeb209d64d3dd6ec2b36 100644 (file)
@@ -1,35 +1,17 @@
-import { ref, inject } from "vue";
+import { ref } from "vue";
 import keyboardNameMap from "./keyBoardMaps/keyboardNameMap";
 import keyboardCharMap from "./keyBoardMaps/keyboardCharMap";
-// This catches keys from a physical keyboard, a soft keyboard on a tablet, or a
-// scanner attached via USB
-export default function useKeyDownHandler() {
-  interface KeyDownEvent {
+
+interface KeyDownEvent {
     keyCode: number;
     shiftKey: boolean;
-  }
-
-  const emitter: any = inject("mitt");
-  const input = ref("");
+}
 
-  // submits newSelfMessage event
-  function handleEnterKey() {
-    // does nothing if input value is empty
-    if (input.value === "") {
-      return;
-    }
-    const message = {
-      text: input.value,
-      audio: 0
-    };
-    // fire event with message payload
-    emitter.emit("newSelfMessage", message);
+// This catches keys from a physical keyboard, a soft keyboard on a tablet, or a
+// scanner attached via USB
+export default function useKeyDownHandler(enterCallback: (input: string) => void | null) {
 
-    window.postMessage({
-      myTypeField: 'send-message',
-      message: message
-    }, '*')
-  }
+  const input = ref("");
 
   function keyDownHandler(e: KeyDownEvent) {
     // keyboardCharMap is an array of arrays, with each inner
@@ -49,7 +31,7 @@ export default function useKeyDownHandler() {
     const cmd = keyboardNameMap[e.keyCode];
     switch (cmd) {
       case "ENTER":
-        handleEnterKey();
+        enterCallback(input.value);
         break;
       case "BACK_SPACE":
         input.value = input.value.slice(0, -1);
@@ -66,4 +48,4 @@ export default function useKeyDownHandler() {
     keyDownHandler,
     input
   };
-}
\ No newline at end of file
+}
index ea74f4e859cccf6e32738e222f15ff8f6de8c76d..8f24e80ca79baea85e06a7aacfcf33c113162437 100644 (file)
@@ -20,7 +20,9 @@ const routes: Array<RouteRecordRaw> = [
     path: "/splash",
     name: "splash",
     component: Splash,
-    meta: { requiresAuth: false },
+    meta: {
+        requiresAuth: false
+    },
   },
   {
     path: "/login",
@@ -41,14 +43,19 @@ const router = createRouter({
   routes
 });
 
+// route auth check
 router.beforeEach((to, from, next) => {
   const { accessToken } = useAuth();
 
   // Not logged into a guarded route?
-  if (to.meta.requiresAuth && !accessToken?.value) next({ name: 'login' });
+  if (to.meta.requiresAuth && !accessToken.value) {
+      next({ name: 'login' })
+  }
 
   // Logged in for an auth route
-  else if ((to.name == 'login' || to.name == 'register') && accessToken!.value) next({ name: 'home' });
+  else if ((to.name == 'login' || to.name == 'register') && accessToken.value){
+      next({ name: 'home' });
+  }
 
   // Carry On...
   else next();
index 5508f00ac141a65652c5d3416ea9199451c82360..25f9bbfdb6481bb37960d0c0a4445300430b31e4 100644 (file)
@@ -21,7 +21,7 @@
     <button class="button" @click.prevent="submit">Submit</button>
 
     <!-- back to login button: position: fixed  -->
-    <button class="button2" @click.prevent="switchView">Create an account</button>  
+    <button class="button2" @click.prevent="switchView">Create an account</button>
   </form>
 </template>
 
@@ -45,9 +45,9 @@ export default defineComponent({
 
     const email = ref("");
     const password = ref("");
-    const rememberMe = ref(false);
+    const rememberMe = ref(true);
 
-    const {  data,  invoke  } = useIpc('auth-user');
+    const {  data,  invoke  } = useIpc('auth-session');
 
     const submit = async () => {
         const payload = {
@@ -57,8 +57,7 @@ export default defineComponent({
         };
         try {
             await invoke(payload);
-            console.log('testing incoke', data.value)
-            setToken(data.value, rememberMe.value);
+            setToken(data.value);
             router.push({ name: "home" });
         } catch(e){
             console.log('Error loging in.')
index 9b8e67397c6ebdd97686da8fb9c2e0bc5565ac86..777f7b4800262c82604772abb5e7c637da97d59c 100644 (file)
 
 <script lang="ts">
 import {
-  computed,
   defineComponent,
-  onErrorCaptured,
-  reactive,
   ref,
-  toRefs,
 } from "vue";
 import { useRouter } from "vue-router";
 import { useIpc } from "@/modules/ipc";
@@ -53,7 +49,7 @@ export default defineComponent({
     const password = ref("");
     const password2 = ref("");
 
-    const { invoke, data,} = useIpc("auth-user");
+    const { invoke, data,} = useIpc("auth-session");
     const { setToken } = useAuth();
     const router = useRouter();
 
@@ -86,7 +82,7 @@ export default defineComponent({
       if (validate()) {
           try {
               await invoke(payload);
-              setToken(data.value, true);
+              setToken(data.value);
               router.push({ name: "home" });
           } catch(e) {
               console.log('Failed to register.')