From 7ff1629b66cd1e4a1dea684e4084ef7850881f85 Mon Sep 17 00:00:00 2001 From: Blake Embrey Date: Fri, 26 Sep 2025 17:36:15 -0700 Subject: [PATCH] Add benchmark for `parseSetCookie` --- package-lock.json | 4 ++ scripts/parse-top.json | 22 ------ scripts/top-cookie.json | 16 +++++ scripts/top-set-cookie.json | 66 ++++++++++++++++++ scripts/update-benchmark.js | 128 +++++++++++++++++++--------------- src/parse-cookie.bench.ts | 6 +- src/parse-set-cookie.bench.ts | 13 ++++ 7 files changed, 174 insertions(+), 81 deletions(-) delete mode 100644 scripts/parse-top.json create mode 100644 scripts/top-cookie.json create mode 100644 scripts/top-set-cookie.json create mode 100644 src/parse-set-cookie.bench.ts diff --git a/package-lock.json b/package-lock.json index 24238fa..9c09959 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,10 @@ }, "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/@ampproject/remapping": { diff --git a/scripts/parse-top.json b/scripts/parse-top.json deleted file mode 100644 index a2a402d..0000000 --- a/scripts/parse-top.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "accounts.google.com": "__Aaaa-AAAA=0:0AaaAaaaAAA0aA0aAA0aaAaAAaaaAA:AAAaAA0AAAaAAa0a", - "amazon.com": "aaaaaaa-aa=000-0000000-0000000; bbbbbbb-bb-bbbb=1111111111b; c22c-ccccc=CCC; dddd=dddddd", - "apple.com": "aaa=AA", - "cloudflare.com": "__aa_aa=aaA0aaAAaAaaaa0aaaaAAAA_0aa0a.0AAA000aAA0aa-0000000000-0.0.0.0-Aaa00aA0aaAaAA0AaaAAAA0AaAaaaAAA.AaAaAaAA_0aAaAaaAA0AAAAaaAaaaaA0aaAAAaAAAaaaaa0AAa0AAAAAaaA0aaA0a0aaaaaAAA", - "docs.google.com": "__Aaaa-AAAA=0:aAAaA00AA0A0AAaAAAaAAAAAaA_AAA:aAAA00AAaaAAaaAA", - "drive.google.com": "__Aaaa-AAAA=0:AA0a0AAaaAaaA0A-AAAA0aaA_0A-aa:0aaAa0aA0aaAAAAa", - "en.wikipedia.org": "AAA-Aaaa-Aaaaaa=00-Aaa-0000; BBB-Bbbb-Bbbbbb-Bbbbbb=11-Bbb-1111; CCC-CC=222; DddDD=DD:DD:Ddd_Ddddddddd:33.33:-333.33:d3; EeeeeeeEeeeeEeeee=4.444", - "istockphoto.com": "aaaaaaa=aAAAAAAaAAAaaa0aa0aAAAa0aAaaaAAA0A%22aaA0aAaaAaa0AAaaaaAAaAaaa0AaaaA%2200a0a00AA00A0aAaAaA0aa%22AAaaAA0000aAa00%220AaAaAAA0AaaAaAAAaaaAaAAa00AaAa0AaaaAaAaAaaaaaaa%22aAaaaAaaAaaaAAAAaAAaaAAaAaaAaaaAAa0A%22--aaA0aaAAAAAaaAAa--a0a%22A%22aAAaAAAa%22AaaAaAA%22%22; bbb=bb=1&bb=1111-11-11B11%2211%2211B; ccc=ccc=22222ccc-2c22-2c22-2222-22c2222c2222; ddd=d=DD%22dDddddDdddD3ddDddd33dddD3dDD33dDd3DDdDdddDdD33D3Dd33DDdd3dDd3dDDdDDDdD3dD3d3D3dDDdd3dddD%223DDDDdd3dD3ddd3dddDdDdD33D3DdDDd3dD3dDddDDdDdDDDdDDDDDDdddDdDdDdD3dddDDDd3DDD3D%22%2233d%22D3DDDDdDDDDDddddDDDdd3DdDDdDDDDdDdddd3ddD3D3DDddd3ddD3D3DDddDddDDDd3DDDDDdD3DDddDdDdDDD3DDDdDDddDDDdDDD3DD33DDddDDD3DDDdDDDdDDD3DDdD%223%223%223&d; eeee=e=eEEEeEee44eE4eeEEeeEEEeEE4444eeE4eE4eEE4%224e%22", - "maps.google.com": "AAA=000=aaaaAa0Aaa0aaaaaaaaaaAAAAAAaaaaAAA0AaAAA0aaaA00AAA0aAAAA0aaA0aAAAAaAAA0aAAAAaaAAaa_AAAAAaA0a0aaaAaaaaa--aa0aAAA0A0AaAA0AAaaAAa0AaAAa0A_aAAAAaAA_aAaAa0AaA0aAa0Aa-AAa0aaaAAaAA-AaaaA0aaAaAA0aaaa", - "play.google.com": "AAA=000=A0AaA-aaaA00AaAAa00A0aaAAaA0AaAaaaa0A_Aa0_AaaAAAaAaa0aa0a-0aAaA0__AaAAaaaaAAaaaaaAAaaa0aAAAa0a_a0aaAAAAAaAaa0aaaaaAaaaaAAA_aAa0aaa0aaa00aaAAAaA0AAAAa00A0A0AaAaA0AAA0A0AAaAA0aaAAa", - "policies.google.com": "AAA=000=AaAAAA_aAAa0aAaaaaAAa000A0AAaAaAAaAaaAa00-0aAaaAAaaAAAA0a0aaA0AaAaaaaaaaaAAAA0a0AAa_AaaAaaaAa_aaAAAaa00aAAAAAA_AAAAa0aA0a0AaA_00A0-0AaA-A_AAaA00aaAAAAAAaAaAaaaa0aaAAa0AaaA0aaAaaa", - "pt.wikipedia.org": "AAA-Aaaa-Aaaaaa=00-Aaa-0000; BBB-Bbbb-Bbbbbb-Bbbbbb=11-Bbb-1111; CccCC=CC:CC:Ccc_Ccccccccc:22.22:-222.22:c2; DddddddDddddDdddd=3.333", - "sites.google.com": "__Aaaa-AAAA=0:aaaAaAAA0aAAaAAAaAaaAaa0A00AAA:aAAaaaAA_aa0A0aA", - "support.google.com": "AAA=000=aaAAAaaAaaaAaA0aAA-00-AAaA0Aa0A0aaaAaaAa00_aAAAAAaaA0AAa0AAA0aAaA0aA0A0AAAAA0A0aaAAAA0aa-AAaAa00a0AaaaAaaAaa0Aaa0AA0aAAaaaaaAAAaAAAA0AA0AAaaaAa0aAAAaaaaaaAAA_0aaAaaAA0AaA0a0a0aAaA; BBB=111=bbBBBbbBbbbBbB1bBB-11-BBbB1Bb1B1bbbBbbBb11_bBBBBBbbB1BBb1BBB1bBbB1bB1B1BBBBB1B1bbBBBB1bb-BBbBb11b1BbbbBbbBbb1Bbb1BB1bBBbbbbbBBBbBBBB1BB1BBbbbBb1bBBBbbbbbbBBB_1bbBbbBB1BbB1b1b1bBbB", - "t.me": "aaaa_aaaa=aa0a00a00a000000a0_0000000000000000000", - "vk.com": "aaaaaaa=AAAAAAA; bbbbbbbbb=1; cccccccccc=2222222222222222222_CcCCccCCccc2CcCcCCCccCCCCccc2CccCC2cc2CcCCc; ddddddd=DDDDDDD; eeeeeEEEE=EEEEEEE; fffffffff=5555555555_fFfFffFfffFF55FF5ffffF5ffFFfff5f5F55FfF5fFF; ggggggg=-6%22-6%22-6%226666666666; hhhhhhh=7; iiiiiii=-8%22-8%22-8%228888888888", - "www.google.com": "AAA=AAAA0aaA00aaAaA-aaA0AaAaaAaa0aaAaAaaAAaA0AA00A0aAaAAAA0aaA; BBB=111=bbb111bBBb11-bbbBbbBBb11BbBB1bbb-bbBbbBBBbb-bbbb1BBbBBbbbb_bBb1BbbBBB1B1bBbb1b11bbBB11B11BBbBbbBB11BBBbb1b-BBbBBbBbBBB11bBbBB1BbbBBBBbbBbbBBbbB1b1bBb1B_BBb1BBB1bB1BbBBBbb1bB11b1bbbBBbbBbBBBbbbBBBb", - "youtu.be": "AAA=0; BBB=bbbBbBbbbbb; CCCCCCC_CCCC2_CCCC=Cccc-cCCcCC; DDDDDDD_DDDDDDD_DDDDDDDD=DdDDDdDDDdDdDD%22%22", - "youtube.com": "AAA=0; BBB=BbBbbbb1bBb; CCCCCCC_CCCC2_CCCC=CCc2ccCccCc; DDDDDDD_DDDDDDD_DDDDDDDD=DdDDDdDDDdDdDd%22%22", - "example.com": "" -} diff --git a/scripts/top-cookie.json b/scripts/top-cookie.json new file mode 100644 index 0000000..e1eb11a --- /dev/null +++ b/scripts/top-cookie.json @@ -0,0 +1,16 @@ +{ + "accounts.google.com": "__Aaaa-AAAA=0:aA00a0AAaAaA0aAAAAaaaaAAa00AaA:0aAAaa0aaa_aA-Aa", + "apple.com": "aaa=AA", + "cloudflare.com": "_aaaa_aaaaaa=aaaaaa; _bb=BB1.1.11bb111b-b1b1-1bb1-bb1b-b11bb1b11111; ccc_cccccc-ccccccccc_c2={\"cccc_cc2\":{\"c\":\"22cc222c-c2c2-2cc2-cc2c-c22cc2c22222\",\"c\":2222222222222}}; ddd_ddddd={\"DdDD_dddd\":{\"d\":\"DdD3Ddd3DDDdDDddDDD3DDD3DDDdDDd3DDd3DDd3DDD3DdddDDDdDDDDDDdddddDDddDDdD3DDDdDddddddDDd==\",\"d\":3333333333333}}; eeeeee_4EE44E44444E44444E444EE4_EeeeeEee_eeeeeeee=EeE4Eee4EEEeEEeeEEE4EEE4EEEeEEe4EEe4EEe4EEE4EeeeEEEeEEEEEEeeeeeEEeeEEeE4EEEeEeeeeeeEEe==; __ff_ff=Fff.FfFfFffFFFffFFffF5fFFfFfFf5ffFfFFfffF5f-5555555555-5.5.5.5-f5FfF5F5Ff5Ff5fffFFfff5Ff5f5FFFFFFFffFff5FFfFFffff5f5f5FffFF5FffFFFffffffFfffFf5ffff5.fff5ffFff5ff5ffffFffF5F55ffffF_F5FfFFFFFff", + "docs.google.com": "__Aaaa-AAAA=0:AaaaaaAAaa0aaa0a0aAAAaaaa0a0aa:0AaaaaAaaaaAaaa0", + "drive.google.com": "__Aaaa-AAAA=0:AaA-aaAa-aA0AaaaaAaAAAAAaaAAaA:aaaaAa0aaaa000A0", + "linkedin.com": "AAAAAAAAAA=aaaa:0000000000000000000; bbbb=b=1&bbbb=bb-bb; ccccccc=\"c=2&22c222cc-cc22-2ccc-22c2-2cc22ccccc22\"; dddddddd=\"d=3&3333333333333333d33333-d33d-33dd-3333-d33d3333333dDDDdd333D-DD3DdD3dddDDD3ddDd_D3d\"; eeee=\"e=EEEE44:e=E:e=E:e=E:e=E:e=4444:e=4:e=4:e=4444444444:e=4444444444:e=4:eee=EEEEEeE4Eee_Eeeee44EEeeEE4EEE4Ee\"; __ff_ff=f55_5f5f5fFff5fFFfF5f.FFFf5fFfF5F5Ff5_ff.Ff-5555555555-5.5.5.5-.FF5F_FFffffFFfFf.f55ffFFFf5ff5FFffFFFfFf5f5FFf_.FFf5FfFffFf5ffffffF5f5fFFF5FFfFFF55fffFfFFf5FfF55fFFfFFffF", + "play.google.com": "AAA=000=AaaaaaAA-0AaAAa0AA0aAaaAAaaAaaAAAAAAaaaaAAaAaA0aA-AAaaAaaaAAAaAa0a-_AaaaA0aaaaaaaA0a0aaAAA0aaaAaAAaaAAaa00A0aAa0a0AAaAAaAaaaA0aAaaaAaAAAAAAAAa0AaaA0aAaAaaaaaaAa0aAa0AAaAAAaAAAAaA0aAAa0aAAaa00Aa0AaAA0", + "policies.google.com": "AAA=000=aaA0-aAaaA0Aa0AaAaaaaaAa0aAaaAaaaAaa0aAa0AaaAAaaa0aAa00aAAa00aaaaA0aAAaaaa_0AaAaa0AAAAaaAAAAa0Aaaa-AaAaaAAaa00AA0AaaaA0aa00aAaA00aA0aaAAAAAa0AaAaaaaaaA0aAaAA_aAAAA0AaaAaaAAAaAAaaAAa_AaAAA0aAAAa0aaaaAaaAAA00AaaAAA", + "support.google.com": "AAA=000=AaAaAA0AA0AA0000aaAAaa0a0aA0aA0AaaAaAAAaaaAAAA-aAaaAA_00aaA0_-Aa0AA0A0AAAAAAaaaaA0AAaAAaAA0aaa00aAaAaAAAAaaaAAAa0aAaaaaA0_AaaaaAaaaaAa_AA0aaa0aA0a00a00a0aaAAa0AAaaaAAaaAA_0-aaa00aAAaAaaa0AA-AAaA0aaa; BBB=111=BbBbBB1BB1BB1111bbBBbb1b1bB1bB1BbbBbBBBbbbBBBB-bBbbBB_11bbB1_-Bb1BB1B1BBBBBBbbbbB1BBbBBbBB1bbb11bBbBbBBBBbbbBBBb1bBbbbbB1_BbbbbBbbbbBb_BB1bbb1bB1b11b11b1bbBBb1BBbbbBBbbBB_1-bbb11bBBbBbbb1BB-BBbB1bbb", + "wa.me": "aa_aaaa_aaaa=aa", + "whatsapp.com": "aa_aaaa=aaAaaA0aAaAAa0aAaaAA0A; bb_bbbb_bbbb=bb; cc_cc=2c22c2cc-cc2c-2c22-cc22-c22cc22c2c22", + "www.google.com": "AAA=AaAaa0aaAAaA0A0_aA0Aaaa0Aaa0aaaaA0aa0Aaa0aAa0aaaaaAAaAa0AA; BBB=111=BbBbb1bb-bBbBB1b1b1_1BB1bBBBbbBBBbbbbb_b1BBbbBbbBb11-Bbbb1bbBB1bBbBBBb-111bb11BbbbBbBBBBbB11B1Bbb1B1bBBBBbbbbbB1Bbbb_b1bBbBBBbbbBBbb1bbbbbBBB1BB_bBBbBBbb1bbB1Bbb1bBBbBBb1BbBbBBBBb_BbBbbbbbB11bbbBbb1BBbBBb1B1BbBbB-B-B", + "youtu.be": "AAA=0; BBB=1BBbB11Bbbb; __Cccccc-CCC=; DDDDDDD_DDDD3_DDDD=DDDdDDdDdd3; EEEEEEE_EEEEEEE_EEEEEEEE=EeEEEeEEEeEeEe%22%22; __Ffffff-FFFFFFF_FFFFF=FFfffFfff5F5FFFFfF_ffffFFffFfF_ffffFFf%22%22", + "youtube.com": "AAA=0; BBB=bBBbbbb1BbB; __Cccccc-CCC=; DDDDDDD_DDDD3_DDDD=dDdDddddD3D; EEEEEEE_EEEEEEE_EEEEEEEE=EeEEEeEEEeEeEE%22%22; __Ffffff-FFFFFFF_FFFFF=FFf5fFF5f_FffFFFfffF5555ffFFfffF5555ffF%22" +} diff --git a/scripts/top-set-cookie.json b/scripts/top-set-cookie.json new file mode 100644 index 0000000..060ac68 --- /dev/null +++ b/scripts/top-set-cookie.json @@ -0,0 +1,66 @@ +{ + "accounts.google.com": [ + "__Aaaa-AAAA=0:aA00a0AAaAaA0aAAAAaaaaAAa00AaA:0aAAaa0aaa_aA-Aa; Expires=Sun, 26-Sep-2027 19:02:11 GMT; Path=/; Secure; HttpOnly; Priority=HIGH" + ], + "apple.com": ["aaa=AA; path=/; domain=.apple.com"], + "cloudflare.com": [ + "_aaaa_aaaaaa=aaaaaa; Max-Age=1209600; path=/; domain=.www.cloudflare.com; SameSite=Strict; Secure", + "_bb=BB1.1.11bb111b-b1b1-1bb1-bb1b-b11bb1b11111; Domain=.cloudflare.com; Expires=Mon, 26 Oct 2026 19:02:07 GMT; Path=/", + "ccc_cccccc-ccccccccc_c2={\"cccc_cc2\":{\"c\":\"22cc222c-c2c2-2cc2-cc2c-c22cc2c22222\",\"c\":2222222222222}}; Domain=.cloudflare.com; Expires=Mon Oct 26 2026 19:02:07 GMT+0000 (Coordinated Universal Time); HttpOnly; SameSite=Lax; Path=/; Secure", + "ddd_ddddd={\"DdDD_dddd\":{\"d\":\"DdD3Ddd3DDDdDDddDDD3DDD3DDDdDDd3DDd3DDd3DDD3DdddDDDdDDDDDDdddddDDddDDdD3DDDdDddddddDDd==\",\"d\":3333333333333}}; Domain=.cloudflare.com; Expires=Mon Oct 26 2026 19:02:07 GMT+0000 (Coordinated Universal Time); HttpOnly; SameSite=Lax; Path=/; Secure", + "eeeeee_4EE44E44444E44444E444EE4_EeeeeEee_eeeeeeee=EeE4Eee4EEEeEEeeEEE4EEE4EEEeEEe4EEe4EEe4EEE4EeeeEEEeEEEEEEeeeeeEEeeEEeE4EEEeEeeeeeeEEe==; Domain=.cloudflare.com; Expires=Mon, 26 Oct 2026 19:02:07 GMT; Path=/; Secure; SameSite=Lax", + "__ff_ff=Fff.FfFfFffFFFffFFffF5fFFfFfFf5ffFfFFfffF5f-5555555555-5.5.5.5-f5FfF5F5Ff5Ff5fffFFfff5Ff5f5FFFFFFFffFff5FFfFFffff5f5f5FffFF5FffFFFffffffFfffFf5ffff5.fff5ffFff5ff5ffffFffF5F55ffffF_F5FfFFFFFff; path=/; expires=Fri, 26-Sep-25 19:32:08 GMT; domain=.www.cloudflare.com; HttpOnly; Secure" + ], + "docs.google.com": [ + "__Aaaa-AAAA=0:AaaaaaAAaa0aaa0a0aAAAaaaa0a0aa:0AaaaaAaaaaAaaa0; Expires=Sun, 26-Sep-2027 19:02:09 GMT; Path=/; Secure; HttpOnly; Priority=HIGH" + ], + "drive.google.com": [ + "__Aaaa-AAAA=0:AaA-aaAa-aA0AaaaaAaAAAAAaaAAaA:aaaaAa0aaaa000A0; Expires=Sun, 26-Sep-2027 19:02:12 GMT; Path=/; Secure; HttpOnly; Priority=HIGH" + ], + "linkedin.com": [ + "AAAAAAAAAA=aaaa:0000000000000000000; SameSite=None; Path=/; Domain=.www.linkedin.com; Secure", + "bbbb=b=1&bbbb=bb-bb; SameSite=None; Path=/; Domain=linkedin.com; Secure", + "ccccccc=\"c=2&22c222cc-cc22-2ccc-22c2-2cc22ccccc22\"; domain=.linkedin.com; Path=/; Secure; Expires=Sat, 26-Sep-2026 19:02:05 GMT; SameSite=None", + "dddddddd=\"d=3&3333333333333333d33333-d33d-33dd-3333-d33d3333333dDDDdd333D-DD3DdD3dddDDD3ddDd_D3d\"; domain=.www.linkedin.com; Path=/; Secure; Expires=Sat, 26-Sep-2026 19:02:05 GMT; HttpOnly; SameSite=None", + "eeee=\"e=EEEE44:e=E:e=E:e=E:e=E:e=4444:e=4:e=4:e=4444444444:e=4444444444:e=4:eee=EEEEEeE4Eee_Eeeee44EEeeEE4EEE4Ee\"; Expires=Sat, 27 Sep 2025 19:02:05 GMT; domain=.linkedin.com; Path=/; Secure", + "__ff_ff=f55_5f5f5fFff5fFFfF5f.FFFf5fFfF5F5Ff5_ff.Ff-5555555555-5.5.5.5-.FF5F_FFffffFFfFf.f55ffFFFf5ff5FFffFFFfFf5f5FFf_.FFf5FfFffFf5ffffffF5f5fFFF5FFfFFF55fffFfFFf5FfF55fFFfFFffF; path=/; expires=Fri, 26-Sep-25 19:32:05 GMT; domain=.linkedin.com; HttpOnly; Secure" + ], + "play.google.com": [ + "AAA=000=AaaaaaAA-0AaAAa0AA0aAaaAAaaAaaAAAAAAaaaaAAaAaA0aA-AAaaAaaaAAAaAa0a-_AaaaA0aaaaaaaA0a0aaAAA0aaaAaAAaaAAaa00A0aAa0a0AAaAAaAaaaA0aAaaaAaAAAAAAAAa0AaaA0aAaAaaaaaaAa0aAa0AAaAAAaAAAAaA0aAAa0aAAaa00Aa0AaAA0; expires=Sat, 28-Mar-2026 19:02:09 GMT; path=/; domain=.google.com; HttpOnly" + ], + "policies.google.com": [ + "AAA=000=aaA0-aAaaA0Aa0AaAaaaaaAa0aAaaAaaaAaa0aAa0AaaAAaaa0aAa00aAAa00aaaaA0aAAaaaa_0AaAaa0AAAAaaAAAAa0Aaaa-AaAaaAAaa00AA0AaaaA0aa00aAaA00aA0aaAAAAAa0AaAaaaaaaA0aAaAA_aAAAA0AaaAaaAAAaAAaaAAa_AaAAA0aAAAa0aaaaAaaAAA00AaaAAA; expires=Sat, 28-Mar-2026 19:02:10 GMT; path=/; domain=.google.com; HttpOnly" + ], + "support.google.com": [ + "AAA=000=AaAaAA0AA0AA0000aaAAaa0a0aA0aA0AaaAaAAAaaaAAAA-aAaaAA_00aaA0_-Aa0AA0A0AAAAAAaaaaA0AAaAAaAA0aaa00aAaAaAAAAaaaAAAa0aAaaaaA0_AaaaaAaaaaAa_AA0aaa0aA0a00a00a0aaAAa0AAaaaAAaaAA_0-aaa00aAAaAaaa0AA-AAaA0aaa; expires=Sat, 28-Mar-2026 19:02:08 GMT; path=/; domain=.google.com; HttpOnly", + "BBB=111=BbBbBB1BB1BB1111bbBBbb1b1bB1bB1BbbBbBBBbbbBBBB-bBbbBB_11bbB1_-Bb1BB1B1BBBBBBbbbbB1BBbBBbBB1bbb11bBbBbBBBBbbbBBBb1bBbbbbB1_BbbbbBbbbbBb_BB1bbb1bB1b11b11b1bbBBb1BBbbbBBbbBB_1-bbb11bBBbBbbb1BB-BBbB1bbb; expires=Sat, 28-Mar-2026 19:02:08 GMT; path=/; domain=.google.com; HttpOnly" + ], + "wa.me": [ + "aa_aaaa_aaaa=aa; expires=Fri, 03-Oct-2025 19:02:11 GMT; Max-Age=604800; path=/; domain=.whatsapp.com; secure" + ], + "whatsapp.com": [ + "aa_aaaa=aaAaaA0aAaAAa0aAaaAA0A; path=/; domain=.whatsapp.com; secure; httponly", + "bb_bbbb_bbbb=bb; expires=Fri, 03-Oct-2025 19:02:08 GMT; Max-Age=604800; path=/; domain=.whatsapp.com; secure", + "cc_cc=2c22c2cc-cc2c-2c22-cc22-c22cc22c2c22; expires=Thu, 25-Dec-2025 19:02:08 GMT; Max-Age=7776000; path=/; domain=.www.whatsapp.com; secure; httponly; SameSite=Lax" + ], + "www.google.com": [ + "AAA=AaAaa0aaAAaA0A0_aA0Aaaa0Aaa0aaaaA0aa0Aaa0aAa0aaaaaAAaAa0AA; expires=Wed, 25-Mar-2026 19:02:04 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax", + "BBB=111=BbBbb1bb-bBbBB1b1b1_1BB1bBBBbbBBBbbbbb_b1BBbbBbbBb11-Bbbb1bbBB1bBbBBBb-111bb11BbbbBbBBBBbB11B1Bbb1B1bBBBBbbbbbB1Bbbb_b1bBbBBBbbbBBbb1bbbbbBBB1BB_bBBbBBbb1bbB1Bbb1bBBbBBb1BbBbBBBBb_BbBbbbbbB11bbbBbb1BBbBBb1B1BbBbB-B-B; expires=Sat, 28-Mar-2026 19:02:04 GMT; path=/; domain=.google.com; HttpOnly" + ], + "youtu.be": [ + "AAA=0; Domain=.youtube.com; Expires=Fri, 26-Sep-2025 19:32:10 GMT; Path=/; Secure; HttpOnly", + "BBB=1BBbB11Bbbb; Domain=.youtube.com; Path=/; Secure; HttpOnly; SameSite=none", + "__Cccccc-CCC=; Domain=.youtube.com; Expires=Sat, 31-Dec-2022 19:02:10 GMT; Path=/; Secure; HttpOnly; SameSite=lax", + "DDDDDDD_DDDD3_DDDD=DDDdDDdDdd3; Domain=.youtube.com; Expires=Wed, 25-Mar-2026 19:02:10 GMT; Path=/; Secure; HttpOnly; SameSite=none", + "EEEEEEE_EEEEEEE_EEEEEEEE=EeEEEeEEEeEeEe%22%22; Domain=.youtube.com; Expires=Wed, 25-Mar-2026 19:02:10 GMT; Path=/; Secure; HttpOnly; SameSite=none", + "__Ffffff-FFFFFFF_FFFFF=FFfffFfff5F5FFFFfF_ffffFFffFfF_ffffFFf%22%22; Domain=youtube.com; Expires=Wed, 25-Mar-2026 19:02:10 GMT; Path=/; Secure; HttpOnly; SameSite=none; Partitioned" + ], + "youtube.com": [ + "AAA=0; Domain=.youtube.com; Expires=Fri, 26-Sep-2025 19:32:04 GMT; Path=/; Secure; HttpOnly", + "BBB=bBBbbbb1BbB; Domain=.youtube.com; Path=/; Secure; HttpOnly; SameSite=none", + "__Cccccc-CCC=; Domain=.youtube.com; Expires=Sat, 31-Dec-2022 19:02:04 GMT; Path=/; Secure; HttpOnly; SameSite=lax", + "DDDDDDD_DDDD3_DDDD=dDdDddddD3D; Domain=.youtube.com; Expires=Wed, 25-Mar-2026 19:02:04 GMT; Path=/; Secure; HttpOnly; SameSite=none", + "EEEEEEE_EEEEEEE_EEEEEEEE=EeEEEeEEEeEeEE%22%22; Domain=.youtube.com; Expires=Wed, 25-Mar-2026 19:02:04 GMT; Path=/; Secure; HttpOnly; SameSite=none", + "__Ffffff-FFFFFFF_FFFFF=FFf5fFF5f_FffFFFfffF5555ffFFfffF5555ffF%22; Domain=youtube.com; Expires=Wed, 25-Mar-2026 19:02:04 GMT; Path=/; Secure; HttpOnly; SameSite=none; Partitioned" + ] +} diff --git a/scripts/update-benchmark.js b/scripts/update-benchmark.js index a6873c0..9dd124f 100644 --- a/scripts/update-benchmark.js +++ b/scripts/update-benchmark.js @@ -1,81 +1,89 @@ "use strict"; -const fs = require("fs"); +const fs = require("fs/promises"); const http = require("http"); const https = require("https"); const path = require("path"); const topSites = require("top-sites"); const url = require("url"); -const BENCH_COOKIES_FILE = path.join(__dirname, "parse-top.json"); -const domains = topSites.slice(0, 30).map((x) => x.rootDomain); - -getAllCookies(domains, function (err, cookies) { - if (err) throw err; - - const str = JSON.stringify( - Object.fromEntries( - Object.keys(cookies) - .sort() - .map((key) => [key, cookies[key]]) - .concat([["example.com", ""]]), - ), - null, - 2, +const BENCH_COOKIES_FILE = path.join(__dirname, "top-cookie.json"); +const BENCH_SET_COOKIES_FILE = path.join(__dirname, "top-set-cookie.json"); +const domains = topSites.slice(0, 20).map((x) => x.rootDomain); + +async function main() { + const [cookies, setCookies] = await getAllCookies(domains); + + await fs.writeFile( + BENCH_COOKIES_FILE, + JSON.stringify(sortObject(cookies), null, 2) + "\n", ); - fs.writeFile(BENCH_COOKIES_FILE, `${str}\n`, function (err) { - if (err) throw err; - console.log("Cookies saved to", BENCH_COOKIES_FILE); - process.exit(); - }); -}); + await fs.writeFile( + BENCH_SET_COOKIES_FILE, + JSON.stringify(sortObject(setCookies), null, 2) + "\n", + ); + + console.log("Cookies saved"); + process.exit(); +} + +main(); -function get(href, callback) { +function get(href) { const protocol = url.parse(href, false, true).protocol; const proto = protocol === "https:" ? https : http; - proto - .get(href) - .on("error", callback) - .on("response", function (res) { - if ( - res.headers.location && - res.statusCode >= 300 && - res.statusCode < 400 - ) { - get(url.resolve(href, res.headers.location), callback); - } else { - callback(null, res); - } - }); + return new Promise((resolve, reject) => { + proto + .get(href) + .on("error", reject) + .on("response", function (res) { + if ( + res.headers.location && + res.statusCode >= 300 && + res.statusCode < 400 + ) { + return resolve(get(url.resolve(href, res.headers.location))); + } + + return resolve(res); + }); + }); } -function getAllCookies(domains, callback) { - const all = Object.create(null); - let wait = domains.length; - - domains.forEach(function (domain) { - getCookies(domain, function (err, cookies) { - if (!err && cookies.length) { - all[domain] = cookies.map(obfuscate).join("; "); - } - if (!--wait) { - callback(null, all); - } +async function getAllCookies(domains) { + const allCookies = Object.create(null); + const allSetCookies = Object.create(null); + + for (const domain of domains) { + const setCookies = await getSetCookies(domain); + if (!setCookies.length) continue; + + const cookies = toCookies(setCookies); + allCookies[domain] = cookies.map(obfuscate).join("; "); + allSetCookies[domain] = setCookies.map((header, index) => { + const attrs = header.split(";"); + return [obfuscate(attrs.shift(), index), ...attrs].join("; "); }); - }); + } + + return [allCookies, allSetCookies]; } -function getCookies(domain, callback) { +async function getSetCookies(domain) { const href = url.format({ hostname: domain, protocol: "http" }); - get(href, function (err, res) { - if (err) return callback(err); - const cookies = (res.headers["set-cookie"] || []).map(function (c) { - return c.split(";")[0]; - }); - callback(null, cookies); - }); + try { + const res = await get(href); + return res.headers["set-cookie"] || []; + } catch (err) { + if (err.code === "ENOTFOUND") return []; + throw err; + } +} + +function toCookies(setCookies) { + return setCookies.map((c) => c.split(";")[0]); } function obfuscate(str, index) { @@ -96,3 +104,7 @@ function obfuscate(str, index) { return "%22"; }); } + +function sortObject(obj) { + return Object.fromEntries(Object.entries(obj).sort()); +} diff --git a/src/parse-cookie.bench.ts b/src/parse-cookie.bench.ts index 3e001cb..4fe35d2 100644 --- a/src/parse-cookie.bench.ts +++ b/src/parse-cookie.bench.ts @@ -1,8 +1,12 @@ import { describe, bench } from "vitest"; import * as cookie from "./index.js"; -import top from "../scripts/parse-top.json"; +import top from "../scripts/top-cookie.json"; describe("cookie.parseCookie", () => { + bench("empty", () => { + cookie.parseCookie(""); + }); + bench("simple", () => { cookie.parseCookie("foo=bar"); }); diff --git a/src/parse-set-cookie.bench.ts b/src/parse-set-cookie.bench.ts new file mode 100644 index 0000000..d96c3b4 --- /dev/null +++ b/src/parse-set-cookie.bench.ts @@ -0,0 +1,13 @@ +import { describe, bench } from "vitest"; +import * as cookie from "./index.js"; +import top from "../scripts/top-set-cookie.json"; + +describe("parse top-sites", () => { + Object.entries(top).forEach(function ([domain, values]) { + bench("parse " + domain, () => { + for (const value of values) { + cookie.parseSetCookie(value); + } + }); + }); +});