diff --git a/Cargo.lock b/Cargo.lock index efd04f2..2a475a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,11 +19,209 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-attributes" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ + "concurrent-queue", + "event-listener 5.2.0", + "event-listener-strategy 0.5.1", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10b3e585719c2358d2660232671ca8ca4ddb4be4ce8a1842d6c2dc8685303316" +dependencies = [ + "async-lock 3.3.0", + "async-task", + "concurrent-queue", + "fastrand 2.0.2", + "futures-lite 2.3.0", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.2.0", + "async-executor", + "async-io 2.3.2", + "async-lock 3.3.0", + "blocking", + "futures-lite 2.3.0", + "once_cell", + "tokio", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock 3.3.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.6.0", + "rustix 0.38.32", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io 1.13.0", + "async-lock 2.8.0", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 1.13.0", + "gloo-timers", + "kv-log-macro", + "log", "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", ] [[package]] @@ -45,18 +243,24 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] +[[package]] +name = "async-task" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" + [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -74,6 +278,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.1.0" @@ -82,9 +292,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -115,9 +325,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block-buffer" @@ -128,6 +338,22 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel 2.2.0", + "async-lock 3.3.0", + "async-task", + "fastrand 2.0.2", + "futures-io", + "futures-lite 2.3.0", + "piper", + "tracing", +] + [[package]] name = "bumpalo" version = "3.15.4" @@ -136,15 +362,15 @@ checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" @@ -158,6 +384,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "combine" version = "4.6.6" @@ -172,6 +404,15 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "cookie" version = "0.18.0" @@ -208,6 +449,12 @@ dependencies = [ "libc", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crypto-common" version = "0.1.6" @@ -316,11 +563,11 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35b50dba0afdca80b187392b24f2499a88c336d5a8493e4b4ccfb608708be56a" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -348,6 +595,29 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -364,17 +634,74 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +dependencies = [ + "event-listener 5.2.0", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "figment" -version = "0.10.14" +version = "0.10.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b6e5bc7bd59d60d0d45a6ccab6cf0f4ce28698fb4e81e750ddf229c9b824026" +checksum = "7270677e7067213e04f323b55084586195f18308cd7546cfac9f873344ccceb6" dependencies = [ "atomic 0.6.0", "pear", @@ -474,6 +801,34 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.0.2", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.30" @@ -482,7 +837,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -567,18 +922,49 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "h2" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", "indexmap", "slab", "tokio", @@ -626,6 +1012,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -633,7 +1030,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", "pin-project-lite", ] @@ -649,6 +1069,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "hyper" version = "0.14.28" @@ -659,9 +1085,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -673,6 +1099,26 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.3", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -680,10 +1126,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.28", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.2.0", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.2.0", + "pin-project-lite", + "socket2 0.5.6", + "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -698,9 +1180,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -713,6 +1195,26 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -749,11 +1251,15 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" name = "jarm_online" version = "0.2.2" dependencies = [ + "async-std", "csv", + "env_logger", "lazy_static", + "log", "openssl", - "redis 0.25.0", + "redis 0.25.2", "regex", + "reqwest 0.12.2", "rocket", "rocket-sentry", "rocket_db_pools", @@ -761,6 +1267,7 @@ dependencies = [ "rust_jarm", "sentry", "serde", + "tempfile", ] [[package]] @@ -772,6 +1279,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -784,6 +1300,12 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -805,6 +1327,9 @@ name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +dependencies = [ + "value-bag", +] [[package]] name = "loom" @@ -877,7 +1402,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http", + "http 0.2.12", "httparse", "log", "memchr", @@ -959,7 +1484,7 @@ version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "cfg-if", "foreign-types", "libc", @@ -976,7 +1501,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -1009,13 +1534,13 @@ dependencies = [ [[package]] name = "os_info" -version = "3.7.0" +version = "3.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" dependencies = [ "log", "serde", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -1024,6 +1549,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.12.1" @@ -1049,9 +1580,9 @@ dependencies = [ [[package]] name = "pear" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8" +checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" dependencies = [ "inlinable_string", "pear_codegen", @@ -1060,14 +1591,14 @@ dependencies = [ [[package]] name = "pear_codegen" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77" +checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -1076,6 +1607,26 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -1088,6 +1639,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.2", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.30" @@ -1139,7 +1701,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn", + "syn 2.0.55", ] [[package]] @@ -1185,6 +1747,37 @@ dependencies = [ "pnet_sys", ] +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 0.38.32", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1199,9 +1792,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -1214,7 +1807,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", "version_check", "yansi", ] @@ -1279,16 +1872,16 @@ dependencies = [ [[package]] name = "redis" -version = "0.25.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268dab7fe8f1d136b3c4367bc230383dc2c357f8e305ee898fa3beacddaf00d" +checksum = "71d64e978fd98a0e6b105d066ba4889a7301fca65aeac850a877d8797343feeb" dependencies = [ "combine", "itoa", "percent-encoding", "ryu", "sha1_smol", - "socket2 0.4.10", + "socket2 0.5.6", "url", ] @@ -1318,14 +1911,14 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", @@ -1373,20 +1966,20 @@ checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" [[package]] name = "reqwest" -version = "0.11.25" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eea5a9eb898d3783f17c6407670e3592fd174cb81a10e51d4c37f49450b9946" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", + "h2 0.3.25", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.28", + "hyper-tls 0.5.0", "ipnet", "js-sys", "log", @@ -1411,6 +2004,50 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d66674f2b6fb864665eea7a3c1ac4e3dfacd2fda83cf6f935a612e01b0e3338" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.3", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.2.0", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "winreg", +] + [[package]] name = "retain_mut" version = "0.1.9" @@ -1480,7 +2117,7 @@ dependencies = [ "proc-macro2", "quote", "rocket_http", - "syn", + "syn 2.0.55", "unicode-xid", "version_check", ] @@ -1517,8 +2154,8 @@ dependencies = [ "cookie", "either", "futures", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.28", "indexmap", "log", "memchr", @@ -1560,7 +2197,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn", + "syn 2.0.55", "unicode-ident", ] @@ -1593,14 +2230,28 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.13", "windows-sys 0.52.0", ] @@ -1683,7 +2334,7 @@ checksum = "766448f12e44d68e675d5789a261515c46ac6ccd240abdd451a9c46c84a49523" dependencies = [ "httpdate", "native-tls", - "reqwest", + "reqwest 0.11.27", "sentry-backtrace", "sentry-contexts", "sentry-core", @@ -1800,7 +2451,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -1881,9 +2532,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -1931,9 +2582,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", @@ -1948,20 +2610,20 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "system-configuration" -version = "0.6.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bc6ee10a9b4fcf576e9b0819d95ec16f4d2c02d39fd83ac1c8789785c4a42" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags 2.4.2", + "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.6.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ "core-foundation-sys", "libc", @@ -1974,29 +2636,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand", - "rustix", + "fastrand 2.0.2", + "rustix 0.38.32", "windows-sys 0.52.0", ] [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -2081,7 +2743,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -2096,9 +2758,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -2121,9 +2783,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.10" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", @@ -2142,9 +2804,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.6" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" dependencies = [ "indexmap", "serde", @@ -2153,6 +2815,28 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -2165,6 +2849,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2178,7 +2863,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -2312,11 +2997,17 @@ dependencies = [ "serde", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "uuid" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "serde", ] @@ -2327,6 +3018,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "value-bag" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74797339c3b98616c009c7c3eb53a0ce41e85c8ec66bd3db96ed132d20cfdee8" + [[package]] name = "vcpkg" version = "0.2.15" @@ -2339,6 +3036,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + [[package]] name = "want" version = "0.3.1" @@ -2375,7 +3078,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.55", "wasm-bindgen-shared", ] @@ -2409,7 +3112,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2420,6 +3123,19 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "wasm-streams" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.69" @@ -2614,9 +3330,9 @@ dependencies = [ [[package]] name = "yansi" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2861d76f58ec8fc95708b9b1e417f7b12fd72ad33c01fa6886707092dea0d3" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" dependencies = [ "is-terminal", ] diff --git a/Cargo.toml b/Cargo.toml index 509a193..bc45ecd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,11 @@ openssl = { version = "~0.10.55", features = ["vendored"] } # Required for sent sentry = "0.32" rocket-sentry = "0.17" redis = "0.25" +log = "0.4" +env_logger = "0.11" +async-std = { version = "1.12", features = ["attributes", "tokio1"] } +reqwest = { version = "0.12.2", features = ["stream"] } +tempfile = "3.10.1" [dependencies.rocket_db_pools] version = "0.1.0" diff --git a/README.md b/README.md index 194894f..dbb3b26 100644 --- a/README.md +++ b/README.md @@ -42,12 +42,22 @@ It takes a required `host` parameter and optionally `port` (default to 443). ### Retrieve domains from alexa top 1 million that match a jarm hash +**DEPRECATED** see `tranco-overlap` instead + ````http request GET api/v1/alexa-overlap?jarm_hash= ```` The returned list is ordered by top alexa rank first +### Retrieve domains from tranco top 1 million that match a jarm hash + +````http request +GET api/v1/tranco-overlap?jarm_hash= +```` + +The returned list is ordered by top tranco rank first + ### Retrieve recently scanned hosts ````http request diff --git a/docker-compose.playwright.yml b/docker-compose.playwright.yml index 907ae88..5f3c9e1 100644 --- a/docker-compose.playwright.yml +++ b/docker-compose.playwright.yml @@ -16,8 +16,10 @@ services: environment: - ROCKET_SENTRY_DSN=123 # this way sentry is disabled but do not crash - ALEXA_TOP1M_RAW_DATA_PATH=/alexa_top1M.csv + - FORCE_TRANCO_TOP1M_RAW_DATA_PATH=/tranco_top1M.csv volumes: - ./tests/fixtures_data/alexa_top1M.csv:/alexa_top1M.csv + - ./tests/fixtures_data/tranco_top1M.csv:/tranco_top1M.csv depends_on: - redis diff --git a/examples/tranco_top1m.url b/examples/tranco_top1m.url new file mode 100644 index 0000000..c70a710 --- /dev/null +++ b/examples/tranco_top1m.url @@ -0,0 +1,29 @@ +# Request for no overlap +GET {{host}}/tranco-overlap?jarm_hash=123 + +HTTP 200 +Content-Type: application/json +[Asserts] +jsonpath "$.overlapping_domains" isEmpty + +# Request with 1 overlap +GET {{host}}/tranco-overlap?jarm_hash=3fd3fd20d3fd3fd21c3fd3fd3fd3fd2b66a312d81ed1efa0f55830f7490cb2 + +HTTP 200 +Content-Type: application/json +[Asserts] +jsonpath "$.overlapping_domains" count == 1 +jsonpath "$.overlapping_domains.[0].rank" == 9 +jsonpath "$.overlapping_domains.[0].domain" == "zhihu.com" + +# Request with 2 overlap +GET {{host}}/tranco-overlap?jarm_hash=21d19d00021d21d00021d19d21d21d1a46380b04d662f0848f508dd171125d + +HTTP 200 +Content-Type: application/json +[Asserts] +jsonpath "$.overlapping_domains" count == 2 +jsonpath "$.overlapping_domains.[0].rank" == 11 +jsonpath "$.overlapping_domains.[0].domain" == "fake_site_1.com" +jsonpath "$.overlapping_domains.[1].rank" == 12 +jsonpath "$.overlapping_domains.[1].domain" == "fake_site_2.com" diff --git a/jarm_online_gui/package-lock.json b/jarm_online_gui/package-lock.json index db86c01..df5f8bb 100644 --- a/jarm_online_gui/package-lock.json +++ b/jarm_online_gui/package-lock.json @@ -61,27 +61,27 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", @@ -109,9 +109,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, "dependencies": { "@babel/types": "^7.24.0", @@ -265,9 +265,9 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", @@ -365,9 +365,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -425,9 +425,9 @@ } }, "node_modules/@codecov/bundler-plugin-core": { - "version": "0.0.1-beta.5", - "resolved": "https://registry.npmjs.org/@codecov/bundler-plugin-core/-/bundler-plugin-core-0.0.1-beta.5.tgz", - "integrity": "sha512-eltwv1aRJdwonlTD47jQ2GYdKZfMv3jCviDui32JOu12ZAiI3WdJCtjWF9zxpmnHEZ30pn0WbeZir+sXSFLJHw==", + "version": "0.0.1-beta.6", + "resolved": "https://registry.npmjs.org/@codecov/bundler-plugin-core/-/bundler-plugin-core-0.0.1-beta.6.tgz", + "integrity": "sha512-dGk/s90fZm7D1O00gRtuE2gqM/CW9nglaPzcIT0v10VOV2tj+aHRrdB+yjas+RW8QP8Qf/sMqSmjkufP1iqggw==", "dev": true, "dependencies": { "chalk": "4.1.2", @@ -440,12 +440,12 @@ } }, "node_modules/@codecov/vite-plugin": { - "version": "0.0.1-beta.5", - "resolved": "https://registry.npmjs.org/@codecov/vite-plugin/-/vite-plugin-0.0.1-beta.5.tgz", - "integrity": "sha512-KW+AY27lqFSOj1lY+yO7zLSNdxCaYaRTnHibRBNyCvVd76MdaResIpFr1bxjgaxVGaEtsV4mcTzDjtlgVV/+nw==", + "version": "0.0.1-beta.6", + "resolved": "https://registry.npmjs.org/@codecov/vite-plugin/-/vite-plugin-0.0.1-beta.6.tgz", + "integrity": "sha512-eIi3M9R1om/T+6FoZGaffWMmwSZ0nx1fIGgidFRFkQdXtKAwHU0//YjCXOg17vJsPXlaSatM81EQBU/qmSXQ1Q==", "dev": true, "dependencies": { - "@codecov/bundler-plugin-core": "^0.0.1-beta.5" + "@codecov/bundler-plugin-core": "^0.0.1-beta.6" }, "engines": { "node": ">=18.0.0" @@ -921,9 +921,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@jridgewell/gen-mapping": { @@ -1009,9 +1009,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", - "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.0.tgz", + "integrity": "sha512-4fDVBAfWYlw2CtYgHEWarAYSozTx5OYLsSM/cdGW7H51FwI10DaGnjKgdqWyWXY/VjugelzriCiKf1UdM20Bxg==", "cpu": [ "arm" ], @@ -1022,9 +1022,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", - "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.0.tgz", + "integrity": "sha512-JltUBgsKgN108NO4/hj0B/dJYNrqqmdRCtUet5tFDi/w+0tvQP0FToyWBV4HKBcSX4cvFChrCyt5Rh4FX6M6QQ==", "cpu": [ "arm64" ], @@ -1035,9 +1035,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", - "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.0.tgz", + "integrity": "sha512-UwF7tkWf0roggMRv7Vrkof7VgX9tEZIc4vbaQl0/HNX3loWlcum+0ODp1Qsd8s7XvQGT+Zboxx1qxav3vq8YDw==", "cpu": [ "arm64" ], @@ -1048,9 +1048,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", - "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.0.tgz", + "integrity": "sha512-RIY42wn6+Yb0qD29T7Dvm9/AhxrkGDf7X5dgI6rUFXR19+vCLh3u45yLcKOayu2ZQEba9rf/+BX3EggVwckiIw==", "cpu": [ "x64" ], @@ -1061,9 +1061,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", - "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.0.tgz", + "integrity": "sha512-r2TGCIKzqk8VwjOvW7sveledh6aPao131ejUfZNIyFlWBCruF4HOu51KtLArDa7LL6qKd0vkgxGX3/2NmYpWig==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.0.tgz", + "integrity": "sha512-/QwaDp0RXQTtm25wQFSl02zEm9oveRXr9qAHbdxWCm9YG9dR8esqpyqzS/3GgHDm7jHktPNz9gTENfoUKRCcXQ==", "cpu": [ "arm" ], @@ -1074,9 +1087,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", - "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.0.tgz", + "integrity": "sha512-iypHsz7YEfoyNL0iHbQ7B7pY6hpymvvMgFXXaMd5+WCtvJ9zqWPZKFmo78UeWzWNmTP9JtPiNIQt6efRxx/MNA==", "cpu": [ "arm64" ], @@ -1087,9 +1100,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", - "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.0.tgz", + "integrity": "sha512-7UpYcO0uVeomnoL5MpQhrS0FT7xZUJrEXtKVLmps5bRA7x5AiA1PDuPnMbxcOBWjIM2HHIG1t3ndnRTVMIbk5A==", "cpu": [ "arm64" ], @@ -1099,10 +1112,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.0.tgz", + "integrity": "sha512-FSuFy4/hOQy0lH135ifnElP/6dKoHcZGHovsaRY0jrfNRR2yjMnVYaqNHKGKy0b/1I8DkD/JtclgJfq7SPti1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", - "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.0.tgz", + "integrity": "sha512-qxAB8MiHuDI8jU0D+WI9Gym3fvUJHA/AjKRXxbEH921SB3AeKQStq1FKFA59dAoqqCArjJ1voXM/gMvgEc1q4Q==", "cpu": [ "riscv64" ], @@ -1112,10 +1138,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.0.tgz", + "integrity": "sha512-j/9yBgWFlNFBfG/S1M2zkBNLeLkNVG59T5c4tlmlrxU+XITWJ3aMVWdpcZ/+mu7auGZftAXueAgAE9mb4lAlag==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", - "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.0.tgz", + "integrity": "sha512-SjsBA1a9wrEleNneGEsR40HdxKdwCatyHC547o/XINqwPW4cqTYiNy/lL1WTJYWU/KgWIb8HH4SgmFStbWoBzw==", "cpu": [ "x64" ], @@ -1126,9 +1165,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", - "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.0.tgz", + "integrity": "sha512-YKCs7ghJZ5po6/qgfONiXyFKOKcTK4Kerzk/Kc89QK0JT94Qg4NurL+3Y3rZh5am2tu1OlvHPpBHQNBE8cFgJQ==", "cpu": [ "x64" ], @@ -1139,9 +1178,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", - "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.0.tgz", + "integrity": "sha512-+wtkF+z2nw0ZwwHji01wOW0loxFl24lBNxPtVAXtnPPDL9Ew0EhiCMOegXe/EAH3Zlr8Iw9tyPJXB3DltQLEyw==", "cpu": [ "arm64" ], @@ -1152,9 +1191,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", - "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.0.tgz", + "integrity": "sha512-7qLyKTL7Lf2g0B8bduETVAEI3WVUVwBRVcECojVevPNVAmi19IW1P2X+uMSwhmWNy36Q/qEvxXsfts1I8wpawg==", "cpu": [ "ia32" ], @@ -1165,9 +1204,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", - "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.0.tgz", + "integrity": "sha512-tkfxXt+7c3Ecgn7ln9NJPdBM+QKwQdmFFpgAP+FYhAuRS5y3tY8xeza82gFjbPpytkHmaQnVdMtuzbToCz2tuw==", "cpu": [ "x64" ], @@ -1178,84 +1217,84 @@ ] }, "node_modules/@sentry-internal/feedback": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.108.0.tgz", - "integrity": "sha512-8JcgZEnk1uWrXJhsd3iRvFtEiVeaWOEhN0NZwhwQXHfvODqep6JtrkY1yCIyxbpA37aZmrPc2JhyotRERGfUjg==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.111.0.tgz", + "integrity": "sha512-xaKgPPDEirOan7c9HwzYA1KK87kRp/qfIx9ZKLOEtxwy6nqoMuSByGqSwm1Oqfcjpbd7y6/y+7Bw+69ZKNVLDQ==", "dependencies": { - "@sentry/core": "7.108.0", - "@sentry/types": "7.108.0", - "@sentry/utils": "7.108.0" + "@sentry/core": "7.111.0", + "@sentry/types": "7.111.0", + "@sentry/utils": "7.111.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.108.0.tgz", - "integrity": "sha512-R5tvjGqWUV5vSk0N1eBgVW7wIADinrkfDEBZ9FyKP2mXHBobsyNGt30heJDEqYmVqluRqjU2NuIRapsnnrpGnA==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.111.0.tgz", + "integrity": "sha512-3KPBIpiegTYmuVw9gA2aKuliAQONS3Ny1kJc9x5kz6XQGuLFxqlh6KzoCVaKfQJeq2WJqRNeR4KFFuNGuB3H8w==", "dependencies": { - "@sentry/core": "7.108.0", - "@sentry/replay": "7.108.0", - "@sentry/types": "7.108.0", - "@sentry/utils": "7.108.0" + "@sentry/core": "7.111.0", + "@sentry/replay": "7.111.0", + "@sentry/types": "7.111.0", + "@sentry/utils": "7.111.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry-internal/tracing": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.108.0.tgz", - "integrity": "sha512-zuK5XsTsb+U+hgn3SPetYDAogrXsM16U/LLoMW7+TlC6UjlHGYQvmX3o+M2vntejoU1QZS8m1bCAZSMWEypAEw==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.111.0.tgz", + "integrity": "sha512-CgXly8rsdu4loWVKi2RqpInH3C2cVBuaYsx4ZP5IJpzSinsUAMyyr3Pc0PZzCyoVpBBXGBGj/4HhFsY3q6Z0Vg==", "dependencies": { - "@sentry/core": "7.108.0", - "@sentry/types": "7.108.0", - "@sentry/utils": "7.108.0" + "@sentry/core": "7.111.0", + "@sentry/types": "7.111.0", + "@sentry/utils": "7.111.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.16.0.tgz", - "integrity": "sha512-+uy1qPkA5MSNgJ0L9ur/vNTydfdHwHnBX2RQ+0thsvkqf90fU788YjkkXwUiBBNuqNyI69JiOW6frixAWy7oUg==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-2.16.1.tgz", + "integrity": "sha512-pJka66URsqQbk6hTs9H1XFpUeI0xxuqLYf9Dy5pRGNHSJMtfv91U+CaYSWt03aRRMGDXMduh62zAAY7Wf0HO+A==", "dev": true, "engines": { "node": ">= 14" } }, "node_modules/@sentry/browser": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.108.0.tgz", - "integrity": "sha512-FNpzsdTvGvdHJMUelqEouUXMZU7jC+dpN7CdT6IoHVVFEkoAgrjMVUhXZoQ/dmCkdKWHmFSQhJ8Fm6V+e9Aq0A==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.111.0.tgz", + "integrity": "sha512-x7S9XoJh+TbMnur4eBhPpCVo+p7udABBV2gQk+Iw6LP9e8EFKmGmNyl76vSsT6GeFJ7mwxDEKfuwbVoLBjIvHw==", "dependencies": { - "@sentry-internal/feedback": "7.108.0", - "@sentry-internal/replay-canvas": "7.108.0", - "@sentry-internal/tracing": "7.108.0", - "@sentry/core": "7.108.0", - "@sentry/replay": "7.108.0", - "@sentry/types": "7.108.0", - "@sentry/utils": "7.108.0" + "@sentry-internal/feedback": "7.111.0", + "@sentry-internal/replay-canvas": "7.111.0", + "@sentry-internal/tracing": "7.111.0", + "@sentry/core": "7.111.0", + "@sentry/replay": "7.111.0", + "@sentry/types": "7.111.0", + "@sentry/utils": "7.111.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.16.0.tgz", - "integrity": "sha512-dhgIZsIR3L9KnE2OO5JJm6hPtStAjEPYKQsZzxRr69uVhd9xAvfXeXr0afKVNVEcIDksas6yMgHqwQ2wOXFIAg==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-2.16.1.tgz", + "integrity": "sha512-n6z8Ts3T9HROLuY7tVEYpBKvS+P7+b8NdqxP7QBcwp2nuPUlN5Ola1ivFjk1p5a7wRYeN9zM8orGe4l2HeNfYA==", "dev": true, "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "2.16.0", + "@sentry/babel-plugin-component-annotate": "2.16.1", "@sentry/cli": "^2.22.3", "dotenv": "^16.3.1", "find-up": "^5.0.0", "glob": "^9.3.2", - "magic-string": "0.27.0", + "magic-string": "0.30.8", "unplugin": "1.0.1" }, "engines": { @@ -1281,9 +1320,9 @@ "dev": true }, "node_modules/@sentry/cli": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.30.2.tgz", - "integrity": "sha512-jQ/RBJ3bZ4PFbfOsGq8EykygHHmXXPw+i6jqsnQfAPIeZoX+DsqpAZbYubQEZKekmQ8EVGFxGHzUVkd6hLVMbA==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.31.0.tgz", + "integrity": "sha512-nCESoXAG3kRUO5n3QbDYAqX6RU3z1ORjnd7a3sqijYsCGHfOpcjGdS7JYLVg5if+tXMEF5529BPXFe5Kg/J9tw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -1300,19 +1339,19 @@ "node": ">= 10" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.30.2", - "@sentry/cli-linux-arm": "2.30.2", - "@sentry/cli-linux-arm64": "2.30.2", - "@sentry/cli-linux-i686": "2.30.2", - "@sentry/cli-linux-x64": "2.30.2", - "@sentry/cli-win32-i686": "2.30.2", - "@sentry/cli-win32-x64": "2.30.2" + "@sentry/cli-darwin": "2.31.0", + "@sentry/cli-linux-arm": "2.31.0", + "@sentry/cli-linux-arm64": "2.31.0", + "@sentry/cli-linux-i686": "2.31.0", + "@sentry/cli-linux-x64": "2.31.0", + "@sentry/cli-win32-i686": "2.31.0", + "@sentry/cli-win32-x64": "2.31.0" } }, "node_modules/@sentry/cli-darwin": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.30.2.tgz", - "integrity": "sha512-lZkKXMt0HUAwLQuPpi/DM3CsdCCp+6B2cdur+8fAq7uARXTOsTKVDxv9pkuJHCgHUnguh8ittP5GMr0baTxmMg==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.31.0.tgz", + "integrity": "sha512-VM5liyxMnm4K2g0WsrRPXRCMLhaT09C7gK5Fz/CxKYh9sbMZB7KA4hV/3klkyuyw1+ECF1J66cefhNkFZepUig==", "dev": true, "optional": true, "os": [ @@ -1323,9 +1362,9 @@ } }, "node_modules/@sentry/cli-linux-arm": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.30.2.tgz", - "integrity": "sha512-H7hqiLpEL7w/EHdhuUGatwg9O080mdujq4/zS96buKIHXxZE6KqMXGtMVIAvTl1+z6BlBEnfvZGI19MPw3t/7w==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.31.0.tgz", + "integrity": "sha512-AZoCN3waXEfXGCd3YSrikcX/y63oQe0Tiyapkeoifq/0QhI+2MOOrAQb60gthsXwb0UDK/XeFi3PaxyUCphzxA==", "cpu": [ "arm" ], @@ -1340,9 +1379,9 @@ } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.30.2.tgz", - "integrity": "sha512-IWassuXggNhHOPCNrORNmd5SrAx5rU4XDlgOWBJr/ez7DvlPrr9EhV1xsdht6K4mPXhCGJq3rtRdCoWGJQW6Uw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.31.0.tgz", + "integrity": "sha512-eENJTmXoFX3uNr8xRW7Bua2Sw3V1tylQfdtS85pNjZPdbm3U8wYQSWu2VoZkK2ASOoC+17YC8jTQxq62KWnSeQ==", "cpu": [ "arm64" ], @@ -1357,9 +1396,9 @@ } }, "node_modules/@sentry/cli-linux-i686": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.30.2.tgz", - "integrity": "sha512-gZIq131M4TJTG1lX9uvpoaGWaEXCEfdDXrXu/z/YZmAKBcThpMYChodXmm8FB6X4xb0TPXzIFqdzlLdglFK46g==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.31.0.tgz", + "integrity": "sha512-cQUFb3brhLaNSIoNzjU/YASnTM1I3TDJP9XXzH0eLK9sSopCcDcc6OrYEYvdjJXZKzFv5sbc9UNMsIDbh4+rYg==", "cpu": [ "x86", "ia32" @@ -1375,9 +1414,9 @@ } }, "node_modules/@sentry/cli-linux-x64": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.30.2.tgz", - "integrity": "sha512-NmTAIl7aW9OHxwB4149sBfvCbTyK9T/CvBX38keaD2yIThet9gZ4koP49hBDxYF99aQX3E+LIAqWwnkV9W72Sw==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.31.0.tgz", + "integrity": "sha512-z1zTNg91nZJRdcGHC/bCU1KwIaifV0MLJteip9KrFDprzhJk1HtMxFOS0+OZ5/UH21CjAFmg9Pj6IAGqm3BYjA==", "cpu": [ "x64" ], @@ -1392,9 +1431,9 @@ } }, "node_modules/@sentry/cli-win32-i686": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.30.2.tgz", - "integrity": "sha512-SBR/Q3T6o+7uHwHNdjcG9GA3R++9w8oi778b95GuOC3dh0WOU6hXaKwQWe95ZcuSd2rKpouH7dhMjqqNM4HxOA==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.31.0.tgz", + "integrity": "sha512-+K7fdk57aUd4CmYrQfDGYPzVyxsTnVro6IPb5QSSLpP03dL7ko5208epu4m2SyN/MkFvscy9Di3n3DTvIfDU2w==", "cpu": [ "x86", "ia32" @@ -1409,9 +1448,9 @@ } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.30.2", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.30.2.tgz", - "integrity": "sha512-gF9wSZxzXFgakkC+uKVLAAYlbYj13e1gTsNm3gm+ODfpV+rbHwvbKoLfNsbVCFVCEZxIV2rXEP5WmTr0kiMvWQ==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.31.0.tgz", + "integrity": "sha512-w5cvpZ6VVlhlyleY8TYHmrP7g48vKHnoVt5xFccfxT+HqQI/AxodvzgVvBTM2kB/sh/kHwexp6bJGWCdkGftww==", "cpu": [ "x64" ], @@ -1425,57 +1464,57 @@ } }, "node_modules/@sentry/core": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.108.0.tgz", - "integrity": "sha512-I/VNZCFgLASxHZaD0EtxZRM34WG9w2gozqgrKGNMzAymwmQ3K9g/1qmBy4e6iS3YRptb7J5UhQkZQHrcwBbjWQ==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.111.0.tgz", + "integrity": "sha512-/ljeMjZu8CSrLGrseBi/7S2zRIFsqMcvfyG6Nwgfc07J9nbHt8/MqouE1bXZfiaILqDBpK7BK9MLAAph4mkAWg==", "dependencies": { - "@sentry/types": "7.108.0", - "@sentry/utils": "7.108.0" + "@sentry/types": "7.111.0", + "@sentry/utils": "7.111.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/replay": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.108.0.tgz", - "integrity": "sha512-jo8fDOzcZJclP1+4n9jUtVxTlBFT9hXwxhAMrhrt70FV/nfmCtYQMD3bzIj79nwbhUtFP6pN39JH1o7Xqt1hxQ==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.111.0.tgz", + "integrity": "sha512-cSbI4A4hrO0sZ0ynvLQauPg8YyaDOQkhGkyvbws8W9WgfxR8X827bY9S0f1TPfgaFiVcKb0iRaAwyXHg3pyzOg==", "dependencies": { - "@sentry-internal/tracing": "7.108.0", - "@sentry/core": "7.108.0", - "@sentry/types": "7.108.0", - "@sentry/utils": "7.108.0" + "@sentry-internal/tracing": "7.111.0", + "@sentry/core": "7.111.0", + "@sentry/types": "7.111.0", + "@sentry/utils": "7.111.0" }, "engines": { "node": ">=12" } }, "node_modules/@sentry/types": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.108.0.tgz", - "integrity": "sha512-bKtHITmBN3kqtqE5eVvL8mY8znM05vEodENwRpcm6TSrrBjC2RnwNWVwGstYDdHpNfFuKwC8mLY9bgMJcENo8g==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.111.0.tgz", + "integrity": "sha512-Oti4pgQ55+FBHKKcHGu51ZUxO1u52G5iVNK4mbtAN+5ArSCy/2s1H8IDJiOMswn3acfUnCR0oB/QsbEgAPZ26g==", "engines": { "node": ">=8" } }, "node_modules/@sentry/utils": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.108.0.tgz", - "integrity": "sha512-a45yEFD5qtgZaIFRAcFkG8C8lnDzn6t4LfLXuV4OafGAy/3ZAN3XN8wDnrruHkiUezSSANGsLg3bXaLW/JLvJw==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.111.0.tgz", + "integrity": "sha512-CB5rz1EgCSwj3xoXogsCZ5pQtfERrURc/ItcCuoaijUhkD0iMq5MCNWMHW3mBsBrqx/Oba+XGvDu0t/5+SWwBg==", "dependencies": { - "@sentry/types": "7.108.0" + "@sentry/types": "7.111.0" }, "engines": { "node": ">=8" } }, "node_modules/@sentry/vite-plugin": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-2.16.0.tgz", - "integrity": "sha512-/7rFTpasql9fJ1KbruF0yDESKV/ojvOP9pL/qqwUffvA9iy9Bvw3kYzzyzd1YsiCiVBgftoCsFTKPcvL3A4rwQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-2.16.1.tgz", + "integrity": "sha512-RSIyeqFG3PR5iJsZnagQxzOhM22z1Kh9DG+HQQsfVrxokzrWKRu/G17O2MIDh2I5iYEaL0Fkd/9RAXE4/b0aVg==", "dev": true, "dependencies": { - "@sentry/bundler-plugin-core": "2.16.0", + "@sentry/bundler-plugin-core": "2.16.1", "unplugin": "1.0.1" }, "engines": { @@ -1501,14 +1540,14 @@ "dev": true }, "node_modules/@sentry/vue": { - "version": "7.108.0", - "resolved": "https://registry.npmjs.org/@sentry/vue/-/vue-7.108.0.tgz", - "integrity": "sha512-hnqL/LIq3i4dJVMFq0oP8OP5ybMRYcW5dhtzlJFKo3A9i0BRzC4VUUcDnm1zTT9Um1YIU19mOy0cJBGplRQB9g==", + "version": "7.111.0", + "resolved": "https://registry.npmjs.org/@sentry/vue/-/vue-7.111.0.tgz", + "integrity": "sha512-MEvv+1r7548rMuZF3WbxY2OYxHyjuROMTptYR2xrQj+jEkJ1hFbZyn5J+uH/9OamGY2rksnMqxFBcnfdqrItvA==", "dependencies": { - "@sentry/browser": "7.108.0", - "@sentry/core": "7.108.0", - "@sentry/types": "7.108.0", - "@sentry/utils": "7.108.0" + "@sentry/browser": "7.111.0", + "@sentry/core": "7.111.0", + "@sentry/types": "7.111.0", + "@sentry/utils": "7.111.0" }, "engines": { "node": ">=8" @@ -1530,21 +1569,21 @@ "dev": true }, "node_modules/@unhead/dom": { - "version": "1.8.20", - "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.8.20.tgz", - "integrity": "sha512-TXRQSVbqBOQc02m3wxgj55m93U8a3WBHV9xJi2zVX/iHEJgeQbZMJ+rV0YJkHy2OHAC0MfjVQA5NDLaVwtromw==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.9.7.tgz", + "integrity": "sha512-suZVi8apZCNEMKuasGboBB3njJJm+gd8G0NA89geVozJ0bz40FvLyLEJZ9LirbzpujmhgHhsUSvlq4QyslRqdQ==", "dependencies": { - "@unhead/schema": "1.8.20", - "@unhead/shared": "1.8.20" + "@unhead/schema": "1.9.7", + "@unhead/shared": "1.9.7" }, "funding": { "url": "https://github.com/sponsors/harlan-zw" } }, "node_modules/@unhead/schema": { - "version": "1.8.20", - "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.8.20.tgz", - "integrity": "sha512-n0e5jsKino8JTHc4wpr4l8MXXIrj0muYYAEVa0WSYkIVnMiBr1Ik3l6elhCr4fdSyJ3M2DQQleea/oZCr11XCw==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.9.7.tgz", + "integrity": "sha512-naQGY1gQqq8DmQCxVTOeeXIqaRwbqnLEgvQl12zPEDviYxmg7TCbmKyN9uT4ZarQbJ2WYT2UtYvdSrmTXcwlBw==", "dependencies": { "hookable": "^5.5.3", "zhead": "^2.2.4" @@ -1554,25 +1593,25 @@ } }, "node_modules/@unhead/shared": { - "version": "1.8.20", - "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.8.20.tgz", - "integrity": "sha512-J0fdtavcMtXcG0g9jmVW03toqfr8A0G7k+Q6jdpwuUPhWk/vhfZn3aiRV+F8LlU91c/AbGWDv8T1MrtMQbb0Sg==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.9.7.tgz", + "integrity": "sha512-srji+qaBkkGOTdtTmFxt3AebFYcpt1qQHeQva7X3dSm5nZJDoKj35BJJTZfBSRCjgvkTtsdVUT14f9p9/4BCMA==", "dependencies": { - "@unhead/schema": "1.8.20" + "@unhead/schema": "1.9.7" }, "funding": { "url": "https://github.com/sponsors/harlan-zw" } }, "node_modules/@unhead/vue": { - "version": "1.8.20", - "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.8.20.tgz", - "integrity": "sha512-Lm6cnbX/QGCh+pxGN1Tl6LVXxYs5bLlN8APfI2rQ5kMNRE6Yy7r2eY5wCZ0SfsSRonqJxzVlgMMh8JPEY5d4GQ==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.9.7.tgz", + "integrity": "sha512-c5pcNvi3FwMfqd+lfD3XUyRKPDv/AVPrep84CFXaqB7ebb+2OQTgtxBiCoRsa8+DtdhYI50lYJ/yeVdfLI9XUw==", "dependencies": { - "@unhead/schema": "1.8.20", - "@unhead/shared": "1.8.20", + "@unhead/schema": "1.9.7", + "@unhead/shared": "1.9.7", "hookable": "^5.5.3", - "unhead": "1.8.20" + "unhead": "1.9.7" }, "funding": { "url": "https://github.com/sponsors/harlan-zw" @@ -1595,105 +1634,94 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.23.tgz", + "integrity": "sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ==", "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.21", + "@babel/parser": "^7.24.1", + "@vue/shared": "3.4.23", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", - "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.23.tgz", + "integrity": "sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw==", "dependencies": { - "@vue/compiler-core": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-core": "3.4.23", + "@vue/shared": "3.4.23" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", - "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", - "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.21", - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.7", - "postcss": "^8.4.35", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.23.tgz", + "integrity": "sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" + "@babel/parser": "^7.24.1", + "@vue/compiler-core": "3.4.23", + "@vue/compiler-dom": "3.4.23", + "@vue/compiler-ssr": "3.4.23", + "@vue/shared": "3.4.23", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.8", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", - "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.23.tgz", + "integrity": "sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg==", "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-dom": "3.4.23", + "@vue/shared": "3.4.23" } }, "node_modules/@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.23.tgz", + "integrity": "sha512-GlXR9PL+23fQ3IqnbSQ8OQKLodjqCyoCrmdLKZk3BP7jN6prWheAfU7a3mrltewTkoBm+N7qMEb372VHIkQRMQ==", "dependencies": { - "@vue/shared": "3.4.21" + "@vue/shared": "3.4.23" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.23.tgz", + "integrity": "sha512-FeQ9MZEXoFzFkFiw9MQQ/FWs3srvrP+SjDKSeRIiQHIhtkzoj0X4rWQlRNHbGuSwLra6pMyjAttwixNMjc/xLw==", "dependencies": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/reactivity": "3.4.23", + "@vue/shared": "3.4.23" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.23.tgz", + "integrity": "sha512-RXJFwwykZWBkMiTPSLEWU3kgVLNAfActBfWFlZd0y79FTUxexogd0PLG4HH2LfOktjRxV47Nulygh0JFXe5f9A==", "dependencies": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", + "@vue/runtime-core": "3.4.23", + "@vue/shared": "3.4.23", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.23.tgz", + "integrity": "sha512-LDwGHtnIzvKFNS8dPJ1SSU5Gvm36p2ck8wCZc52fc3k/IfjKcwCyrWEf0Yag/2wTFUBXrqizfhK9c/mC367dXQ==", "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-ssr": "3.4.23", + "@vue/shared": "3.4.23" }, "peerDependencies": { - "vue": "3.4.21" + "vue": "3.4.23" } }, "node_modules/@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==" + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.23.tgz", + "integrity": "sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg==" }, "node_modules/acorn": { "version": "8.11.3", @@ -1890,9 +1918,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001611", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz", + "integrity": "sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==", "dev": true, "funding": [ { @@ -2104,9 +2132,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.715", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz", - "integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==", + "version": "1.4.745", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.745.tgz", + "integrity": "sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA==", "dev": true }, "node_modules/entities": { @@ -2235,12 +2263,13 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.23.0.tgz", - "integrity": "sha512-Bqd/b7hGYGrlV+wP/g77tjyFmp81lh5TMw0be9093X02SyelxRRfCI6/IsGq/J7Um0YwB9s0Ry0wlFyjPdmtUw==", + "version": "9.25.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz", + "integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", @@ -2252,7 +2281,22 @@ "node": "^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint-scope": { @@ -2840,12 +2884,11 @@ } }, "node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { "node": ">=12" @@ -3063,12 +3106,12 @@ } }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -3272,9 +3315,9 @@ } }, "node_modules/rollup": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", - "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.0.tgz", + "integrity": "sha512-joxy/Hd4Ee289394//Q1aoebcxXyHasDieCTk8YtP4G4al4TUlx85EnuCLrfrdtLzrna9kNjH++Sx063wxSgmA==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -3287,19 +3330,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.0", - "@rollup/rollup-android-arm64": "4.13.0", - "@rollup/rollup-darwin-arm64": "4.13.0", - "@rollup/rollup-darwin-x64": "4.13.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", - "@rollup/rollup-linux-arm64-gnu": "4.13.0", - "@rollup/rollup-linux-arm64-musl": "4.13.0", - "@rollup/rollup-linux-riscv64-gnu": "4.13.0", - "@rollup/rollup-linux-x64-gnu": "4.13.0", - "@rollup/rollup-linux-x64-musl": "4.13.0", - "@rollup/rollup-win32-arm64-msvc": "4.13.0", - "@rollup/rollup-win32-ia32-msvc": "4.13.0", - "@rollup/rollup-win32-x64-msvc": "4.13.0", + "@rollup/rollup-android-arm-eabi": "4.16.0", + "@rollup/rollup-android-arm64": "4.16.0", + "@rollup/rollup-darwin-arm64": "4.16.0", + "@rollup/rollup-darwin-x64": "4.16.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.16.0", + "@rollup/rollup-linux-arm-musleabihf": "4.16.0", + "@rollup/rollup-linux-arm64-gnu": "4.16.0", + "@rollup/rollup-linux-arm64-musl": "4.16.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.16.0", + "@rollup/rollup-linux-riscv64-gnu": "4.16.0", + "@rollup/rollup-linux-s390x-gnu": "4.16.0", + "@rollup/rollup-linux-x64-gnu": "4.16.0", + "@rollup/rollup-linux-x64-musl": "4.16.0", + "@rollup/rollup-win32-arm64-msvc": "4.16.0", + "@rollup/rollup-win32-ia32-msvc": "4.16.0", + "@rollup/rollup-win32-x64-msvc": "4.16.0", "fsevents": "~2.3.2" } }, @@ -3492,13 +3538,13 @@ } }, "node_modules/unhead": { - "version": "1.8.20", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.8.20.tgz", - "integrity": "sha512-IJOCYact/7Za3M7CeeCWs8Vze53kHvKDUy/EXtkTm/an5StgqOt2uCnS3HrkioIMKdHBpy/qtTc6E3BoGMOq7Q==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.9.7.tgz", + "integrity": "sha512-Kv7aU5l41qiq36t9qMks8Pgsj7adaTBm9aDS6USlmodTXioeqlJ5vEu9DI+8ZZPwRlmof3aDlo1kubyaXdSNmQ==", "dependencies": { - "@unhead/dom": "1.8.20", - "@unhead/schema": "1.8.20", - "@unhead/shared": "1.8.20", + "@unhead/dom": "1.9.7", + "@unhead/schema": "1.9.7", + "@unhead/shared": "1.9.7", "hookable": "^5.5.3" }, "funding": { @@ -3506,9 +3552,9 @@ } }, "node_modules/unplugin": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.0.tgz", - "integrity": "sha512-CuZtvvO8ua2Wl+9q2jEaqH6m3DoQ38N7pvBYQbbaeNlWGvK2l6GHiKi29aIHDPoSxdUzQ7Unevf1/ugil5X6Pg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", + "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==", "dev": true, "dependencies": { "acorn": "^8.11.3", @@ -3566,13 +3612,13 @@ "dev": true }, "node_modules/vite": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.3.tgz", - "integrity": "sha512-+i1oagbvkVIhEy9TnEV+fgXsng13nZM90JQbrcPrf6DvW2mXARlz+DK7DLiDP+qeKoD1FCVx/1SpFL1CLq9Mhw==", + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", "dev": true, "dependencies": { "esbuild": "^0.20.1", - "postcss": "^8.4.36", + "postcss": "^8.4.38", "rollup": "^4.13.0" }, "bin": { @@ -3621,15 +3667,15 @@ } }, "node_modules/vue": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "version": "3.4.23", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.23.tgz", + "integrity": "sha512-X1y6yyGJ28LMUBJ0k/qIeKHstGd+BlWQEOT40x3auJFTmpIhpbKLgN7EFsqalnJXq1Km5ybDEsp6BhuWKciUDg==", "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-dom": "3.4.23", + "@vue/compiler-sfc": "3.4.23", + "@vue/runtime-dom": "3.4.23", + "@vue/server-renderer": "3.4.23", + "@vue/shared": "3.4.23" }, "peerDependencies": { "typescript": "*" @@ -3673,9 +3719,9 @@ } }, "node_modules/vuetify": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.5.11.tgz", - "integrity": "sha512-us5I0jyFwIQYG4v41PFmVMkoc/oJddVT4C2RFjJTI99ttigbQ92gsTeG5SB8BPfmfnUS4paR5BedZwk6W3KlJw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.5.16.tgz", + "integrity": "sha512-jyApfATreFMkgjvK0bL7ntZnr+p9TU73+4E3kX6fIvUitdAP9fltG7yj+v3k14HLqZRSNhTL1GhQ95DFx631zw==", "engines": { "node": "^12.20 || >=14.13" }, @@ -3685,10 +3731,10 @@ }, "peerDependencies": { "typescript": ">=4.7", - "vite-plugin-vuetify": ">=2.0.3", + "vite-plugin-vuetify": ">=1.0.0", "vue": "^3.3.0", "vue-i18n": "^9.0.0", - "webpack-plugin-vuetify": ">=2.0.0-alpha.11" + "webpack-plugin-vuetify": ">=2.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3793,9 +3839,9 @@ } }, "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.5.tgz", + "integrity": "sha512-HqnGsCdVZ2xc0qWPLdO25WnseXThh0kEYKIdV5F/hTHO75hNZFp8thxSeHhiPrHZKrFTo1SOgkAj9po5bexZlw==", "dev": true, "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/jarm_online_gui/src/components/MainPage.vue b/jarm_online_gui/src/components/MainPage.vue index 74ed398..8815fab 100644 --- a/jarm_online_gui/src/components/MainPage.vue +++ b/jarm_online_gui/src/components/MainPage.vue @@ -49,20 +49,20 @@
- Alexa top 1 Million overlap: + Tranco top 1 Million overlap: - - {{ this.jarmHashResult.alexa.topRank }}th Rank - {{ this.jarmHashResult.alexa.topDomain }} + + {{ this.jarmHashResult.tranco.topRank }}th Rank + {{ this.jarmHashResult.tranco.topDomain }} + v-if="this.jarmHashResult.tranco.raw_result.overlapping_domains.length > 1" + :href="'/api/v1/tranco-overlap?jarm_hash=' + jarmHashResult.hash"> See {{ - this.jarmHashResult.alexa.raw_result.overlapping_domains.length - 1 + this.jarmHashResult.tranco.raw_result.overlapping_domains.length - 1 }} other matching domains @@ -197,7 +197,7 @@ export default { inputUrl: null, jarmHashResult: { hash: null, - alexa: { + tranco: { raw_result: null, topRank: null, topDomain: null, @@ -205,7 +205,7 @@ export default { shodanResultCount: null, }, computingJarmHash: false, - computingAlexaRank: false, + computingTrancoRank: false, notification: notification, computingShodanResultCount: false, shodanImageLink: null, @@ -219,9 +219,9 @@ export default { methods: { resetJarmHash() { this.jarmHashResult.hash = null; - this.jarmHashResult.alexa.raw_result = null; - this.jarmHashResult.alexa.topRank = null; - this.jarmHashResult.alexa.topDomain = null; + this.jarmHashResult.tranco.raw_result = null; + this.jarmHashResult.tranco.topRank = null; + this.jarmHashResult.tranco.topDomain = null; this.jarmHashResult.shodanResultCount = null; this.shodanImageLink = null; this.shodanSearchLink = null; @@ -243,12 +243,12 @@ export default { this.shodanImageLink = `https://www.shodan.io/search/facet.png?query=ssl.jarm%3A${hash}&facet=product`; this.shodanSearchLink = `https://www.shodan.io/search?query=ssl.jarm:${hash}`; - // Set alexa results - this.jarmHashResult.alexa.raw_result = await this.alexaOverlap(this.jarmHashResult.hash); - const overlapping_domains = this.jarmHashResult.alexa.raw_result.overlapping_domains; + // Set Tranco results + this.jarmHashResult.tranco.raw_result = await this.trancoOverlap(this.jarmHashResult.hash); + const overlapping_domains = this.jarmHashResult.tranco.raw_result.overlapping_domains; if (overlapping_domains.length > 0) { - this.jarmHashResult.alexa.topRank = overlapping_domains[0].rank - this.jarmHashResult.alexa.topDomain = overlapping_domains[0].domain + this.jarmHashResult.tranco.topRank = overlapping_domains[0].rank + this.jarmHashResult.tranco.topDomain = overlapping_domains[0].domain } }, @@ -293,9 +293,9 @@ export default { this.computingJarmHash = false; return jarm_hash; }, - async alexaOverlap(hash) { - this.computingAlexaRank = true; - const path = '/api/v1/alexa-overlap'; + async trancoOverlap(hash) { + this.computingTrancoRank = true; + const path = '/api/v1/tranco-overlap'; const payload = { params: { jarm_hash: hash, @@ -311,7 +311,7 @@ export default { error, ); } - this.computingAlexaRank = false; + this.computingTrancoRank = false; return result; }, async shodanCount(hash) { diff --git a/src/lib.rs b/src/lib.rs index 857b3d0..9a6a0ed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,22 +3,28 @@ extern crate rocket; pub mod utils; pub mod alexa_top1m; +pub mod tranco_top1m; use rocket_db_pools::{Connection, deadpool_redis}; use crate::alexa_top1m::{AlexaTop1M, RankedDomain}; +use crate::tranco_top1m::{TrancoTop1M}; +use crate::tranco_top1m::RankedDomain as TrancoRankedDomain; use std::env; use std::path::Path; -use rocket::{Build, Rocket, State}; +use rocket::{Build, fairing, Rocket, State}; use rocket::serde::json::Json; use rust_jarm::Jarm; use serde::Serialize; use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use rocket::fairing::AdHoc; +use rocket::response::status::Custom; +use rocket::http::Status; use rocket::serde::Deserialize; use rocket::serde::json::serde_json; use rust_jarm::error::JarmError; use rocket_db_pools::{Database}; -use rocket_db_pools::deadpool_redis::redis::{AsyncCommands}; +use rocket_db_pools::deadpool_redis::redis::AsyncCommands; pub const DEFAULT_SCAN_TIMEOUT_IN_SECONDS: u64 = 15; pub const REDIS_LAST_SCAN_LIST_KEY: &str = "redis_last_scan_list_key"; @@ -27,11 +33,16 @@ pub const LAST_SCAN_SIZE_RETURNED: isize = 10; #[derive(Database)] #[database("redis_db")] -struct Db(deadpool_redis::Pool); +pub struct Db(deadpool_redis::Pool); + #[derive(Serialize)] struct ErrorResponse { - // TODO rename in JarmErrorResponse + error: String, +} + +#[derive(Serialize)] +struct JarmErrorResponse { error_type: String, error_message: String, } @@ -41,7 +52,7 @@ struct JarmResponse { host: String, port: String, jarm_hash: String, - error: Option, + error: Option, } #[derive(Serialize, Deserialize)] @@ -61,6 +72,11 @@ struct AlexaOverlapResponse { overlapping_domains: Vec, } +#[derive(Serialize)] +struct TrancoOverlapResponse { + overlapping_domains: Vec, +} + pub fn scan_timeout_in_seconds() -> u64 { env::var("SCAN_TIMEOUT_IN_SECONDS") .unwrap_or(DEFAULT_SCAN_TIMEOUT_IN_SECONDS.to_string()) @@ -129,6 +145,16 @@ fn alexa_overlap(alexa_top1m: &State, jarm_hash: String) -> Json")] +async fn tranco_overlap(redis_client: Connection, jarm_hash: String) -> Result, Custom>> { + let mut tranco = TrancoTop1M::from(redis_client); + if !tranco.is_initialized().await { + return Err(Custom(Status::ServiceUnavailable, Json(ErrorResponse { error: "db not yet loaded".to_string()}))) + } + let overlapping_domains = tranco.get(jarm_hash).await; + Ok(Json(TrancoOverlapResponse { overlapping_domains })) +} + fn build_error_json(jarm_error: JarmError) -> Json { // error_message is a debug view of a an unknown error, to be improved. let (error_type, error_message) = match jarm_error { @@ -146,17 +172,42 @@ fn build_error_json(jarm_error: JarmError) -> Json { host: "".to_string(), port: "".to_string(), jarm_hash: "".to_string(), - error: Some(ErrorResponse { error_type, error_message }), + error: Some(JarmErrorResponse { error_type, error_message }), }) } -pub fn build_rocket() -> Rocket { +pub fn build_rocket_without_tranco_initialisation() -> Rocket { let alexa_top1m = AlexaTop1M::new(&alexa_top1m_raw_data_path()) .expect("AlexaTop1M built correctly"); rocket::build() .mount("/jarm", routes![jarm]) .mount("/last-scans", routes![last_scans]) .mount("/alexa-overlap", routes![alexa_overlap]) + .mount("/tranco-overlap", routes![tranco_overlap]) .attach(Db::init()) .manage(alexa_top1m) } + +pub fn build_rocket() -> Rocket { + let rocket = build_rocket_without_tranco_initialisation(); + rocket.attach(AdHoc::try_on_ignite("Initialize tranco", initialize_tranco_in_redis)) +} + +async fn initialize_tranco_in_redis(rocket: Rocket) -> fairing::Result { + let pool = match Db::fetch(&rocket) { + Some(db) => db.0.clone(), + None => return Err(rocket) + }; + + rocket::tokio::task::spawn(async move { + let connection = match pool.get().await { + Ok(connection) => connection, + Err(_) => return, + }; + let mut tranco = TrancoTop1M::new(connection); + tranco.initialize().await; + }); + // We don't wait for the initialization to complete. + // This means it can be stopped unexpectedly and must be able to recover from it on the next run + Ok(rocket) +} diff --git a/src/main.rs b/src/main.rs index 5c640a1..370127e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use ::rocket_sentry::RocketSentry; +use env_logger::Env; use jarm_online::build_rocket; use rocket::fairing::{Fairing, Info, Kind}; use rocket::http::Header; @@ -25,6 +26,7 @@ impl Fairing for CORS { #[rocket::main] async fn main() -> Result<(), rocket::Error> { + env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); build_rocket() .attach(CORS) .attach(RocketSentry::fairing()) diff --git a/src/tranco_top1m/mod.rs b/src/tranco_top1m/mod.rs new file mode 100644 index 0000000..2563d3b --- /dev/null +++ b/src/tranco_top1m/mod.rs @@ -0,0 +1,159 @@ +use std::{env, io}; +use std::error::Error; +use std::fs::File; +use csv::ReaderBuilder; +use rocket_db_pools::Connection as RocketConnection; +use rocket_db_pools::deadpool_redis::redis::{AsyncCommands, RedisError}; +use serde::Serialize; +use tempfile::NamedTempFile; +use crate::rocket::futures::StreamExt; + +use crate::Db; +use crate::deadpool_redis::Connection; + +// Env var key +const FORCE_TRANCO_TOP1M_RAW_DATA_PATH: &str = "FORCE_TRANCO_TOP1M_RAW_DATA_PATH"; +const TRANCO_TOP1M_S3_URL: &str = "TRANCO_TOP1M_S3_URL"; + +// Redis keys +const TRANCO_TOP_1M_JARM_PREFIX_KEY: &str = "trancotop1m:jarm:"; +const TRANCO_TOP_1M_INITIALIZED_KEY: &str = "trancotop1m:initialized"; + +#[derive(PartialEq, Serialize, Clone, Debug)] +pub struct RankedDomain { + pub rank: u64, + pub domain: String, +} + +pub struct TrancoTop1M { + redis_client: Connection, +} + +impl TrancoTop1M { + pub fn new(redis_client: Connection) -> TrancoTop1M { + TrancoTop1M { + redis_client + } + } + + pub fn from(redis_client: RocketConnection) -> TrancoTop1M { + TrancoTop1M { + redis_client: redis_client.into_inner() + } + } + + pub async fn get(&mut self, jarm_hash: String) -> Vec { + let key = format!("{TRANCO_TOP_1M_JARM_PREFIX_KEY}:{jarm_hash}"); + // Fetch all keys + let values: Vec = self.redis_client.lrange(key, 0, -1).await.unwrap(); + let mut res = vec![]; + for value in values { + let (rank_as_str, domain_as_str) = value.split_once('#').unwrap(); + let rank = rank_as_str.parse::().unwrap(); + let domain = domain_as_str.to_string(); + res.push(RankedDomain { rank, domain }) + } + res + } + + pub async fn is_initialized(&mut self) -> bool { + let result: bool = self.redis_client.exists(TRANCO_TOP_1M_INITIALIZED_KEY).await.unwrap(); + result + } + + pub async fn initialize(&mut self) { + if self.is_initialized().await { + info!("Tranco already initialized, skipping."); + return; + } + // tmp file get cleared once out of scope, so we need a var to hold it + let mut downloaded_s3_file = NamedTempFile::new().unwrap(); + + let path = if let Ok(path) = env::var(FORCE_TRANCO_TOP1M_RAW_DATA_PATH) { + info!("Forcing tranco initialisation on {path}"); + path + } else { + let url = match env::var(TRANCO_TOP1M_S3_URL) { + Ok(url) => url, + Err(_) => { + warn!("TRANCO_TOP1M_S3_URL env var has to be set for tranco initialization"); + warn!("Skipping tranco initialization"); + return; + } + }; + info!("Downloading tranco initialisation file"); + let download_path = downloaded_s3_file.path(); + let path = download_path.to_str().unwrap().to_string(); + info!("Using temporary file path: {path}"); + + match Self::download_top_1m_file(url, downloaded_s3_file.as_file_mut()).await { + Ok(_) => info!("Tranco top 1M file downloaded successfully!"), + Err(err) => { + sentry::capture_error(&err); + error!("Failed to download tranco file, aborting."); + return; + } + } + path + }; + self.destroy_db().await.unwrap(); + let count = match self.add_domains_from_path(path).await { + Ok(count) => count, + Err(_) => { + error!("Failed to add tranco hashes from path"); + return; + } + }; + match count { + 0..=10 => { + error!("Only {count} values found during initialisation, most likely something went wrong."); + error!("Initialisation key will not be set so as to retry on next start."); + } + _ => { + let _: () = self.redis_client.set(TRANCO_TOP_1M_INITIALIZED_KEY, 1).await.unwrap(); + info!("Tranco DB successfully initialized, {count} website's jarm hashes loaded"); + } + } + } + + async fn download_top_1m_file(url: String, file: &mut File) -> Result<(), reqwest::Error> { + let mut byte_stream = reqwest::get(url).await?.bytes_stream(); + + while let Some(item) = byte_stream.next().await { + io::copy(&mut item?.as_ref(), file).unwrap(); + } + Ok(()) + } + + /// Remove all keys related to Tranco in the Redis DB + pub async fn destroy_db(&mut self) -> Result<(), RedisError> { + // First remove the init key so the other keys are not used in a partial state + let _: () = self.redis_client.del(TRANCO_TOP_1M_INITIALIZED_KEY).await?; + + // Then we remove all the jarm hash keys + let pattern = format!("{TRANCO_TOP_1M_JARM_PREFIX_KEY}*"); + let keys: Vec = self.redis_client.keys(pattern).await?; + for key in keys { + let _: () = self.redis_client.del(key).await?; + } + Ok(()) + } + + async fn add_domains_from_path(&mut self, path: String) -> Result> { + let mut count = 0; + let mut reader = ReaderBuilder::new().has_headers(false).from_path(path)?; + for result in reader.records() { + let record = result?; + + let rank = record.get(0).ok_or("No rank provided")?; + let domain = record.get(1).ok_or("No domain provided")?; + let jarm_hash = record.get(2).ok_or("No jarm hash provided")?; + + let key = format!("{TRANCO_TOP_1M_JARM_PREFIX_KEY}:{jarm_hash}"); + let value = format!("{rank}#{domain}"); + let _: () = self.redis_client.rpush(key, value).await?; + count += 1; + } + Ok(count) + } +} diff --git a/tests/common.rs b/tests/common.rs index 22e1672..6a7852a 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -5,12 +5,14 @@ use std::time::Duration; use lazy_static::lazy_static; use redis::RedisError; use rstest::*; -use jarm_online::build_rocket; +use jarm_online::{build_rocket, build_rocket_without_tranco_initialisation}; use rocket::local::blocking::Client; #[allow(dead_code)] // used in tests pub const DUMMY_SERVER_JARM_HASH: &str = "21d19d00021d21d00021d19d21d21d1a46380b04d662f0848f508dd171125d"; +pub const REDIS_URL: &str = "redis://127.0.0.1/"; + lazy_static! { static ref REDIS_MUTEX: Mutex<()> = Mutex::default(); // restrict redis parallel access @@ -25,22 +27,39 @@ pub fn alexa_top1m_path() -> &'static Path { #[fixture] #[once] -pub fn set_env_var_alexa_top1m_path(alexa_top1m_path: &'static Path) -> &'static Path { +pub fn tranco_top1m_path() -> &'static Path { + Path::new("tests/fixtures_data/tranco_top1M.csv") +} + +#[fixture] +#[once] +pub fn set_env_var_top1m_path(alexa_top1m_path: &'static Path, tranco_top1m_path: &'static Path) -> &'static Path { env::set_var("ALEXA_TOP1M_RAW_DATA_PATH", alexa_top1m_path.to_str().expect("valid path")); + env::set_var("FORCE_TRANCO_TOP1M_RAW_DATA_PATH", tranco_top1m_path.to_str().expect("valid path")); alexa_top1m_path } #[fixture] #[allow(unused_variables)] -pub fn rocket_client(set_env_var_alexa_top1m_path: &'static Path) -> Client { +pub fn rocket_client(set_env_var_top1m_path: &'static Path) -> Client { let test_rocket = build_rocket(); Client::tracked(test_rocket).expect("valid rocket instance") } +#[fixture] +#[allow(unused_variables)] +pub fn rocket_client_without_tranco_init(set_env_var_top1m_path: &'static Path) -> Client { + let test_rocket = build_rocket_without_tranco_initialisation(); + Client::tracked(test_rocket).expect("valid rocket instance") +} + #[fixture] pub fn clean_redis<'a>() -> MutexGuard<'a, ()> { - let redis_lock = REDIS_MUTEX.lock().unwrap(); - let client = redis::Client::open("redis://127.0.0.1/").unwrap(); + let redis_lock = REDIS_MUTEX.lock().unwrap_or_else(|e| { + REDIS_MUTEX.clear_poison(); + e.into_inner() // Prevent a failing test to fail the tests that follow + }); + let client = redis::Client::open(REDIS_URL).unwrap(); for i in 1..=10 { match clean_redis_commands(&client) { Ok(_) => break, diff --git a/tests/fixtures_data/tranco_top1M.csv b/tests/fixtures_data/tranco_top1M.csv new file mode 100644 index 0000000..b469f1d --- /dev/null +++ b/tests/fixtures_data/tranco_top1M.csv @@ -0,0 +1,12 @@ +1,google.com,29d3fd00029d29d21c42d43d00041d188e8965256b2536432a9bd447ae607f +2,youtube.com,29d3fd00029d29d21c42d43d00041d188e8965256b2536432a9bd447ae607f +3,baidu.com,29d29d00029d29d1fc29d29d29d29d881e59db99b9f67f908be168829ecef9 +4,facebook.com,27d27d27d0000001dc41d43d00041d1c5ac8aa552261ba8fd1aa9757c06fa5 +5,bilibili.com,29d29d15d29d29d21c29d29d29d29d1440cf1827095a54ae723a85f89327ea +6,qq.com,29d29d20d29d29d21c29d29d29d29d323d0777ec827869a2c288e0f199d8ba +7,yahoo.com,27d27d27d3fd27d1dc41d41d000000937221baefa0b90420c8e8e41903f1d5 +8,instagram.com,27d27d27d0000001dc41d43d00041d1c5ac8aa552261ba8fd1aa9757c06fa5 +9,zhihu.com,3fd3fd20d3fd3fd21c3fd3fd3fd3fd2b66a312d81ed1efa0f55830f7490cb2 +10,twitter.com,29d29d00029d29d00042d43d00041d598ac0c1012db967bb1ad0ff2491b3ae +11,fake_site_1.com,21d19d00021d21d00021d19d21d21d1a46380b04d662f0848f508dd171125d +12,fake_site_2.com,21d19d00021d21d00021d19d21d21d1a46380b04d662f0848f508dd171125d diff --git a/tests/playwright_end_to_end/test_home_page.py b/tests/playwright_end_to_end/test_home_page.py index 13f3de5..6772c46 100644 --- a/tests/playwright_end_to_end/test_home_page.py +++ b/tests/playwright_end_to_end/test_home_page.py @@ -22,11 +22,11 @@ def test_scan_address(home_page: Page): copy_button = home_page.get_by_role("button", name="COPY") expect(copy_button).to_be_visible() # clipboard button is present - # Alexa overlap is displayed + # Tranco overlap is displayed assert home_page.get_by_text("fake_site_1.com").is_visible() assert home_page.get_by_text("11th Rank").is_visible() - alexa_overlap_link = home_page.get_by_role("link", name="1 other matching domains") - expect(alexa_overlap_link).to_have_attribute("href", f"/api/v1/alexa-overlap?jarm_hash={URL_EXPECTED_JARM_RESULT}") + tranco_overlap_link = home_page.get_by_role("link", name="1 other matching domains") + expect(tranco_overlap_link).to_have_attribute("href", f"/api/v1/tranco-overlap?jarm_hash={URL_EXPECTED_JARM_RESULT}") def test_latest_urls(home_page: Page): diff --git a/tests/test_route_tranco_overlap.rs b/tests/test_route_tranco_overlap.rs new file mode 100644 index 0000000..50bfe26 --- /dev/null +++ b/tests/test_route_tranco_overlap.rs @@ -0,0 +1,107 @@ +#[path = "common.rs"] +mod common; + + +#[cfg(test)] +mod test_route_tranco_overlap { + use async_std::task; + use std::sync::MutexGuard; + use std::time::Duration; + + use rocket::http; + use rocket::local::blocking::Client; + use rocket_db_pools::deadpool_redis::{Config}; + use rstest::*; + use jarm_online::tranco_top1m::TrancoTop1M; + use jarm_online::tranco_top1m::RankedDomain; + + use crate::common::{REDIS_URL, rocket_client, rocket_client_without_tranco_init}; + use crate::common::clean_redis; + + #[rstest] + #[ignore = "Integration tests"] + fn db_not_yet_loaded(_clean_redis: MutexGuard<'_, ()>, rocket_client_without_tranco_init: Client) { + let rocket_client = rocket_client_without_tranco_init; + + let expected_response = r#"{"error":"db not yet loaded"}"#; + + let response = rocket_client.get("/tranco-overlap?jarm_hash=123").dispatch(); + + assert_eq!(response.status(), http::Status::ServiceUnavailable); + assert_eq!(response.into_string(), Some(expected_response.into())); + } + + #[rstest] + #[ignore = "Integration tests"] + async fn no_overlap(_clean_redis: MutexGuard<'_, ()>, rocket_client: Client) { + let expected_response = r#"{"overlapping_domains":[]}"#; + + let uri = "/tranco-overlap?jarm_hash=123"; + let mut response = rocket_client.get(uri).dispatch(); + + while response.status() == http::Status::ServiceUnavailable { // Wait for redis to be initialized + task::sleep(Duration::from_millis(10)).await; + response = rocket_client.get(uri).dispatch(); + } + assert_eq!(response.status(), http::Status::Ok); + assert_eq!(response.into_string(), Some(expected_response.into())); + } + + + #[rstest] + #[ignore = "Integration tests"] + async fn single_overlap(_clean_redis: MutexGuard<'_, ()>, rocket_client: Client) { + let expected_response = r#"{"overlapping_domains":[{"rank":9,"domain":"zhihu.com"}]}"#; + let jarm_hash = "3fd3fd20d3fd3fd21c3fd3fd3fd3fd2b66a312d81ed1efa0f55830f7490cb2"; + + let uri = format!("/tranco-overlap?jarm_hash={jarm_hash}"); + let mut response = rocket_client.get(uri.clone()).dispatch(); + + while response.status() == http::Status::ServiceUnavailable { // Wait for redis to be initialized + task::sleep(Duration::from_millis(10)).await; + response = rocket_client.get(uri.clone()).dispatch(); + } + + assert_eq!(response.status(), http::Status::Ok); + assert_eq!(response.into_string(), Some(expected_response.into())); + } + + + #[rstest] + #[ignore = "Integration tests"] + async fn multiple_overlap(_clean_redis: MutexGuard<'_, ()>, rocket_client: Client) { + let expected_response = r#"{"overlapping_domains":[{"rank":11,"domain":"fake_site_1.com"},{"rank":12,"domain":"fake_site_2.com"}]}"#; + let jarm_hash = "21d19d00021d21d00021d19d21d21d1a46380b04d662f0848f508dd171125d"; + + let uri = format!("/tranco-overlap?jarm_hash={jarm_hash}"); + let mut response = rocket_client.get(uri.clone()).dispatch(); + + while response.status() == http::Status::ServiceUnavailable { // Wait for redis to be initialized + task::sleep(Duration::from_millis(10)).await; + response = rocket_client.get(uri.clone()).dispatch(); + } + + assert_eq!(response.status(), http::Status::Ok); + assert_eq!(response.into_string(), Some(expected_response.into())); + } + + #[rstest] + #[ignore = "Integration tests"] + async fn clear_tranco_values(_clean_redis: MutexGuard<'_, ()>, _rocket_client: Client) { + let cfg = Config::from_url(REDIS_URL); + let pool = cfg.create_pool(None).unwrap(); + let connection = pool.get().await.unwrap(); + let mut tranco = TrancoTop1M::new(connection); + + while tranco.is_initialized().await != true { // Wait for redis to be initialized + task::sleep(Duration::from_millis(10)).await; + } + let jarm_hash = "3fd3fd20d3fd3fd21c3fd3fd3fd3fd2b66a312d81ed1efa0f55830f7490cb2"; + assert_eq!(tranco.get(jarm_hash.to_string()).await, vec![RankedDomain { rank: 9, domain: "zhihu.com".to_string() }]); + + tranco.destroy_db().await.unwrap(); // Clearing values in db means no hash will be found + + assert_eq!(tranco.get(jarm_hash.to_string()).await, vec![]); + assert_eq!(tranco.is_initialized().await, false); + } +}