Source: routes/v1/utils.js

"use strict";

const jwt = require("jwt-simple");
const winston = require("winston");

const constants = require("../../constants");
const environment = require("../../environment");
const commonUtils = require("../../utils/commonUtils");


/**
 * Provides functions that are used in API and auth.
 *
 * @module routes/v1/utils
 */
module.exports = {
    /**
     * Generates a new access token for the given user.
     * @param user {User}
     * @return {{token: String, expires: number}}
     * @see http://jonatan.nilsson.is/stateless-tokens-with-jwt/
     */
    generateAccessToken: function (user) {
        winston.debug("Generating access token for %j", {"user": user.toString()}, {});
        const expires = commonUtils.expiresInDays(constants.accessTokenExpireDays);

        /**
         * @type TokenPayload
         */
        const payload = {
            userId: user.id,
            expires: expires,
            type: "access"
        };


        const token = jwt.encode(payload, environment.accessTokenSecret, environment.jwtAlgorithm);

        return {
            token: token,
            expires: expires
        };
    },


    /**
     * Generates a new game token for the given user.
     * @param user {User}
     * @return {{token: String, expires: number}}
     * @see http://jonatan.nilsson.is/stateless-tokens-with-jwt/
     */
    generateGameToken: function (user) {
        const expires = commonUtils.expiresInSeconds(constants.gameTokenExpireSeconds);

        /**
         * @type TokenPayload
         */
        const payload = {
            userId: user.id,
            expires: expires,
            type: "game"
        };

        const token = jwt.encode(payload, environment.gameTokenSecret, environment.jwtAlgorithm);

        return {
            token: token,
            expires: expires
        };
    }
};

/**
 * Body of a token generated by this backend.
 *
 * @typedef {Object} TokenPayload
 * @property {number} expires   - when does the token expire
 * @property {string} userId    - what is the user's id
 * @property {string} type      - type of the token.
 */