@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 ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017-present Alibaba Group Holding Limited and other contributors.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # @eggjs/cookies
2
+
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![build status][ci-image]][ci-url]
5
+ [![Test coverage][codecov-image]][codecov-url]
6
+ [![npm download][download-image]][download-url]
7
+
8
+ [npm-image]: https://img.shields.io/npm/v/@eggjs/cookies.svg?style=flat-square
9
+ [npm-url]: https://npmjs.org/package/@eggjs/cookies
10
+ [ci-image]: https://github.com/eggjs/egg-cookies/actions/workflows/nodejs.yml/badge.svg
11
+ [ci-url]: https://github.com/eggjs/egg-cookies/actions/workflows/nodejs.yml
12
+ [codecov-image]: https://codecov.io/gh/eggjs/egg-cookies/branch/master/graph/badge.svg
13
+ [codecov-url]: https://codecov.io/gh/eggjs/egg-cookies
14
+ [download-image]: https://img.shields.io/npm/dm/@eggjs/cookies.svg?style=flat-square
15
+ [download-url]: https://npmjs.org/package/@eggjs/cookies
16
+
17
+ Extends [pillarjs/cookies](https://github.com/pillarjs/cookies) to adapt koa and egg with some additional features.
18
+
19
+ ## Encrypt
20
+
21
+ `@eggjs/cookies` provide an alternative `encrypt` mode like `signed`. An encrypt cookie's value will be encrypted base on keys. Anyone who don't have the keys are unable to know the original cookie's value.
22
+
23
+ ```ts
24
+ import { Cookies } from '@eggjs/cookies';
25
+
26
+ const cookies = new Cookies(ctx, keys[, defaultCookieOptions]);
27
+
28
+ cookies.set('foo', 'bar', { encrypt: true });
29
+ cookies.get('foo', { encrypt: true });
30
+ ```
31
+
32
+ **Note: you should both indicating in get and set in pairs.**
33
+
34
+ ## Cookie Length Check
35
+
36
+ [Browsers all had some limitation in cookie's length](http://browsercookielimits.squawky.net/), so if set a cookie with an extremely long value(> 4093), `@eggjs/cookies` will emit an `cookieLimitExceed` event. You can listen to this event and record.
37
+
38
+ ```ts
39
+ import { Cookies } from '@eggjs/cookies';
40
+
41
+ const cookies = new Cookies(ctx, keys);
42
+
43
+ cookies.on('cookieLimitExceed', ({ name, value }) => {
44
+ // log
45
+ });
46
+
47
+ cookies.set('foo', longText);
48
+ ```
49
+
50
+ ## License
51
+
52
+ [MIT](LICENSE)
53
+
54
+ ## Contributors
55
+
56
+ [![Contributors](https://contrib.rocks/image?repo=eggjs/egg-cookies)](https://github.com/eggjs/egg-cookies/graphs/contributors)
57
+
58
+ Made with [contributors-img](https://contrib.rocks).
@@ -0,0 +1,76 @@
1
+ # @eggjs/cookies
2
+
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![build status][ci-image]][ci-url]
5
+ [![Test coverage][codecov-image]][codecov-url]
6
+ [![npm download][download-image]][download-url]
7
+
8
+ [npm-image]: https://img.shields.io/npm/v/@eggjs/cookies.svg?style=flat-square
9
+ [npm-url]: https://npmjs.org/package/@eggjs/cookies
10
+ [ci-image]: https://github.com/eggjs/egg-cookies/actions/workflows/nodejs.yml/badge.svg
11
+ [ci-url]: https://github.com/eggjs/egg-cookies/actions/workflows/nodejs.yml
12
+ [codecov-image]: https://codecov.io/gh/eggjs/egg-cookies/branch/master/graph/badge.svg
13
+ [codecov-url]: https://codecov.io/gh/eggjs/egg-cookies
14
+ [download-image]: https://img.shields.io/npm/dm/@eggjs/cookies.svg?style=flat-square
15
+ [download-url]: https://npmjs.org/package/@eggjs/cookies
16
+
17
+ 为 egg 提供 cookie 操作的封装。
18
+
19
+ ```ts
20
+ ctx.cookies = new Cookies(ctx, keys[, defaultCookieOptions]);
21
+
22
+ ctx.cookies.get('key', 'value', options);
23
+ ctx.cookies.set('key', 'value', options);
24
+ ```
25
+
26
+ ## 初始化
27
+
28
+ 初始化时需要传递 Array 类型 的keys 参数,否则无法使用 cookies 的 `signed` 和 `encrypt` 功能。
29
+
30
+ 每次设置或读取 signed cookie 或者 encrypt cookie 的时候,会用 keys 进行加密。每次加密都通过 keys 数组的第一个 key 进行加密,解密会从先到后逐个 key 尝试解密。读取 signed cookie 时,如果发现不是用第一个 key 进行加密时,会更新签名为第一个 key 加密的值。读取 encrypt cookie 时不会进行更新操作。
31
+
32
+ ### `defaultCookieOptions`
33
+
34
+ 全局默认配置:
35
+
36
+ - autoChips - `Boolean` 是否开启 [CHIPS](https://developers.google.com/privacy-sandbox/3pcd/chips#security_design) 的自动适配方案,
37
+ 会自动给 Cookie 新增一个 `_CHIPS-` 为前缀的分区 Cookie,优先读取非分区 Cookie,读取失败则尝试读取 `_CHIPS-` 前缀的同名 Cookie 适配三方 Cookie 禁止逻辑。
38
+ 一旦 `cookies.set` 设置 `partitioned=true`,那么会强制忽略 `autoChips` 参数。
39
+
40
+ ## 设置 cookie
41
+
42
+ 通过 `cookies.set(key, value, options)` 的方式来设置一个 cookie。其中 options 支持的参数有:
43
+
44
+ - path - `String` cookie 的有效路径,默认为 `/`。
45
+ - domain - `String` cookie 的有效域名范围,默认为 `undefined`。
46
+ - expires - `Date` cookie 的失效时间。
47
+ - maxAge - `Number` cookie 的最大有效时间,如果设置了 maxAge,将会覆盖 expires 的值。
48
+ - secure - `Boolean` 是否只在加密信道中传输,注意,如果请求为 http 时,不允许设置为 `true`,https 时自动设置为 `true`。
49
+ - partitioned - `Boolean` 是否设置独立分区状态([CHIPS](https://developers.google.com/privacy-sandbox/3pcd/chips))的 Cookie。注意,只有 `secure` 为 `true` 的时候此配置才会生效。
50
+ - removeUnpartitioned - `Boolean` 是否删除非独立分区状态的同名 cookie。注意,只有 `partitioned` 为 `true` 的时候此配置才会生效。
51
+ - httpOnly - `Boolean` 如果设置为 `true`,则浏览器中不允许读取这个 cookie 的值。
52
+ - overwrite - `Boolean` 如果设置为 `true`,在一个请求上重复写入同一个 key 将覆盖前一次写入的值,默认为 `false`。
53
+ - signed - `Boolean` 是否需要对 cookie 进行签名,需要配合 get 时传递 signed 参数,此时前端无法篡改这个 cookie,默认为 `true`。
54
+ - encrypt - `Boolean` 是否需要对 cookie 进行加密,需要配合 get 时传递 encrypt 参数,此时前端无法读到真实的 cookie 值,默认为 `false`。
55
+ - priority - `String` 表示 cookie 优先级的字符串,可以设置为 `'low'`, `'medium'`, `'high'`,默认为 `undefined`。[A Retention Priority Attribute for HTTP Cookies](https://datatracker.ietf.org/doc/html/draft-west-cookie-priority)
56
+
57
+ ## 读取 cookie
58
+
59
+ 通过 `cookies.get(key, value, options)` 的方式来读取一个 cookie。其中 options 支持的参数有:
60
+
61
+ - signed - `Boolean` 是否需要对 cookie 进行验签,需要配合 set 时传递 signed 参数,此时前端无法篡改这个 cookie,默认为 true。
62
+ - encrypt - `Boolean` 是否需要对 cookie 进行解密,需要配合 set 时传递 encrypt 参数,此时前端无法读到真实的 cookie 值,默认为 false。
63
+
64
+ ## 删除 cookie
65
+
66
+ 通过 `cookie.set(key, null)` 来删除一个 cookie。如果传递了 `signed` 参数,签名也会被删除。
67
+
68
+ ## License
69
+
70
+ [MIT](LICENSE)
71
+
72
+ ## Contributors
73
+
74
+ [![Contributors](https://contrib.rocks/image?repo=eggjs/egg-cookies)](https://github.com/eggjs/egg-cookies/graphs/contributors)
75
+
76
+ Made with [contributors-img](https://contrib.rocks).
@@ -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,101 @@
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.Cookie = void 0;
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ /**
9
+ * RegExp to match field-content in RFC 7230 sec 3.2
10
+ *
11
+ * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
12
+ * field-vchar = VCHAR / obs-text
13
+ * obs-text = %x80-FF
14
+ */
15
+ const fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; // eslint-disable-line no-control-regex
16
+ /**
17
+ * RegExp to match Same-Site cookie attribute value.
18
+ * https://en.wikipedia.org/wiki/HTTP_cookie#SameSite_cookie
19
+ */
20
+ const sameSiteRegExp = /^(?:none|lax|strict)$/i;
21
+ /**
22
+ * RegExp to match Priority cookie attribute value.
23
+ */
24
+ const PRIORITY_REGEXP = /^(?:low|medium|high)$/i;
25
+ class Cookie {
26
+ name;
27
+ value;
28
+ attrs;
29
+ constructor(name, value, attrs) {
30
+ (0, node_assert_1.default)(fieldContentRegExp.test(name), 'argument name is invalid');
31
+ (0, node_assert_1.default)(!value || fieldContentRegExp.test(value), 'argument value is invalid');
32
+ this.name = name;
33
+ this.value = value ?? '';
34
+ this.attrs = mergeDefaultAttrs(attrs);
35
+ (0, node_assert_1.default)(!this.attrs.path || fieldContentRegExp.test(this.attrs.path), 'argument option path is invalid');
36
+ if (typeof this.attrs.domain === 'function') {
37
+ this.attrs.domain = this.attrs.domain();
38
+ }
39
+ (0, node_assert_1.default)(!this.attrs.domain || fieldContentRegExp.test(this.attrs.domain), 'argument option domain is invalid');
40
+ (0, node_assert_1.default)(!this.attrs.sameSite || this.attrs.sameSite === true || sameSiteRegExp.test(this.attrs.sameSite), 'argument option sameSite is invalid');
41
+ (0, node_assert_1.default)(!this.attrs.priority || PRIORITY_REGEXP.test(this.attrs.priority), 'argument option priority is invalid');
42
+ if (!value) {
43
+ this.attrs.expires = new Date(0);
44
+ // make sure maxAge is empty
45
+ this.attrs.maxAge = undefined;
46
+ }
47
+ }
48
+ toString() {
49
+ return this.name + '=' + this.value;
50
+ }
51
+ toHeader() {
52
+ let header = this.toString();
53
+ const attrs = this.attrs;
54
+ if (attrs.path) {
55
+ header += '; path=' + attrs.path;
56
+ }
57
+ const maxAge = typeof attrs.maxAge === 'string' ? parseInt(attrs.maxAge, 10) : attrs.maxAge;
58
+ // ignore 0, `session` and other invalid maxAge
59
+ if (maxAge) {
60
+ header += '; max-age=' + Math.round(maxAge / 1000);
61
+ attrs.expires = new Date(Date.now() + maxAge);
62
+ }
63
+ if (attrs.expires) {
64
+ header += '; expires=' + attrs.expires.toUTCString();
65
+ }
66
+ if (attrs.domain) {
67
+ header += '; domain=' + attrs.domain;
68
+ }
69
+ if (attrs.priority) {
70
+ header += '; priority=' + attrs.priority.toLowerCase();
71
+ }
72
+ if (attrs.sameSite) {
73
+ header += '; samesite=' + (attrs.sameSite === true ? 'strict' : attrs.sameSite.toLowerCase());
74
+ }
75
+ if (attrs.secure) {
76
+ header += '; secure';
77
+ }
78
+ if (attrs.httpOnly) {
79
+ header += '; httponly';
80
+ }
81
+ if (attrs.partitioned) {
82
+ header += '; partitioned';
83
+ }
84
+ return header;
85
+ }
86
+ }
87
+ exports.Cookie = Cookie;
88
+ function mergeDefaultAttrs(attrs) {
89
+ const merged = {
90
+ path: '/',
91
+ httpOnly: true,
92
+ secure: false,
93
+ overwrite: false,
94
+ sameSite: false,
95
+ partitioned: false,
96
+ priority: undefined,
97
+ ...attrs,
98
+ };
99
+ return merged;
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nvb2tpZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4REFBaUM7QUFFakM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyx1Q0FBdUMsQ0FBQyxDQUFDLHVDQUF1QztBQUUzRzs7O0VBR0U7QUFDRixNQUFNLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQztBQUVoRDs7R0FFRztBQUNILE1BQU0sZUFBZSxHQUFHLHdCQUF3QixDQUFDO0FBeURqRCxNQUFhLE1BQU07SUFDakIsSUFBSSxDQUFTO0lBQ2IsS0FBSyxDQUFTO0lBQ0wsS0FBSyxDQUFtQjtJQUVqQyxZQUFZLElBQVksRUFBRSxLQUFxQixFQUFFLEtBQXdCO1FBQ3ZFLElBQUEscUJBQU0sRUFBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztRQUNsRSxJQUFBLHFCQUFNLEVBQUMsQ0FBQyxLQUFLLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLDJCQUEyQixDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBQSxxQkFBTSxFQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQ2pFLGlDQUFpQyxDQUFDLENBQUM7UUFDckMsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUEscUJBQU0sRUFBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUNyRSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUEscUJBQU0sRUFBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQ3JHLHFDQUFxQyxDQUFDLENBQUM7UUFDekMsSUFBQSxxQkFBTSxFQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUN0RSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLDRCQUE0QjtZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDbkMsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzVGLCtDQUErQztRQUMvQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNuRCxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLGFBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLFVBQVUsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLFlBQVksQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLGVBQWUsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBcEVELHdCQW9FQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBd0I7SUFDakQsTUFBTSxNQUFNLEdBQUc7UUFDYixJQUFJLEVBQUUsR0FBRztRQUNULFFBQVEsRUFBRSxJQUFJO1FBQ2QsTUFBTSxFQUFFLEtBQUs7UUFDYixTQUFTLEVBQUUsS0FBSztRQUNoQixRQUFRLEVBQUUsS0FBSztRQUNmLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLEdBQUcsS0FBSztLQUNULENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIn0=
@@ -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
+ }
@@ -0,0 +1,271 @@
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.Cookies = void 0;
7
+ const node_assert_1 = __importDefault(require("node:assert"));
8
+ const utility_1 = require("utility");
9
+ const should_send_same_site_none_1 = require("should-send-same-site-none");
10
+ const keygrip_js_1 = require("./keygrip.js");
11
+ const cookie_js_1 = require("./cookie.js");
12
+ const error_js_1 = require("./error.js");
13
+ const keyCache = new Map();
14
+ /**
15
+ * cookies for egg
16
+ * extend pillarjs/cookies, add encrypt and decrypt
17
+ */
18
+ class Cookies {
19
+ #keysArray;
20
+ #keys;
21
+ #defaultCookieOptions;
22
+ #autoChips;
23
+ ctx;
24
+ app;
25
+ secure;
26
+ #parseChromiumResult;
27
+ constructor(ctx, keys, defaultCookieOptions) {
28
+ this.#keysArray = keys;
29
+ // default cookie options
30
+ this.#defaultCookieOptions = defaultCookieOptions;
31
+ this.#autoChips = defaultCookieOptions?.autoChips;
32
+ this.ctx = ctx;
33
+ this.secure = this.ctx.secure;
34
+ this.app = ctx.app;
35
+ }
36
+ get keys() {
37
+ if (!this.#keys) {
38
+ (0, node_assert_1.default)(Array.isArray(this.#keysArray), '.keys required for encrypt/sign cookies');
39
+ const cache = keyCache.get(this.#keysArray);
40
+ if (cache) {
41
+ this.#keys = cache;
42
+ }
43
+ else {
44
+ this.#keys = new keygrip_js_1.Keygrip(this.#keysArray);
45
+ keyCache.set(this.#keysArray, this.#keys);
46
+ }
47
+ }
48
+ return this.#keys;
49
+ }
50
+ /**
51
+ * get cookie value by name
52
+ * @param {String} name - cookie's name
53
+ * @param {Object} opts - cookies' options
54
+ * - {Boolean} signed - default to true
55
+ * - {Boolean} encrypt - default to false
56
+ * @return {String} value - cookie's value
57
+ */
58
+ get(name, opts = {}) {
59
+ let value = this._get(name, opts);
60
+ if (value === undefined && this.#autoChips) {
61
+ // try to read _CHIPS-${name} prefix cookie
62
+ value = this._get(this.#formatChipsCookieName(name), opts);
63
+ }
64
+ return value;
65
+ }
66
+ _get(name, opts) {
67
+ const signed = computeSigned(opts);
68
+ const header = this.ctx.get('cookie');
69
+ if (!header)
70
+ return;
71
+ const match = header.match(getPattern(name));
72
+ if (!match)
73
+ return;
74
+ let value = match[1];
75
+ if (!opts.encrypt && !signed)
76
+ return value;
77
+ // signed
78
+ if (signed) {
79
+ const sigName = name + '.sig';
80
+ const sigValue = this.get(sigName, { signed: false });
81
+ if (!sigValue)
82
+ return;
83
+ const raw = name + '=' + value;
84
+ const index = this.keys.verify(raw, sigValue);
85
+ if (index < 0) {
86
+ // can not match any key, remove ${name}.sig
87
+ this.set(sigName, null, { path: '/', signed: false, overwrite: true });
88
+ return;
89
+ }
90
+ if (index > 0) {
91
+ // not signed by the first key, update sigValue
92
+ this.set(sigName, this.keys.sign(raw), { signed: false, overwrite: true });
93
+ }
94
+ return value;
95
+ }
96
+ // encrypt
97
+ value = (0, utility_1.base64decode)(value, true, 'buffer');
98
+ const res = this.keys.decrypt(value);
99
+ return res ? res.value.toString() : undefined;
100
+ }
101
+ set(name, value, opts) {
102
+ opts = {
103
+ ...this.#defaultCookieOptions,
104
+ ...opts,
105
+ };
106
+ const signed = computeSigned(opts);
107
+ value = value || '';
108
+ if (!this.secure && opts.secure) {
109
+ throw new error_js_1.CookieError('Cannot send secure cookie over unencrypted connection');
110
+ }
111
+ let headers = this.ctx.response.get('set-cookie') || [];
112
+ if (!Array.isArray(headers)) {
113
+ headers = [headers];
114
+ }
115
+ // encrypt
116
+ if (opts.encrypt) {
117
+ value = value && (0, utility_1.base64encode)(this.keys.encrypt(value), true);
118
+ }
119
+ // http://browsercookielimits.squawky.net/
120
+ if (value.length > 4093) {
121
+ this.app.emit('cookieLimitExceed', { name, value, ctx: this.ctx });
122
+ }
123
+ // https://github.com/linsight/should-send-same-site-none
124
+ // fixed SameSite=None: Known Incompatible Clients
125
+ const userAgent = this.ctx.get('user-agent');
126
+ let isSameSiteNone = false;
127
+ // disable autoChips if partitioned enable
128
+ let autoChips = !opts.partitioned && this.#autoChips;
129
+ if (opts.sameSite && typeof opts.sameSite === 'string' && opts.sameSite.toLowerCase() === 'none') {
130
+ isSameSiteNone = true;
131
+ if (opts.secure === false || !this.secure || (userAgent && !this.isSameSiteNoneCompatible(userAgent))) {
132
+ // Non-secure context or Incompatible clients, don't send SameSite=None property
133
+ opts.sameSite = false;
134
+ isSameSiteNone = false;
135
+ }
136
+ }
137
+ if (autoChips || opts.partitioned) {
138
+ // allow to set partitioned: secure=true and sameSite=none and chrome >= 118
139
+ if (!isSameSiteNone || opts.secure === false || !this.secure || (userAgent && !this.isPartitionedCompatible(userAgent))) {
140
+ // Non-secure context or Incompatible clients, don't send partitioned property
141
+ autoChips = false;
142
+ opts.partitioned = false;
143
+ }
144
+ }
145
+ // remove unpartitioned same name cookie first
146
+ if (opts.partitioned && opts.removeUnpartitioned) {
147
+ const overwrite = opts.overwrite;
148
+ if (overwrite) {
149
+ opts.overwrite = false;
150
+ headers = ignoreCookiesByName(headers, name);
151
+ }
152
+ const removeCookieOpts = Object.assign({}, opts, {
153
+ partitioned: false,
154
+ });
155
+ const removeUnpartitionedCookie = new cookie_js_1.Cookie(name, '', removeCookieOpts);
156
+ // if user not set secure, reset secure to ctx.secure
157
+ if (opts.secure === undefined) {
158
+ removeUnpartitionedCookie.attrs.secure = this.secure;
159
+ }
160
+ headers = pushCookie(headers, removeUnpartitionedCookie);
161
+ // signed
162
+ if (signed) {
163
+ removeUnpartitionedCookie.name += '.sig';
164
+ headers = ignoreCookiesByName(headers, removeUnpartitionedCookie.name);
165
+ headers = pushCookie(headers, removeUnpartitionedCookie);
166
+ }
167
+ }
168
+ else if (autoChips) {
169
+ // add _CHIPS-${name} prefix cookie
170
+ const newCookieName = this.#formatChipsCookieName(name);
171
+ const newCookieOpts = {
172
+ ...opts,
173
+ partitioned: true,
174
+ };
175
+ const newPartitionedCookie = new cookie_js_1.Cookie(newCookieName, value, newCookieOpts);
176
+ // if user not set secure, reset secure to ctx.secure
177
+ if (opts.secure === undefined)
178
+ newPartitionedCookie.attrs.secure = this.secure;
179
+ headers = pushCookie(headers, newPartitionedCookie);
180
+ // signed
181
+ if (signed) {
182
+ newPartitionedCookie.value = value && this.keys.sign(newPartitionedCookie.toString());
183
+ newPartitionedCookie.name += '.sig';
184
+ headers = ignoreCookiesByName(headers, newPartitionedCookie.name);
185
+ headers = pushCookie(headers, newPartitionedCookie);
186
+ }
187
+ }
188
+ const cookie = new cookie_js_1.Cookie(name, value, opts);
189
+ // if user not set secure, reset secure to ctx.secure
190
+ if (opts.secure === undefined) {
191
+ cookie.attrs.secure = this.secure;
192
+ }
193
+ headers = pushCookie(headers, cookie);
194
+ // signed
195
+ if (signed) {
196
+ cookie.value = value && this.keys.sign(cookie.toString());
197
+ cookie.name += '.sig';
198
+ headers = pushCookie(headers, cookie);
199
+ }
200
+ this.ctx.set('set-cookie', headers);
201
+ return this;
202
+ }
203
+ #formatChipsCookieName(name) {
204
+ return `_CHIPS-${name}`;
205
+ }
206
+ #parseChromiumAndMajorVersion(userAgent) {
207
+ if (!this.#parseChromiumResult) {
208
+ this.#parseChromiumResult = parseChromiumAndMajorVersion(userAgent);
209
+ }
210
+ return this.#parseChromiumResult;
211
+ }
212
+ isSameSiteNoneCompatible(userAgent) {
213
+ // Chrome >= 80.0.0.0
214
+ const result = this.#parseChromiumAndMajorVersion(userAgent);
215
+ if (result.chromium) {
216
+ return result.majorVersion >= 80;
217
+ }
218
+ return (0, should_send_same_site_none_1.isSameSiteNoneCompatible)(userAgent);
219
+ }
220
+ isPartitionedCompatible(userAgent) {
221
+ // support: Chrome >= 114.0.0.0
222
+ // default enable: Chrome >= 118.0.0.0
223
+ // https://developers.google.com/privacy-sandbox/3pcd/chips
224
+ const result = this.#parseChromiumAndMajorVersion(userAgent);
225
+ if (result.chromium) {
226
+ return result.majorVersion >= 118;
227
+ }
228
+ return false;
229
+ }
230
+ }
231
+ exports.Cookies = Cookies;
232
+ // https://github.com/linsight/should-send-same-site-none/blob/master/index.js#L86
233
+ function parseChromiumAndMajorVersion(userAgent) {
234
+ const m = /Chrom[^ /]{1,100}\/(\d{1,100}?)\./.exec(userAgent);
235
+ if (!m) {
236
+ return { chromium: false, majorVersion: 0 };
237
+ }
238
+ // Extract digits from first capturing group.
239
+ return { chromium: true, majorVersion: parseInt(m[1]) };
240
+ }
241
+ const _patternCache = new Map();
242
+ function getPattern(name) {
243
+ const cache = _patternCache.get(name);
244
+ if (cache) {
245
+ return cache;
246
+ }
247
+ const reg = new RegExp('(?:^|;) *' +
248
+ name.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +
249
+ '=([^;]*)');
250
+ _patternCache.set(name, reg);
251
+ return reg;
252
+ }
253
+ function computeSigned(opts) {
254
+ // encrypt default to false, signed default to true.
255
+ // disable singed when encrypt is true.
256
+ if (opts.encrypt)
257
+ return false;
258
+ return opts.signed !== false;
259
+ }
260
+ function pushCookie(cookies, cookie) {
261
+ if (cookie.attrs.overwrite) {
262
+ cookies = ignoreCookiesByName(cookies, cookie.name);
263
+ }
264
+ cookies.push(cookie.toHeader());
265
+ return cookies;
266
+ }
267
+ function ignoreCookiesByName(cookies, name) {
268
+ const prefix = `${name}=`;
269
+ return cookies.filter(c => !c.startsWith(prefix));
270
+ }
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb29raWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFpQztBQUNqQyxxQ0FBcUQ7QUFDckQsMkVBQXNFO0FBQ3RFLDZDQUF1QztBQUN2QywyQ0FBdUQ7QUFDdkQseUNBQXlDO0FBRXpDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0FBb0I5Qzs7O0dBR0c7QUFDSCxNQUFhLE9BQU87SUFDVCxVQUFVLENBQVc7SUFDOUIsS0FBSyxDQUFVO0lBQ04scUJBQXFCLENBQXdCO0lBQzdDLFVBQVUsQ0FBVztJQUNyQixHQUFHLENBQXNCO0lBQ3pCLEdBQUcsQ0FBc0I7SUFDekIsTUFBTSxDQUFVO0lBQ3pCLG9CQUFvQixDQUF1QjtJQUUzQyxZQUFZLEdBQXdCLEVBQUUsSUFBYyxFQUFFLG9CQUEyQztRQUMvRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2Qix5QkFBeUI7UUFDekIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLG9CQUFvQixDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQW9CLEVBQUUsU0FBUyxDQUFDO1FBQ2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsSUFBQSxxQkFBTSxFQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7WUFDbEYsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJ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
@@ -0,0 +1,3 @@
1
+ export declare class CookieError extends Error {
2
+ constructor(message: string, options?: ErrorOptions);
3
+ }