All files / src TokenManager.ts

83.33% Statements 25/30
70% Branches 7/10
100% Functions 10/10
83.33% Lines 25/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85                              1x 1x   1x 1x   1x       2x       7x 7x 7x           7x   7x     7x       7x             5x   5x 2x     3x     5x 5x 2x     3x           1x 1x 1x 1x                
// Copyright (C) 2017  Norman Breau
 
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
import * as jwt from 'jsonwebtoken';
import {Token} from './Token';
import {IJWTVerifyOptions} from './IJWTVerifyOptions';
import {JWTVerifyOptionsParser} from './JWTVerifyOptionsParser';
import {randomBytes} from 'crypto';
 
export class TokenManager {
    private secret: string;
 
    public constructor(secret: string) {
        this.secret = secret;
    }
 
    public sign(payload: {[key: string]: any}, expiresIn: string | number): Promise<Token> {
        return new Promise<Token>((resolve, reject) => {
            randomBytes(64, (err: Error, buffer: Buffer) => {
                Iif (err) {
                    reject(err);
                    return;
                }
 
                // eslint-disable-next-line @typescript-eslint/camelcase
                payload.__bt__salt = buffer.toString('hex');
 
                jwt.sign(payload, this.secret, {
                    expiresIn : expiresIn
                }, (error: Error, token: string) => {
                    Iif (error) {
                        return reject(error);
                    }
    
                    return resolve(new Token(token));
                });
            });
        });
    }
 
    public verify(token: Token, options?: IJWTVerifyOptions): Promise<any> {
        return new Promise<any>((resolve, reject) => {
            // placed inside the promise in the event that a reject would be required.
            if (!options) {
                options = {
                    enableExpiration: true
                };
            } else Iif (options.enableExpiration === undefined) {
                options.enableExpiration = true;
            }
            jwt.verify(token.getSignature(), this.secret, JWTVerifyOptionsParser.parse(options), (error, decoded) => {
                if (error) {
                    return reject(error);
                }
 
                return resolve(decoded);
            });
        });
    }
 
    public decode(token: Token): Promise<any> {
        return new Promise<any>((resolve, reject) => {
            try {
                const decoded: any = jwt.decode(token.getSignature());
                resolve(decoded);
            }
            catch (ex) {
                reject(ex);
            }
        });
    }
}