@eggjs/cookies 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/README.zh-CN.md +76 -0
- package/dist/commonjs/cookie.d.ts +62 -0
- package/dist/commonjs/cookie.js +101 -0
- package/dist/commonjs/cookies.d.ts +43 -0
- package/dist/commonjs/cookies.js +271 -0
- package/dist/commonjs/error.d.ts +3 -0
- package/dist/commonjs/error.js +11 -0
- package/dist/commonjs/index.d.ts +4 -0
- package/dist/commonjs/index.js +21 -0
- package/dist/commonjs/keygrip.d.ts +11 -0
- package/dist/commonjs/keygrip.js +120 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/esm/cookie.d.ts +62 -0
- package/dist/esm/cookie.js +94 -0
- package/dist/esm/cookies.d.ts +43 -0
- package/dist/esm/cookies.js +264 -0
- package/dist/esm/error.d.ts +3 -0
- package/dist/esm/error.js +7 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/keygrip.d.ts +11 -0
- package/dist/esm/keygrip.js +113 -0
- package/dist/esm/package.json +3 -0
- package/package.json +72 -0
- package/src/cookie.ts +160 -0
- package/src/cookies.ts +311 -0
- package/src/error.ts +6 -0
- package/src/index.ts +4 -0
- package/src/keygrip.ts +129 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CookieError = void 0;
|
|
4
|
+
class CookieError extends Error {
|
|
5
|
+
constructor(message, options) {
|
|
6
|
+
super(message, options);
|
|
7
|
+
this.name = this.constructor.name;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.CookieError = CookieError;
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBYSxXQUFZLFNBQVEsS0FBSztJQUNwQyxZQUFZLE9BQWUsRUFBRSxPQUFzQjtRQUNqRCxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBTEQsa0NBS0MifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./cookies.js"), exports);
|
|
18
|
+
__exportStar(require("./cookie.js"), exports);
|
|
19
|
+
__exportStar(require("./error.js"), exports);
|
|
20
|
+
__exportStar(require("./keygrip.js"), exports);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUE2QjtBQUM3Qiw4Q0FBNEI7QUFDNUIsNkNBQTJCO0FBQzNCLCtDQUE2QiJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class Keygrip {
|
|
2
|
+
#private;
|
|
3
|
+
constructor(keys: string[]);
|
|
4
|
+
encrypt(data: string, key?: string): Buffer;
|
|
5
|
+
decrypt(data: string | Buffer): {
|
|
6
|
+
value: Buffer;
|
|
7
|
+
index: number;
|
|
8
|
+
} | false;
|
|
9
|
+
sign(data: string | Buffer, key?: string): string;
|
|
10
|
+
verify(data: string, digest: string): number;
|
|
11
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Keygrip = void 0;
|
|
7
|
+
const node_util_1 = require("node:util");
|
|
8
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
9
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
10
|
+
const debug = (0, node_util_1.debuglog)('@eggjs/cookies:keygrip');
|
|
11
|
+
const KEY_LEN = 32;
|
|
12
|
+
const IV_SIZE = 16;
|
|
13
|
+
const passwordCache = new Map();
|
|
14
|
+
const replacer = {
|
|
15
|
+
'/': '_',
|
|
16
|
+
'+': '-',
|
|
17
|
+
'=': '',
|
|
18
|
+
};
|
|
19
|
+
function constantTimeCompare(a, b) {
|
|
20
|
+
if (a.length !== b.length) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return node_crypto_1.default.timingSafeEqual(a, b);
|
|
24
|
+
}
|
|
25
|
+
// patch from https://github.com/crypto-utils/keygrip
|
|
26
|
+
class Keygrip {
|
|
27
|
+
#keys;
|
|
28
|
+
#hash = 'sha256';
|
|
29
|
+
#cipher = 'aes-256-cbc';
|
|
30
|
+
constructor(keys) {
|
|
31
|
+
(0, node_assert_1.default)(Array.isArray(keys) && keys.length > 0, 'keys must be provided and should be an array');
|
|
32
|
+
this.#keys = keys;
|
|
33
|
+
}
|
|
34
|
+
// encrypt a message
|
|
35
|
+
encrypt(data, key) {
|
|
36
|
+
key = key || this.#keys[0];
|
|
37
|
+
const password = keyToPassword(key);
|
|
38
|
+
const cipher = node_crypto_1.default.createCipheriv(this.#cipher, password.key, password.iv);
|
|
39
|
+
return crypt(cipher, data);
|
|
40
|
+
}
|
|
41
|
+
// decrypt a single message
|
|
42
|
+
// returns false on bad decrypts
|
|
43
|
+
decrypt(data) {
|
|
44
|
+
// decrypt every key
|
|
45
|
+
const keys = this.#keys;
|
|
46
|
+
for (let i = 0; i < keys.length; i++) {
|
|
47
|
+
const value = this.#decryptByKey(data, keys[i]);
|
|
48
|
+
if (value !== false) {
|
|
49
|
+
return { value, index: i };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
#decryptByKey(data, key) {
|
|
55
|
+
try {
|
|
56
|
+
const password = keyToPassword(key);
|
|
57
|
+
const cipher = node_crypto_1.default.createDecipheriv(this.#cipher, password.key, password.iv);
|
|
58
|
+
return crypt(cipher, data);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
debug('crypt error: %s', err);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
sign(data, key) {
|
|
66
|
+
// default to the first key
|
|
67
|
+
key = key || this.#keys[0];
|
|
68
|
+
// url safe base64
|
|
69
|
+
return node_crypto_1.default
|
|
70
|
+
.createHmac(this.#hash, key)
|
|
71
|
+
.update(data)
|
|
72
|
+
.digest('base64')
|
|
73
|
+
.replace(/\/|\+|=/g, x => {
|
|
74
|
+
return replacer[x];
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
verify(data, digest) {
|
|
78
|
+
const keys = this.#keys;
|
|
79
|
+
for (let i = 0; i < keys.length; i++) {
|
|
80
|
+
const key = keys[i];
|
|
81
|
+
if (constantTimeCompare(Buffer.from(digest), Buffer.from(this.sign(data, key)))) {
|
|
82
|
+
debug('data %s match key %s, index: %d', data, key, i);
|
|
83
|
+
return i;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return -1;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.Keygrip = Keygrip;
|
|
90
|
+
function crypt(cipher, data) {
|
|
91
|
+
const text = Buffer.isBuffer(data) ? cipher.update(data) : cipher.update(data, 'utf-8');
|
|
92
|
+
const pad = cipher.final();
|
|
93
|
+
return Buffer.concat([text, pad]);
|
|
94
|
+
}
|
|
95
|
+
function keyToPassword(key) {
|
|
96
|
+
if (passwordCache.has(key)) {
|
|
97
|
+
return passwordCache.get(key);
|
|
98
|
+
}
|
|
99
|
+
// Simulate EVP_BytesToKey.
|
|
100
|
+
// see https://github.com/nodejs/help/issues/1673#issuecomment-503222925
|
|
101
|
+
const bytes = Buffer.alloc(KEY_LEN + IV_SIZE);
|
|
102
|
+
let lastHash = null, nBytes = 0;
|
|
103
|
+
while (nBytes < bytes.length) {
|
|
104
|
+
const hash = node_crypto_1.default.createHash('md5');
|
|
105
|
+
if (lastHash)
|
|
106
|
+
hash.update(lastHash);
|
|
107
|
+
hash.update(key);
|
|
108
|
+
lastHash = hash.digest();
|
|
109
|
+
lastHash.copy(bytes, nBytes);
|
|
110
|
+
nBytes += lastHash.length;
|
|
111
|
+
}
|
|
112
|
+
// Use these for decryption.
|
|
113
|
+
const password = {
|
|
114
|
+
key: bytes.subarray(0, KEY_LEN),
|
|
115
|
+
iv: bytes.subarray(KEY_LEN, bytes.length),
|
|
116
|
+
};
|
|
117
|
+
passwordCache.set(key, password);
|
|
118
|
+
return password;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Z3JpcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9rZXlncmlwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlDQUFxQztBQUNyQyw4REFBa0Q7QUFDbEQsOERBQWlDO0FBRWpDLE1BQU0sS0FBSyxHQUFHLElBQUEsb0JBQVEsRUFBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBRWpELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNuQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUVoQyxNQUFNLFFBQVEsR0FBMkI7SUFDdkMsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxFQUFFO0NBQ1IsQ0FBQztBQUVGLFNBQVMsbUJBQW1CLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDL0MsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLHFCQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQscURBQXFEO0FBRXJELE1BQWEsT0FBTztJQUNULEtBQUssQ0FBVztJQUNoQixLQUFLLEdBQUcsUUFBUSxDQUFDO0lBQ2pCLE9BQU8sR0FBRyxhQUFhLENBQUM7SUFFakMsWUFBWSxJQUFjO1FBQ3hCLElBQUEscUJBQU0sRUFBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLDhDQUE4QyxDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixPQUFPLENBQUMsSUFBWSxFQUFFLEdBQVk7UUFD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
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export interface CookieSetOptions {
|
|
2
|
+
/**
|
|
3
|
+
* The path for the cookie to be set in
|
|
4
|
+
*/
|
|
5
|
+
path?: string | null;
|
|
6
|
+
/**
|
|
7
|
+
* The domain for the cookie
|
|
8
|
+
*/
|
|
9
|
+
domain?: string | (() => string);
|
|
10
|
+
/**
|
|
11
|
+
* Is overridable
|
|
12
|
+
*/
|
|
13
|
+
overwrite?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Is the same site
|
|
16
|
+
*/
|
|
17
|
+
sameSite?: string | boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Encrypt the cookie's value or not
|
|
20
|
+
*/
|
|
21
|
+
encrypt?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Max age for browsers
|
|
24
|
+
*/
|
|
25
|
+
maxAge?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Expire time
|
|
28
|
+
*/
|
|
29
|
+
expires?: Date;
|
|
30
|
+
/**
|
|
31
|
+
* Is for http only
|
|
32
|
+
*/
|
|
33
|
+
httpOnly?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Encrypt the cookie's value or not
|
|
36
|
+
*/
|
|
37
|
+
secure?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Is it signed or not.
|
|
40
|
+
*/
|
|
41
|
+
signed?: boolean | number;
|
|
42
|
+
/**
|
|
43
|
+
* Is it partitioned or not.
|
|
44
|
+
*/
|
|
45
|
+
partitioned?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Remove unpartitioned same name cookie or not.
|
|
48
|
+
*/
|
|
49
|
+
removeUnpartitioned?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* The cookie priority.
|
|
52
|
+
*/
|
|
53
|
+
priority?: 'low' | 'medium' | 'high' | 'LOW' | 'MEDIUM' | 'HIGH';
|
|
54
|
+
}
|
|
55
|
+
export declare class Cookie {
|
|
56
|
+
name: string;
|
|
57
|
+
value: string;
|
|
58
|
+
readonly attrs: CookieSetOptions;
|
|
59
|
+
constructor(name: string, value?: string | null, attrs?: CookieSetOptions);
|
|
60
|
+
toString(): string;
|
|
61
|
+
toHeader(): string;
|
|
62
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
/**
|
|
3
|
+
* RegExp to match field-content in RFC 7230 sec 3.2
|
|
4
|
+
*
|
|
5
|
+
* field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
|
|
6
|
+
* field-vchar = VCHAR / obs-text
|
|
7
|
+
* obs-text = %x80-FF
|
|
8
|
+
*/
|
|
9
|
+
const fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; // eslint-disable-line no-control-regex
|
|
10
|
+
/**
|
|
11
|
+
* RegExp to match Same-Site cookie attribute value.
|
|
12
|
+
* https://en.wikipedia.org/wiki/HTTP_cookie#SameSite_cookie
|
|
13
|
+
*/
|
|
14
|
+
const sameSiteRegExp = /^(?:none|lax|strict)$/i;
|
|
15
|
+
/**
|
|
16
|
+
* RegExp to match Priority cookie attribute value.
|
|
17
|
+
*/
|
|
18
|
+
const PRIORITY_REGEXP = /^(?:low|medium|high)$/i;
|
|
19
|
+
export class Cookie {
|
|
20
|
+
name;
|
|
21
|
+
value;
|
|
22
|
+
attrs;
|
|
23
|
+
constructor(name, value, attrs) {
|
|
24
|
+
assert(fieldContentRegExp.test(name), 'argument name is invalid');
|
|
25
|
+
assert(!value || fieldContentRegExp.test(value), 'argument value is invalid');
|
|
26
|
+
this.name = name;
|
|
27
|
+
this.value = value ?? '';
|
|
28
|
+
this.attrs = mergeDefaultAttrs(attrs);
|
|
29
|
+
assert(!this.attrs.path || fieldContentRegExp.test(this.attrs.path), 'argument option path is invalid');
|
|
30
|
+
if (typeof this.attrs.domain === 'function') {
|
|
31
|
+
this.attrs.domain = this.attrs.domain();
|
|
32
|
+
}
|
|
33
|
+
assert(!this.attrs.domain || fieldContentRegExp.test(this.attrs.domain), 'argument option domain is invalid');
|
|
34
|
+
assert(!this.attrs.sameSite || this.attrs.sameSite === true || sameSiteRegExp.test(this.attrs.sameSite), 'argument option sameSite is invalid');
|
|
35
|
+
assert(!this.attrs.priority || PRIORITY_REGEXP.test(this.attrs.priority), 'argument option priority is invalid');
|
|
36
|
+
if (!value) {
|
|
37
|
+
this.attrs.expires = new Date(0);
|
|
38
|
+
// make sure maxAge is empty
|
|
39
|
+
this.attrs.maxAge = undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
toString() {
|
|
43
|
+
return this.name + '=' + this.value;
|
|
44
|
+
}
|
|
45
|
+
toHeader() {
|
|
46
|
+
let header = this.toString();
|
|
47
|
+
const attrs = this.attrs;
|
|
48
|
+
if (attrs.path) {
|
|
49
|
+
header += '; path=' + attrs.path;
|
|
50
|
+
}
|
|
51
|
+
const maxAge = typeof attrs.maxAge === 'string' ? parseInt(attrs.maxAge, 10) : attrs.maxAge;
|
|
52
|
+
// ignore 0, `session` and other invalid maxAge
|
|
53
|
+
if (maxAge) {
|
|
54
|
+
header += '; max-age=' + Math.round(maxAge / 1000);
|
|
55
|
+
attrs.expires = new Date(Date.now() + maxAge);
|
|
56
|
+
}
|
|
57
|
+
if (attrs.expires) {
|
|
58
|
+
header += '; expires=' + attrs.expires.toUTCString();
|
|
59
|
+
}
|
|
60
|
+
if (attrs.domain) {
|
|
61
|
+
header += '; domain=' + attrs.domain;
|
|
62
|
+
}
|
|
63
|
+
if (attrs.priority) {
|
|
64
|
+
header += '; priority=' + attrs.priority.toLowerCase();
|
|
65
|
+
}
|
|
66
|
+
if (attrs.sameSite) {
|
|
67
|
+
header += '; samesite=' + (attrs.sameSite === true ? 'strict' : attrs.sameSite.toLowerCase());
|
|
68
|
+
}
|
|
69
|
+
if (attrs.secure) {
|
|
70
|
+
header += '; secure';
|
|
71
|
+
}
|
|
72
|
+
if (attrs.httpOnly) {
|
|
73
|
+
header += '; httponly';
|
|
74
|
+
}
|
|
75
|
+
if (attrs.partitioned) {
|
|
76
|
+
header += '; partitioned';
|
|
77
|
+
}
|
|
78
|
+
return header;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function mergeDefaultAttrs(attrs) {
|
|
82
|
+
const merged = {
|
|
83
|
+
path: '/',
|
|
84
|
+
httpOnly: true,
|
|
85
|
+
secure: false,
|
|
86
|
+
overwrite: false,
|
|
87
|
+
sameSite: false,
|
|
88
|
+
partitioned: false,
|
|
89
|
+
priority: undefined,
|
|
90
|
+
...attrs,
|
|
91
|
+
};
|
|
92
|
+
return merged;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nvb2tpZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyx1Q0FBdUMsQ0FBQyxDQUFDLHVDQUF1QztBQUUzRzs7O0VBR0U7QUFDRixNQUFNLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQztBQUVoRDs7R0FFRztBQUNILE1BQU0sZUFBZSxHQUFHLHdCQUF3QixDQUFDO0FBeURqRCxNQUFNLE9BQU8sTUFBTTtJQUNqQixJQUFJLENBQVM7SUFDYixLQUFLLENBQVM7SUFDTCxLQUFLLENBQW1CO0lBRWpDLFlBQVksSUFBWSxFQUFFLEtBQXFCLEVBQUUsS0FBd0I7UUFDdkUsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFDakUsaUNBQWlDLENBQUMsQ0FBQztRQUNyQyxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFN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
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Keygrip } from './keygrip.js';
|
|
2
|
+
import { CookieSetOptions } from './cookie.js';
|
|
3
|
+
export interface DefaultCookieOptions extends CookieSetOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Auto get and set `_CHIPS-` prefix cookie to adaptation CHIPS mode (The default value is false).
|
|
6
|
+
*/
|
|
7
|
+
autoChips?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface CookieGetOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Whether to sign or not (The default value is true).
|
|
12
|
+
*/
|
|
13
|
+
signed?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Encrypt the cookie's value or not (The default value is false).
|
|
16
|
+
*/
|
|
17
|
+
encrypt?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* cookies for egg
|
|
21
|
+
* extend pillarjs/cookies, add encrypt and decrypt
|
|
22
|
+
*/
|
|
23
|
+
export declare class Cookies {
|
|
24
|
+
#private;
|
|
25
|
+
readonly ctx: Record<string, any>;
|
|
26
|
+
readonly app: Record<string, any>;
|
|
27
|
+
readonly secure: boolean;
|
|
28
|
+
constructor(ctx: Record<string, any>, keys: string[], defaultCookieOptions?: DefaultCookieOptions);
|
|
29
|
+
get keys(): Keygrip;
|
|
30
|
+
/**
|
|
31
|
+
* get cookie value by name
|
|
32
|
+
* @param {String} name - cookie's name
|
|
33
|
+
* @param {Object} opts - cookies' options
|
|
34
|
+
* - {Boolean} signed - default to true
|
|
35
|
+
* - {Boolean} encrypt - default to false
|
|
36
|
+
* @return {String} value - cookie's value
|
|
37
|
+
*/
|
|
38
|
+
get(name: string, opts?: CookieGetOptions): string | undefined;
|
|
39
|
+
_get(name: string, opts: CookieGetOptions): string | undefined;
|
|
40
|
+
set(name: string, value: string | null, opts?: CookieSetOptions): this;
|
|
41
|
+
isSameSiteNoneCompatible(userAgent: string): boolean;
|
|
42
|
+
isPartitionedCompatible(userAgent: string): boolean;
|
|
43
|
+
}
|