@fullerstack/ngx-jwt
Version:
A simple JWT library for Angular applications
1 lines • 9.2 kB
Source Map (JSON)
{"version":3,"file":"fullerstack-ngx-jwt.mjs","sources":["../../../../libs/ngx-jwt/src/lib/jwt.module.ts","../../../../libs/ngx-jwt/src/lib/jwt.default.ts","../../../../libs/ngx-jwt/src/lib/jwt.service.ts","../../../../libs/ngx-jwt/src/lib/jwt.model.ts","../../../../libs/ngx-jwt/src/fullerstack-ngx-jwt.ts"],"sourcesContent":["/**\n * @license\n * Copyright Neekware Inc. All Rights Reserved.\n *\n * Use of this source code is governed by a proprietary notice\n * that can be found at http://neekware.com/license/PRI.html\n */\n\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class JwtModule {}\n","/**\n * @license\n * Copyright Neekware Inc. All Rights Reserved.\n *\n * Use of this source code is governed by a proprietary notice\n * that can be found at http://neekware.com/license/PRI.html\n */\n\nimport { JwtConfig } from './jwt.model';\n\n/**\n * Default configuration - JWT module\n */\nexport const DefaultJwtConfig: JwtConfig = {\n // default of 1 second. frontend specific\n networkDelay: 1,\n // some backend may still honor requests by `x` seconds after expiry\n expiryLeeway: 5,\n};\n","/**\n * @license\n * Copyright Neekware Inc. All Rights Reserved.\n *\n * Use of this source code is governed by a proprietary notice\n * that can be found at http://neekware.com/license/PRI.html\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Injectable } from '@angular/core';\nimport {\n ApplicationConfig,\n ConfigService,\n DefaultApplicationConfig,\n} from '@fullerstack/ngx-config';\nimport { LoggerService } from '@fullerstack/ngx-logger';\nimport { Base64 } from 'js-base64';\nimport { cloneDeep as ldDeepClone, mergeWith as ldMergeWith } from 'lodash-es';\nimport { DeepReadonly } from 'ts-essentials';\n\nimport { DefaultJwtConfig } from './jwt.default';\n\n/**\n * An injectable class that handles JWT service\n */\n@Injectable({ providedIn: 'root' })\nexport class JwtService {\n private nameSpace = 'JWT';\n options: DeepReadonly<ApplicationConfig> = DefaultApplicationConfig;\n\n /**\n * Class constructor\n * @param options an optional configuration object\n */\n constructor(readonly config: ConfigService, readonly logger: LoggerService) {\n this.options = ldMergeWith(\n ldDeepClone({ jwt: DefaultJwtConfig }),\n this.config.options,\n (dest, src) => (Array.isArray(dest) ? src : undefined)\n );\n\n this.logger.info(`[${this.nameSpace}] JwtService ready ...`);\n }\n\n /**\n * Gets the payload portion of a JWT token\n * @param token JWT token (base64 encrypted)\n * @returns a payload object or null if decode fails\n */\n getPayload<T>(token: string): any {\n let parts = [];\n\n try {\n parts = token.split('.');\n if (parts.length !== 3) {\n throw Error('JWT must have 3 parts');\n }\n } catch (e) {\n this.logger.error(e.message);\n return undefined;\n }\n\n try {\n const decoded = Base64.decode(parts[1]);\n const payload = JSON.parse(decoded);\n return payload as T;\n } catch (e) {\n this.logger.error('Cannot decode the token');\n }\n\n return undefined;\n }\n\n /**\n * Tells if a JWT is token is expired\n * @param payload JWT payload object\n * @return true if JWT is already expired, else false\n */\n isExpired(payload: any): boolean {\n if (typeof payload === 'string') {\n payload = this.getPayload(payload);\n }\n if (payload) {\n const offset = (parseInt(payload.lee, 10) || this.options.jwt.expiryLeeway) * 1000;\n const now = this.utcSeconds();\n const expiry = this.utcSeconds(payload.exp);\n const expired = now > expiry + offset;\n return expired;\n }\n return true;\n }\n\n /**\n * Calculates the next refresh time\n * @param payload JWT payload object\n * @param offset if true, a random time is added to the refresh time\n * where networkDelay < random < leeway\n * @returns total number of seconds till expiry or 0 if token is expired\n */\n getRefreshTime(payload: any, offset = true): number {\n if (typeof payload === 'string') {\n payload = this.getPayload(payload);\n }\n if (payload && !this.isExpired(payload)) {\n const now = this.utcSeconds();\n const expiry = this.utcSeconds(payload.exp);\n const refresh = Math.floor((expiry - now) / 1000);\n const random = this.getRandomOffset(payload);\n const time = offset ? refresh + random : refresh;\n return time;\n }\n return 0;\n }\n\n /**\n * Calculates a random number where networkDelay < random < leeway\n * @param payload JWT payload object\n * @returns a random total number of seconds\n */\n private getRandomOffset(payload: any): number {\n if (typeof payload === 'string') {\n payload = this.getPayload(payload);\n }\n const leeway = payload?.leeway || payload?.lee || this.options?.jwt?.expiryLeeway;\n const range = {\n lower: 1,\n upper: leeway - this.options?.jwt?.networkDelay || 2,\n };\n return Math.floor(Math.random() * range.upper + range.lower);\n }\n\n /**\n * Calculates the UTC value of date/time in seconds\n * @param input date/time in seconds\n * @returns UTC value of date/time in seconds\n */\n private utcSeconds(input?: number): number {\n return input ? new Date(0).setUTCSeconds(input).valueOf() : new Date().valueOf();\n }\n}\n","/**\n * @license\n * Copyright Neekware Inc. All Rights Reserved.\n *\n * Use of this source code is governed by a proprietary notice\n * that can be found at http://neekware.com/license/PRI.html\n */\n\n/**\n * JWT config declaration\n */\nexport class JwtConfig {\n // http request round-trip in seconds\n networkDelay?: number;\n // refresh expired token up to leeway amount in seconds\n expiryLeeway?: number;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ldMergeWith","ldDeepClone"],"mappings":"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"}