File size: 1,062 Bytes
b665708
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { strict as assert } from 'node:assert';

export default class Cookie {
    constructor(input) {
        assert(typeof input === 'object');
        this._values = {};

        for (const [ k, v ] of Object.entries(input))
            this.set(k, v);
    }

    set(key, value) {
        const old = this._values[key];
        if (old === value)
            return false;

        this._values[key] = value;
        return true;
    }

    unset(keys) {
        for (const key of keys) delete this._values[key]
    }

    static fromString(str) {
        const obj = {};

        str.split('; ').forEach(cookie => {
            const key = cookie.split('=')[0];
            const value = cookie.split('=').splice(1).join('=');
            obj[key] = value
        })

        return new Cookie(obj)
    }

    toString() {
        return Object.entries(this._values).map(([ name, value ]) => `${name}=${value}`).join('; ')
    }

    toJSON() {
        return this.toString()
    }

    values() {
        return Object.freeze({ ...this._values })
    }
}