Best JavaScript code snippet using best
sagas.ts
Source:sagas.ts
1import { call, Effect, fork, put, select } from "redux-saga/effects";2import { calculateTimeLeft } from "../../../components/shared/utils";3import { TMessage } from "../../../components/translatedMessages/utils";4import { TGlobalDependencies } from "../../../di/setupBindings";5import { ICreateJwtEndpointResponse } from "../../../lib/api/auth/SignatureAuthApi";6import { getJwtExpiryDate, hasValidPermissions } from "../../../utils/JWTUtils";7import { EthereumAddressWithChecksum } from "../../../utils/opaque-types/types";8import { EDelayTiming, safeDelay } from "../../../utils/safeTimers";9import { accessWalletAndRunEffect } from "../../access-wallet/sagas";10import { actions } from "../../actions";11import { neuCall, neuTakeLatest } from "../../sagasUtils";12import { selectEthereumAddressWithChecksum } from "../../web3/selectors";13import { AUTH_JWT_TIMING_THRESHOLD, AUTH_TOKEN_REFRESH_THRESHOLD } from "../constants";14import { JwtNotAvailable, MessageSignCancelledError } from "../errors";15import { selectJwt } from "../selectors";16/**17 * Load to store jwt from browser storage18 */19export function* loadJwt({ jwtStorage }: TGlobalDependencies): Iterator<Effect> {20 return jwtStorage.get();21}22/**23 * Save jwt to the browser storage and update the store24 */25export function* setJwt({ jwtStorage }: TGlobalDependencies, jwt: string): Iterator<any> {26 jwtStorage.set(jwt);27 yield put(actions.auth.setJWT(jwt));28}29/**30 * Generates and invokes a signer to sign a challenge.31 */32function* signChallenge(33 { web3Manager, signatureAuthApi, cryptoRandomString, logger }: TGlobalDependencies,34 permissions: Array<string> = [],35): Iterator<any> {36 const address: EthereumAddressWithChecksum = yield select(selectEthereumAddressWithChecksum);37 const salt = cryptoRandomString({ length: 64 });38 if (!web3Manager.personalWallet) {39 throw new Error("Wallet unavailable Error");40 }41 const signerType = web3Manager.personalWallet.getSignerType();42 logger.info("Obtaining auth challenge from api");43 const {44 body: { challenge },45 } = yield signatureAuthApi.challenge(address, salt, signerType, permissions);46 logger.info("Signing challenge");47 const signedChallenge = yield web3Manager.personalWallet.signMessage(challenge);48 logger.info("Challenge signed");49 return {50 challenge,51 signedChallenge,52 signerType,53 };54}55/**56 * Create new JWT from the authentication server.57 */58export function* createJwt(59 { signatureAuthApi, logger }: TGlobalDependencies,60 permissions: Array<string> = [],61): Iterator<any> {62 logger.info("Creating jwt");63 const { signedChallenge, challenge, signerType } = yield neuCall(signChallenge, permissions);64 logger.info("Sending signed challenge back to api");65 const { jwt }: ICreateJwtEndpointResponse = yield signatureAuthApi.createJwt(66 challenge,67 signedChallenge,68 signerType,69 );70 yield neuCall(setJwt, jwt);71 logger.info("Jwt created successfully");72}73/**74 * Escalate JWT with the authentication server.75 * Used to add additional permissions to existing JWT76 */77export function* escalateJwt(78 { signatureAuthApi, logger }: TGlobalDependencies,79 permissions: Array<string> = [],80): Iterator<any> {81 const currentJwt: string = yield select(selectJwt);82 if (!currentJwt) {83 throw new JwtNotAvailable();84 }85 logger.info("Escalating jwt");86 const { signedChallenge, challenge, signerType } = yield neuCall(signChallenge, permissions);87 logger.info("Sending signed challenge back to api");88 const { jwt }: ICreateJwtEndpointResponse = yield signatureAuthApi.escalateJwt(89 challenge,90 signedChallenge,91 signerType,92 );93 yield neuCall(setJwt, jwt);94 logger.info("Jwt escalated successfully");95}96/**97 * Refresh JWT with new default expire date.98 * Permissions expire dates left untouched.99 */100export function* refreshJWT({ signatureAuthApi, logger }: TGlobalDependencies): Iterator<any> {101 logger.info("Refreshing jwt");102 const { jwt }: ICreateJwtEndpointResponse = yield signatureAuthApi.refreshJwt();103 yield neuCall(setJwt, jwt);104 logger.info("Jwt refreshed successfully");105}106/**107 * Saga to ensure all the needed permissions are present and still valid on the current jwt108 * If needed permissions are not present/valid will escalate permissions with authentication server109 */110export function* ensurePermissionsArePresentAndRunEffect(111 { logger }: TGlobalDependencies,112 effect: Iterator<any>,113 permissions: Array<string> = [],114 title: TMessage,115 message?: TMessage,116 inputLabel?: TMessage,117): Iterator<any> {118 const jwt: string = yield select(selectJwt);119 // check whether all permissions are present and still valid120 if (jwt && hasValidPermissions(jwt, permissions)) {121 yield effect;122 return;123 }124 // obtain a freshly signed token with missing permissions125 try {126 const obtainJwtEffect = neuCall(escalateJwt, permissions);127 yield call(accessWalletAndRunEffect, obtainJwtEffect, title, message, inputLabel);128 yield effect;129 } catch (error) {130 if (error instanceof MessageSignCancelledError) {131 logger.info("Signing Cancelled");132 } else {133 throw error;134 }135 }136}137/**138 * Refresh jwt before timing out.139 * In case it's not possible will log out user.140 */141export function* handleJwtTimeout({ logger }: TGlobalDependencies): Iterator<any> {142 try {143 const jwt: string | undefined = yield select(selectJwt);144 if (!jwt) {145 throw new JwtNotAvailable();146 }147 const expiryDate = getJwtExpiryDate(jwt);148 const timeLeft = calculateTimeLeft(expiryDate, true, "milliseconds");149 const timeLeftWithThreshold =150 timeLeft >= AUTH_TOKEN_REFRESH_THRESHOLD ? timeLeft - AUTH_TOKEN_REFRESH_THRESHOLD : timeLeft;151 if (AUTH_JWT_TIMING_THRESHOLD > AUTH_TOKEN_REFRESH_THRESHOLD) {152 throw new Error("Timing threshold should be smaller than token refresh threshold");153 }154 const timing: EDelayTiming = yield safeDelay(timeLeftWithThreshold, {155 threshold: AUTH_JWT_TIMING_THRESHOLD,156 });157 // If timing matches exact refresh jwt158 // in case timeout was delayed (for e.g. hibernation), logout with session timeout message159 switch (timing) {160 case EDelayTiming.EXACT:161 yield neuCall(refreshJWT);162 break;163 case EDelayTiming.DELAYED:164 yield put(actions.auth.jwtTimeout());165 break;166 }167 } catch (e) {168 logger.error("Failed to handle jwt timeout", e);169 throw e;170 }171}172export function* authJwtSagas(): Iterator<Effect> {173 yield fork(neuTakeLatest, actions.auth.setJWT, handleJwtTimeout);...
authentication.service.ts
Source:authentication.service.ts
1import { Injectable } from '@angular/core';2import { HttpClient, HttpHeaders } from '@angular/common/http';3import { JwtHelper } from 'angular2-jwt';4import {Router} from '@angular/router';5import { URL } from '../api-url/url';6import {Observable} from 'rxjs';7import {ConfirmationService} from "primeng/api";8import {User} from "../models/user";9@Injectable({10 providedIn: 'root'11})12export class AuthenticationService {13 authenticated: boolean = false;14 jwtToken: string;15 roles: Array<any> = [];16 display: boolean;17 user: User;18 constructor(private http: HttpClient, private router:Router, private confirmationService: ConfirmationService)19 {20 this.jwtToken = this.loadToken();21 if (this.jwtToken){22 this.authenticated = true;23 }24 }25 login(form: User) {26 return this.http.post(URL+"login", form, { observe: 'response' });27 }28 saveToken(jwtToken) {29 this.jwtToken = jwtToken;30 localStorage.setItem('jwtToken', jwtToken);31 let jwtHelper = new JwtHelper();32 this.roles = jwtHelper.decodeToken(this.jwtToken).roles;33 // this.email = jwtHelper.decodeToken(this.jwtToken).sub;34 }35 getUserAuthenticated(){36 this.jwtToken = localStorage.getItem('jwtToken');37 let jwtHelper = new JwtHelper();38 if (this.jwtToken){39 this.user = jwtHelper.decodeToken(this.jwtToken).user;40 this.roles = jwtHelper.decodeToken(this.jwtToken).roles;41 }42 return this.user ;43 }44 loadToken() {45 this.jwtToken = localStorage.getItem('jwtToken');46 return this.jwtToken;47 }48 register(user) {49 return this.http.put(URL+ "user/register", user);50 }51 resendPassword(email: string){52 return this.http.post(URL+ 'forgotpassword?email='+email, {});53 }54 logout(){55 this.jwtToken= null;56 this.authenticated = false;57 localStorage.removeItem('jwtToken');58 }59 isAdmin(){60 let jwtHelper=new JwtHelper();61 this.jwtToken= localStorage.getItem('jwtToken');62 if (this.jwtToken){63 this.roles=jwtHelper.decodeToken(this.jwtToken).roles;64 for(let r of this.roles) {65 if(r == 'ROLE_LUNCHLADY'){66 return true;67 }68 }69 }70 return false;71 }72 isUser(){73 let jwtHelper=new JwtHelper();74 this.jwtToken= localStorage.getItem('jwtToken');75 if (this.jwtToken){76 this.roles=jwtHelper.decodeToken(this.jwtToken).roles;77 for(let r of this.roles) {78 if(r == 'ROLE_USER'){79 return true;80 }81 }82 }83 }84 show() {85 this.display = true86 }87 onClose() {88 this.display = false89 }...
index.js
Source:index.js
1import Vue from 'vue'2import Vuex from 'vuex'3import jwt_decode from "jwt-decode"4Vue.use(Vuex)5export default new Vuex.Store({6 state: {7 shoppingCart: [],8 jwtToken: null,9 jwtData: null10 },11 getters: {12 getShoppingCart(state) {13 return state.shoppingCart14 },15 isAuthorized(state){16 return state.jwtData != null17 },18 getEmail(state){19 if(!state.jwtData) return null20 return state.jwtData['sub']21 },22 getFirstname(state){23 if(!state.jwtData) return "Kasutaja"24 return state.jwtData['firstname']25 },26 hasRole: (state) => (role) => {27 return state.jwtData['scope'].includes(role)28 }29 },30 mutations: {31 loadCookies(state) {32 state.shoppingCart = JSON.parse(Vue.cookie.get("shopping_cart"))33 state.jwtToken = Vue.cookie.get("jwt")34 if (state.jwtToken) {35 state.jwtData = jwt_decode(state.jwtToken);36 }37 if (!state.shoppingCart) {38 state.shoppingCart = []39 }40 },41 setJwtToken(state, {jwt}) {42 state.jwtToken = jwt43 Vue.cookie.set("jwt", state.jwtToken)44 state.jwtData = jwt_decode(jwt);45 },46 addShoppingItem(state, {item}) {47 state.shoppingCart.push(item)48 Vue.cookie.set("shopping_cart", JSON.stringify(state.shoppingCart))49 },50 changeShoppingItemQuantity(state, {id, amount}) {51 state.shoppingCart[id]['amount'] = amount52 Vue.cookie.set('shopping_cart', JSON.stringify(state.shoppingCart))53 },54 removeShoppingItem(state, {id}) {55 Vue.delete(state.shoppingCart, id)56 Vue.cookie.set("shopping_cart", JSON.stringify(state.shoppingCart))57 },58 logOut(state) {59 Vue.cookie.delete("jwt")60 state.jwtToken = null61 state.jwtData = null62 }63 }...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!