
## @coolgk/token
a javascript / typescript module

`npm install @coolgk/token`

an expirable, revocable, renewable token with data storage

Report bugs here: [https://github.com/coolgk/node-utils/issues](https://github.com/coolgk/node-utils/issues)
## Examples
```javascript
import { Token } from '@coolgk/token';
import { createClient } from 'redis';
// OR
// const { Token } = require('@coolgk/token');
// const createClient = require('redis').createClient;

(async () => {

    const redisClient = createClient({
        host: 'localhost',
        port: 6379,
        password: '----'
    });

    const token = new Token({
        redisClient: redisClient,
        expiry: 5,
        token: 'abcde'
    });

    console.log(
        await token.verify()
    ) // false

    await token.renew();

    console.log(
        await token.verify()
    ) // true

    console.log(
        await token.get('var1');
    ); // null

    console.log(
        await token.getAll()
    ); // {}

    await token.set('var1', {a: 'var1', b: false});

    console.log(
        await token.get('var1');
    ); // {a: 'var1', b: false}

    await token.set('var2', 'string var 2');

    console.log(
        await token.getAll()
    ); // { var1: { a: 'var1', b: false }, var2: 'string var 2' }

    await token.delete('var2');

    console.log(
        await token.get('var2');
    ); // null

    console.log(
        await token.getAll()
    ); // { var1: { a: 'var1', b: false } }

    await token.destroy();

    console.log(
        await token.verify()
    ) // false

    console.log(
        await token.get('var1');
    ); // null

    console.log(
        await token.getAll()
    ); // {}

    redisClient.quit();
})()

```
## Classes

<dl>
<dt><a href="#Token">Token</a></dt>
<dd></dd>
</dl>

## Constants

<dl>
<dt><a href="#TokenError">TokenError</a> : <code>object</code></dt>
<dd><p>Error Codes</p>
</dd>
</dl>

<a name="Token"></a>

## Token
**Kind**: global class  

* [Token](#Token)
    * [new Token(options)](#new_Token_new)
    * [.renew([expiry])](#Token+renew) ⇒ <code>promise</code>
    * [.set(name, value)](#Token+set) ⇒ <code>promise</code>
    * [.verify()](#Token+verify) ⇒ <code>promise.&lt;boolean&gt;</code>
    * [.get(name)](#Token+get) ⇒ <code>promise</code>
    * [.destroy()](#Token+destroy) ⇒ <code>promise</code>
    * [.delete(name)](#Token+delete) ⇒ <code>promise</code>
    * [.getAll()](#Token+getAll) ⇒ <code>promise.&lt;{}&gt;</code>
    * [.setToken(token)](#Token+setToken)

<a name="new_Token_new"></a>

### new Token(options)

| Param | Type | Default | Description |
| --- | --- | --- | --- |
| options | <code>object</code> |  |  |
| options.token | <code>string</code> |  | token string for creating a token object |
| options.redisClient | <code>object</code> |  | redis client from redis.createClient() |
| [options.prefix] | <code>string</code> | <code>&quot;&#x27;token&#x27;&quot;</code> | prefix used in redis e.g. token:[TOKEN_STRING...] |
| [options.expiry] | <code>number</code> | <code>0</code> | in seconds. 0 = never expire |

<a name="Token+renew"></a>

### token.renew([expiry]) ⇒ <code>promise</code>
**Kind**: instance method of [<code>Token</code>](#Token)  

| Param | Type | Description |
| --- | --- | --- |
| [expiry] | <code>number</code> | in seconds |

<a name="Token+set"></a>

### token.set(name, value) ⇒ <code>promise</code>
set a data field value

**Kind**: instance method of [<code>Token</code>](#Token)  

| Param | Type | Description |
| --- | --- | --- |
| name | <code>string</code> | field name |
| value | <code>\*</code> | anything can be JSON.stringify'ed |

<a name="Token+verify"></a>

### token.verify() ⇒ <code>promise.&lt;boolean&gt;</code>
verify if token has expired

**Kind**: instance method of [<code>Token</code>](#Token)  
<a name="Token+get"></a>

### token.get(name) ⇒ <code>promise</code>
get the value of a data field

**Kind**: instance method of [<code>Token</code>](#Token)  

| Param | Type | Description |
| --- | --- | --- |
| name | <code>string</code> | data field name |

<a name="Token+destroy"></a>

### token.destroy() ⇒ <code>promise</code>
delete the token

**Kind**: instance method of [<code>Token</code>](#Token)  
<a name="Token+delete"></a>

### token.delete(name) ⇒ <code>promise</code>
delete a data field in the token

**Kind**: instance method of [<code>Token</code>](#Token)  

| Param | Type | Description |
| --- | --- | --- |
| name | <code>string</code> | data field name |

<a name="Token+getAll"></a>

### token.getAll() ⇒ <code>promise.&lt;{}&gt;</code>
get the values of all data fields in the token

**Kind**: instance method of [<code>Token</code>](#Token)  
<a name="Token+setToken"></a>

### token.setToken(token)
set a new token string

**Kind**: instance method of [<code>Token</code>](#Token)  

| Param | Type | Description |
| --- | --- | --- |
| token | <code>string</code> | new token string |

<a name="TokenError"></a>

## TokenError : <code>object</code>
Error Codes

**Kind**: global constant  
**Properties**

| Name | Type | Description |
| --- | --- | --- |
| INVALID_TOKEN | <code>string</code> | invalid token string |
| RESERVED_NAME | <code>string</code> | reserved names are used when setting token variables e.g. _timestamp |
| EXPIRED_TOKEN | <code>string</code> | token expired or renew() has not been called |

