diff --git a/Cargo.lock b/Cargo.lock index 2ad72b8..44e82e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,9 +29,9 @@ dependencies = [ [[package]] name = "aead" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", "generic-array 0.14.6", @@ -67,7 +67,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" dependencies = [ "cfg-if 1.0.0", - "cipher 0.4.3", + "cipher 0.4.4", "cpufeatures", ] @@ -105,9 +105,9 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82e1366e0c69c9f927b1fa5ce2c7bf9eafc8f9268c0b9800729e8b267612447c" dependencies = [ - "aead 0.5.1", + "aead 0.5.2", "aes 0.8.2", - "cipher 0.4.3", + "cipher 0.4.4", "ctr 0.9.2", "ghash 0.5.0", "subtle", @@ -164,9 +164,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" +checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" [[package]] name = "arc-swap" @@ -185,9 +185,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" @@ -219,9 +219,9 @@ dependencies = [ [[package]] name = "asn1-rs" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf6690c370453db30743b373a60ba498fc0d6d83b11f4abfd87a84a075db5dd4" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" dependencies = [ "asn1-rs-derive 0.4.0", "asn1-rs-impl", @@ -239,8 +239,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", "synstructure", ] @@ -251,8 +251,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", "synstructure", ] @@ -263,24 +263,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] -[[package]] -name = "asn1_der" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22d1f4b888c298a027c99dc9048015fac177587de20fc30232a057dfbe24a21" - [[package]] name = "async-attributes" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" dependencies = [ - "quote 1.0.23", + "quote 1.0.26", "syn 1.0.109", ] @@ -307,9 +301,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" +checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" dependencies = [ "async-lock", "async-task", @@ -353,22 +347,22 @@ dependencies = [ [[package]] name = "async-io" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ "async-lock", "autocfg 1.1.0", + "cfg-if 1.0.0", "concurrent-queue", "futures-lite", - "libc", "log", "parking", "polling", + "rustix 0.37.12", "slab", "socket2", "waker-fn", - "windows-sys 0.42.0", ] [[package]] @@ -382,9 +376,9 @@ dependencies = [ [[package]] name = "async-process" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6381ead98388605d0d9ff86371043b5aa922a3905824244de40dc263a14fcba4" +checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" dependencies = [ "async-io", "async-lock", @@ -393,9 +387,9 @@ dependencies = [ "cfg-if 1.0.0", "event-listener", "futures-lite", - "libc", + "rustix 0.37.12", "signal-hook", - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] @@ -463,9 +457,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad445822218ce64be7a341abfb0b1ea43b5c23aa83902542a4542e78309d8e5e" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" dependencies = [ "async-stream-impl", "futures-core", @@ -474,30 +468,30 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4655ae1a7b0cdf149156f780c5bf3f1352bc53cbd9e0a361a7ef7b22947e965" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.109", + "proc-macro2 1.0.56", + "quote 1.0.26", + "syn 2.0.15", ] [[package]] name = "async-task" -version = "4.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" +checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] name = "async-trait" -version = "0.1.64" +version = "0.1.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.109", + "proc-macro2 1.0.56", + "quote 1.0.26", + "syn 2.0.15", ] [[package]] @@ -515,9 +509,9 @@ dependencies = [ [[package]] name = "atomic-waker" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599" +checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" [[package]] name = "atty" @@ -731,9 +725,9 @@ checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" [[package]] name = "blocking" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" +checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" dependencies = [ "async-channel", "async-lock", @@ -741,6 +735,7 @@ dependencies = [ "atomic-waker", "fastrand", "futures-lite", + "log", ] [[package]] @@ -844,9 +839,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ "iana-time-zone", "js-sys", @@ -878,9 +873,9 @@ dependencies = [ [[package]] name = "cipher" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", @@ -918,34 +913,13 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" dependencies = [ "crossbeam-utils", ] -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen", -] - -[[package]] -name = "console_log" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" -dependencies = [ - "log", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "const-oid" version = "0.9.2" @@ -993,9 +967,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "core2" @@ -1225,7 +1199,7 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" dependencies = [ - "quote 1.0.23", + "quote 1.0.26", "syn 1.0.109", ] @@ -1253,7 +1227,7 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "cipher 0.4.3", + "cipher 0.4.4", ] [[package]] @@ -1271,9 +1245,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.0.0-rc.0" +version = "4.0.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da00a7a9a4eb92a0a0f8e75660926d48f0d0f3c537e455c457bcdaa1e16b1ac" +checksum = "8d4ba9852b42210c7538b75484f9daa0655e9a3ac04f693747bb0f02cf3cfe16" dependencies = [ "cfg-if 1.0.0", "fiat-crypto", @@ -1285,9 +1259,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.91" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d3488e7665a7a483b57e25bdd90d0aeb2bc7608c8d0346acf2ad3f1caf1d62" +checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" dependencies = [ "cc", "cxxbridge-flags", @@ -1297,41 +1271,41 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.91" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fcaf066a053a41a81dfb14d57d99738b767febb8b735c3016e469fac5da690" +checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" dependencies = [ "cc", "codespan-reporting", "once_cell", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "scratch", - "syn 1.0.109", + "syn 2.0.15", ] [[package]] name = "cxxbridge-flags" -version = "1.0.91" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef98b8b717a829ca5603af80e1f9e2e48013ab227b68ef37872ef84ee479bf" +checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" [[package]] name = "cxxbridge-macro" -version = "1.0.91" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "086c685979a698443656e5cf7856c95c642295a38599f12fb1ff76fb28d19892" +checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.109", + "proc-macro2 1.0.56", + "quote 1.0.26", + "syn 2.0.15", ] [[package]] name = "darling" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0808e1bd8671fb44a113a14e13497557533369847788fa2ae912b6ebfce9fa8" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ "darling_core", "darling_macro", @@ -1339,26 +1313,26 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "001d80444f28e193f30c2f293455da62dcf9a6b29918a4253152ae2b1de592cb" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "strsim", "syn 1.0.109", ] [[package]] name = "darling_macro" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b36230598a2d5de7ec1c6f51f72d8a99a9208daff41de2084d06e3fd3ea56685" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ "darling_core", - "quote 1.0.23", + "quote 1.0.26", "syn 1.0.109", ] @@ -1415,11 +1389,11 @@ dependencies = [ [[package]] name = "der-parser" -version = "8.1.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d4bc9b0db0a0df9ae64634ac5bdefb7afcb534e182275ca0beadbe486701c1" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" dependencies = [ - "asn1-rs 0.5.1", + "asn1-rs 0.5.2", "displaydoc", "nom", "num-bigint 0.4.3", @@ -1443,8 +1417,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" dependencies = [ "darling", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] @@ -1499,8 +1473,8 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] @@ -1512,9 +1486,9 @@ checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" [[package]] name = "dtoa" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00704156a7de8df8da0911424e30c2049957b0a714542a44e05fe693dd85313" +checksum = "65d09067bfacaa79114679b279d7f5885b53295b1e2cfb4e79c8e4bd3d633169" [[package]] name = "ecdsa" @@ -1595,8 +1569,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ "heck", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] @@ -1659,6 +1633,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "errno-dragonfly" version = "0.1.2" @@ -1737,16 +1722,16 @@ dependencies = [ "num-bigint 0.2.6", "num-integer", "num-traits", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] [[package]] name = "fiat-crypto" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b2f3c51e4dd999930845da5d10a48775b8fe4ca9f4f9ec1f9161f334da5dfe" +checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" [[package]] name = "flate2" @@ -1807,9 +1792,9 @@ checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "futures" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -1822,9 +1807,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -1832,15 +1817,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-executor" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" dependencies = [ "futures-core", "futures-task", @@ -1850,15 +1835,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-lite" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ "fastrand", "futures-core", @@ -1871,13 +1856,13 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.109", + "proc-macro2 1.0.56", + "quote 1.0.26", + "syn 2.0.15", ] [[package]] @@ -1893,31 +1878,27 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-timer" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper", -] [[package]] name = "futures-util" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -1968,10 +1949,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if 1.0.0", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -2029,9 +2008,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.16" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" +checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" dependencies = [ "bytes", "fnv", @@ -2275,9 +2254,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.25" +version = "0.14.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" dependencies = [ "bytes", "futures-channel", @@ -2312,16 +2291,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.53" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "winapi", + "windows 0.48.0", ] [[package]] @@ -2373,9 +2352,9 @@ dependencies = [ [[package]] name = "if-watch" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba7abdbb86e485125dad06c2691e1e393bf3b08c7b743b43aa162a00fd39062e" +checksum = "a9465340214b296cd17a0009acdb890d6160010b8adf8f78a00d0d7ab270f79f" dependencies = [ "async-io", "core-foundation", @@ -2387,14 +2366,14 @@ dependencies = [ "rtnetlink", "system-configuration", "tokio", - "windows", + "windows 0.34.0", ] [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg 1.1.0", "hashbrown 0.12.3", @@ -2422,9 +2401,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", ] [[package]] @@ -2454,12 +2430,13 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.5" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" dependencies = [ + "hermit-abi 0.3.1", "libc", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -2476,20 +2453,20 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" [[package]] name = "is-terminal" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix", - "windows-sys 0.45.0", + "rustix 0.37.12", + "windows-sys 0.48.0", ] [[package]] @@ -2542,9 +2519,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" [[package]] name = "libm" @@ -2554,18 +2531,21 @@ checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" [[package]] name = "libp2p" -version = "0.51.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.51.3" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "bytes", "futures", "futures-timer", "getrandom 0.2.8", "instant", + "libp2p-allow-block-list", + "libp2p-connection-limits", "libp2p-core", "libp2p-dns", "libp2p-gossipsub", "libp2p-identify", + "libp2p-identity", "libp2p-kad", "libp2p-mdns", "libp2p-metrics", @@ -2575,7 +2555,6 @@ dependencies = [ "libp2p-request-response", "libp2p-swarm", "libp2p-tcp", - "libp2p-wasm-ext", "libp2p-webrtc", "libp2p-websocket", "libp2p-yamux", @@ -2583,19 +2562,39 @@ dependencies = [ "pin-project", ] +[[package]] +name = "libp2p-allow-block-list" +version = "0.1.1" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + +[[package]] +name = "libp2p-connection-limits" +version = "0.1.0" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + [[package]] name = "libp2p-core" -version = "0.39.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.39.1" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ - "asn1_der", - "bs58", - "ed25519-dalek", "either", "fnv", "futures", "futures-timer", "instant", + "libp2p-identity", "log", "multiaddr", "multihash", @@ -2606,23 +2605,21 @@ dependencies = [ "quick-protobuf", "rand 0.8.5", "rw-stream-sink", - "sec1", "serde", - "sha2 0.10.6", "smallvec 1.10.0", "thiserror", "unsigned-varint", "void", - "zeroize", ] [[package]] name = "libp2p-dns" version = "0.39.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "futures", "libp2p-core", + "libp2p-identity", "log", "parking_lot 0.12.1", "smallvec 1.10.0", @@ -2631,18 +2628,20 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" -version = "0.44.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.44.3" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "asynchronous-codec", "base64 0.21.0", "byteorder", "bytes", + "either", "fnv", "futures", "hex_fmt", "instant", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "log", "prometheus-client", @@ -2655,19 +2654,21 @@ dependencies = [ "smallvec 1.10.0", "thiserror", "unsigned-varint", + "void", "wasm-timer", ] [[package]] name = "libp2p-identify" -version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.42.1" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "asynchronous-codec", "either", "futures", "futures-timer", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "log", "lru", @@ -2678,10 +2679,28 @@ dependencies = [ "void", ] +[[package]] +name = "libp2p-identity" +version = "0.1.2" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" +dependencies = [ + "bs58", + "ed25519-dalek", + "log", + "multiaddr", + "multihash", + "quick-protobuf", + "rand 0.8.5", + "serde", + "sha2 0.10.6", + "thiserror", + "zeroize", +] + [[package]] name = "libp2p-kad" -version = "0.43.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.43.2" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "arrayvec 0.7.2", "asynchronous-codec", @@ -2692,6 +2711,7 @@ dependencies = [ "futures-timer", "instant", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "log", "quick-protobuf", @@ -2707,13 +2727,14 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.43.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.43.1" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "data-encoding", "futures", "if-watch", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "log", "rand 0.8.5", @@ -2727,10 +2748,11 @@ dependencies = [ [[package]] name = "libp2p-metrics" version = "0.12.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "libp2p-core", "libp2p-identify", + "libp2p-identity", "libp2p-swarm", "prometheus-client", ] @@ -2738,12 +2760,13 @@ dependencies = [ [[package]] name = "libp2p-mplex" version = "0.39.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "asynchronous-codec", "bytes", "futures", "libp2p-core", + "libp2p-identity", "log", "nohash-hasher", "parking_lot 0.12.1", @@ -2754,13 +2777,14 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.42.1" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "bytes", "curve25519-dalek 3.2.0", "futures", "libp2p-core", + "libp2p-identity", "log", "once_cell", "quick-protobuf", @@ -2775,14 +2799,15 @@ dependencies = [ [[package]] name = "libp2p-quic" -version = "0.7.0-alpha.2" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.7.0-alpha.3" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "bytes", "futures", "futures-timer", "if-watch", "libp2p-core", + "libp2p-identity", "libp2p-tls", "log", "parking_lot 0.12.1", @@ -2796,12 +2821,13 @@ dependencies = [ [[package]] name = "libp2p-request-response" version = "0.24.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "async-trait", "futures", "instant", "libp2p-core", + "libp2p-identity", "libp2p-swarm", "rand 0.8.5", "smallvec 1.10.0", @@ -2809,45 +2835,45 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.42.2" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "either", "fnv", "futures", "futures-timer", - "getrandom 0.2.8", "instant", "libp2p-core", + "libp2p-identity", "libp2p-swarm-derive", "log", "rand 0.8.5", "smallvec 1.10.0", "tokio", "void", - "wasm-bindgen-futures", ] [[package]] name = "libp2p-swarm-derive" version = "0.32.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "heck", - "quote 1.0.23", - "syn 1.0.109", + "quote 1.0.26", + "syn 2.0.15", ] [[package]] name = "libp2p-tcp" version = "0.39.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "futures", "futures-timer", "if-watch", "libc", "libp2p-core", + "libp2p-identity", "log", "socket2", "tokio", @@ -2855,38 +2881,26 @@ dependencies = [ [[package]] name = "libp2p-tls" -version = "0.1.0-alpha.2" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.1.0" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "futures", "futures-rustls", "libp2p-core", + "libp2p-identity", "rcgen 0.10.0", "ring", "rustls 0.20.8", "thiserror", "webpki 0.22.0", - "x509-parser 0.14.0", + "x509-parser 0.15.0", "yasna", ] -[[package]] -name = "libp2p-wasm-ext" -version = "0.39.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" -dependencies = [ - "futures", - "js-sys", - "libp2p-core", - "parity-send-wrapper", - "wasm-bindgen", - "wasm-bindgen-futures", -] - [[package]] name = "libp2p-webrtc" -version = "0.4.0-alpha.2" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +version = "0.4.0-alpha.4" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "async-trait", "asynchronous-codec", @@ -2896,6 +2910,7 @@ dependencies = [ "hex", "if-watch", "libp2p-core", + "libp2p-identity", "libp2p-noise", "log", "multihash", @@ -2904,6 +2919,7 @@ dependencies = [ "rand 0.8.5", "rcgen 0.9.3", "serde", + "sha2 0.10.6", "stun", "thiserror", "tinytemplate", @@ -2915,12 +2931,13 @@ dependencies = [ [[package]] name = "libp2p-websocket" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "either", "futures", "futures-rustls", "libp2p-core", + "libp2p-identity", "log", "parking_lot 0.12.1", "quicksink", @@ -2933,7 +2950,7 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.43.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "futures", "libp2p-core", @@ -2974,6 +2991,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +[[package]] +name = "linux-raw-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f508063cc7bb32987c71511216bd5a32be15bccb6a80b52df8b9d7f01fc3aa2" + [[package]] name = "lock_api" version = "0.4.9" @@ -2997,9 +3020,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e7d46de488603ffdd5f30afbc64fbba2378214a2c3a2fb83abf3d33126df17" +checksum = "03f1160296536f10c833a82dca22267d5486734230d47bf00bf435885814ba1e" dependencies = [ "hashbrown 0.13.2", ] @@ -3108,13 +3131,14 @@ dependencies = [ [[package]] name = "multiaddr" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b53e0cc5907a5c216ba6584bf74be8ab47d6d6289f72793b2dddbf15dc3bf8c" +checksum = "2b36f567c7099511fa8612bbbb52dda2419ce0bdbacf31714e3a5ffdb766d3bd" dependencies = [ "arrayref", "byteorder", "data-encoding", + "log", "multibase", "multihash", "percent-encoding", @@ -3142,11 +3166,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835d6ff01d610179fbce3de1694d007e500bf33a7f29689838941d6bf783ae40" dependencies = [ "core2", - "digest 0.10.6", "multihash-derive", "serde", "serde-big-array", - "sha2 0.10.6", "unsigned-varint", ] @@ -3158,8 +3180,8 @@ checksum = "1d6d4752e6230d8ef7adf7bd5d8c4b1f6561c1014c5ba9a37445ccefe18aa1db" dependencies = [ "proc-macro-crate", "proc-macro-error", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", "synstructure", ] @@ -3167,7 +3189,7 @@ dependencies = [ [[package]] name = "multistream-select" version = "0.12.1" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "bytes", "futures", @@ -3250,9 +3272,9 @@ dependencies = [ [[package]] name = "netlink-sys" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260e21fbb6f3d253a14df90eb0000a6066780a15dd901a7519ce02d77a94985b" +checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" dependencies = [ "bytes", "futures", @@ -3419,7 +3441,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" dependencies = [ - "asn1-rs 0.5.1", + "asn1-rs 0.5.2", ] [[package]] @@ -3448,9 +3470,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.48" +version = "0.10.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2" +checksum = "7e30d8bc91859781f0a943411186324d580f2bbeb71b452fe91ae344806af3f1" dependencies = [ "bitflags", "cfg-if 1.0.0", @@ -3463,13 +3485,13 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.109", + "proc-macro2 1.0.56", + "quote 1.0.26", + "syn 2.0.15", ] [[package]] @@ -3480,11 +3502,10 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.83" +version = "0.9.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b" +checksum = "0d3d193fb1488ad46ffe3aaabc912cc931d02ee8518fe2959aea8ef52718b0c0" dependencies = [ - "autocfg 1.1.0", "cc", "libc", "pkg-config", @@ -3538,17 +3559,11 @@ dependencies = [ "zeroize", ] -[[package]] -name = "parity-send-wrapper" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9777aa91b8ad9dd5aaa04a9b6bcb02c7f1deb952fca5a66034d5e63afc5c6f" - [[package]] name = "parking" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" [[package]] name = "parking_lot" @@ -3643,8 +3658,8 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] @@ -3718,16 +3733,18 @@ dependencies = [ [[package]] name = "polling" -version = "2.5.2" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" +checksum = "4be1c66a6add46bff50935c313dae30a5030cf8385c5206e8a95e9e9def974aa" dependencies = [ "autocfg 1.1.0", + "bitflags", "cfg-if 1.0.0", + "concurrent-queue", "libc", "log", - "wepoll-ffi", - "windows-sys 0.42.0", + "pin-project-lite 0.2.9", + "windows-sys 0.48.0", ] [[package]] @@ -3809,8 +3826,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", "version_check", ] @@ -3821,8 +3838,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "version_check", ] @@ -3843,9 +3860,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] @@ -3868,8 +3885,8 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b6a5217beb0ad503ee7fa752d451c905113d70721b937126158f3106a48cc1" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] @@ -3922,7 +3939,7 @@ dependencies = [ [[package]] name = "quick-protobuf-codec" version = "0.1.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "asynchronous-codec", "bytes", @@ -3944,9 +3961,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4ced82a24bb281af338b9e8f94429b6eca01b4e66d899f40031f074e74c9" +checksum = "67c10f662eee9c94ddd7135043e544f3c82fa839a1e7b865911331961b53186c" dependencies = [ "bytes", "rand 0.8.5", @@ -3971,11 +3988,11 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ - "proc-macro2 1.0.51", + "proc-macro2 1.0.56", ] [[package]] @@ -4244,9 +4261,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" dependencies = [ "aho-corasick", "memchr", @@ -4255,15 +4272,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "reqwest" -version = "0.11.15" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ba30cc2c0cd02af1222ed216ba659cdb2f879dfe3181852fe7c50b1d0005949" +checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" dependencies = [ "base64 0.21.0", "bytes", @@ -4399,7 +4416,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.16", + "semver 1.0.17", ] [[package]] @@ -4418,13 +4435,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" dependencies = [ "bitflags", - "errno", + "errno 0.2.8", "io-lifetimes", "libc", - "linux-raw-sys", + "linux-raw-sys 0.1.4", "windows-sys 0.45.0", ] +[[package]] +name = "rustix" +version = "0.37.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "722529a737f5a942fdbac3a46cee213053196737c5eaa3386d52e85b786f2659" +dependencies = [ + "bitflags", + "errno 0.3.1", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.2", + "windows-sys 0.48.0", +] + [[package]] name = "rustls" version = "0.19.1" @@ -4450,6 +4481,16 @@ dependencies = [ "webpki 0.22.0", ] +[[package]] +name = "rustls-webpki" +version = "0.100.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rusty-fork" version = "0.3.0" @@ -4469,7 +4510,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04c67700d4731d7c35c914a844dba95ae6689a419a576433c745b76757a555db" dependencies = [ "crc 1.8.1", - "errno", + "errno 0.2.8", "fs2", "integer-encoding", "rand 0.7.3", @@ -4479,7 +4520,7 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p#12b785e94ede1e763dd041a107d3a00d5135a213" +source = "git+https://github.com/libp2p/rust-libp2p#5df321d8b90e6b025a7c052572bc802ca1c6a86a" dependencies = [ "futures", "pin-project", @@ -4518,9 +4559,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "scratch" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" [[package]] name = "sct" @@ -4622,9 +4663,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "semver-parser" @@ -4632,12 +4673,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - [[package]] name = "serde" version = "1.0.152" @@ -4692,16 +4727,16 @@ version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] [[package]] name = "serde_fmt" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2963a69a2b3918c1dc75a45a18bd3fcd1120e31d3f59deb1b2f9b5d5ffb8baa4" +checksum = "6180def5ddda7565fea64b0fba33b99192d86d669f23b5019598e0b7e846b407" dependencies = [ "serde", ] @@ -4899,6 +4934,7 @@ dependencies = [ "serde", "serde_json", "skw-mpc-auth", + "skw-mpc-leveldb", "skw-mpc-storage", "tide", ] @@ -4987,35 +5023,108 @@ dependencies = [ ] [[package]] -name = "skw-mpc-client" +name = "skw-mpc-client-bin" +version = "0.1.0" +dependencies = [ + "async-std", + "blake2 0.10.6", + "dotenv", + "env_logger 0.10.0", + "futures", + "hex", + "hmac-sha1", + "http", + "log", + "rand 0.8.5", + "reqwest", + "serde", + "serde-hex", + "serde_json", + "skw-mpc-auth", + "skw-mpc-light-node", + "skw-mpc-node", + "skw-mpc-payload", + "tide", + "tokio", +] + +[[package]] +name = "skw-mpc-full-node" version = "0.1.7" dependencies = [ - "async-trait", - "bincode", "futures", - "getrandom 0.2.8", "libp2p", "log", "pretty_env_logger", - "rcgen 0.10.0", "serde", "serde_json", + "skw-crypto-curv", + "skw-mpc-auth", + "skw-mpc-full-swarm", + "skw-mpc-leveldb", "skw-mpc-node", "skw-mpc-payload", + "skw-mpc-protocol", + "skw-mpc-storage", + "skw-round-based", "thiserror", "tokio", - "wasm-bindgen-futures", ] [[package]] -name = "skw-mpc-client-bin" +name = "skw-mpc-full-swarm" +version = "0.1.7" +dependencies = [ + "futures", + "libp2p", + "log", + "skw-mpc-node", + "skw-mpc-payload", + "tokio", +] + +[[package]] +name = "skw-mpc-leveldb" version = "0.1.7" dependencies = [ "futures", + "rusty-leveldb", + "serde", + "skw-mpc-storage", + "tokio", +] + +[[package]] +name = "skw-mpc-light-node" +version = "0.1.7" +dependencies = [ + "futures", + "libp2p", "log", "pretty_env_logger", - "skw-mpc-client", + "serde", + "serde_json", + "skw-crypto-curv", + "skw-mpc-auth", + "skw-mpc-light-swarm", + "skw-mpc-node", + "skw-mpc-payload", + "skw-mpc-protocol", + "skw-mpc-storage", + "skw-round-based", + "thiserror", + "tokio", +] + +[[package]] +name = "skw-mpc-light-swarm" +version = "0.1.7" +dependencies = [ + "futures", + "libp2p", + "log", "skw-mpc-node", + "skw-mpc-payload", "tokio", ] @@ -5044,6 +5153,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "skw-mpc-node-bin" +version = "0.1.7" +dependencies = [ + "futures", + "log", + "pretty_env_logger", + "skw-mpc-full-node", + "skw-mpc-node", + "tokio", +] + [[package]] name = "skw-mpc-payload" version = "0.1.7" @@ -5080,30 +5201,11 @@ dependencies = [ name = "skw-mpc-storage" version = "0.1.7" dependencies = [ - "async-std", "futures", - "rusty-leveldb", "serde", "thiserror", ] -[[package]] -name = "skw-mpc-wasm" -version = "0.1.0" -dependencies = [ - "console_error_panic_hook", - "console_log", - "futures", - "hex", - "log", - "rand 0.8.5", - "serde_json", - "skw-mpc-client", - "skw-mpc-payload", - "wasm-bindgen", - "wasm-bindgen-futures", -] - [[package]] name = "skw-round-based" version = "0.1.7" @@ -5153,14 +5255,14 @@ checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" [[package]] name = "snow" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ba5f4d4ff12bdb6a169ed51b7c48c0e0ac4b0b4b31012b2571e97d78d3201d" +checksum = "5ccba027ba85743e09d15c03296797cad56395089b832b48b5a5217880f57733" dependencies = [ "aes-gcm 0.9.4", "blake2 0.10.6", "chacha20poly1305", - "curve25519-dalek 4.0.0-rc.0", + "curve25519-dalek 4.0.0-rc.1", "rand_core 0.6.4", "ring", "rustc_version 0.4.0", @@ -5170,9 +5272,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", @@ -5245,8 +5347,8 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "serde", "serde_derive", "syn 1.0.109", @@ -5259,8 +5361,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" dependencies = [ "base-x", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "serde", "serde_derive", "serde_json", @@ -5340,8 +5442,19 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2 1.0.56", + "quote 1.0.26", "unicode-ident", ] @@ -5351,8 +5464,8 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", "unicode-xid 0.2.4", ] @@ -5387,7 +5500,7 @@ dependencies = [ "cfg-if 1.0.0", "fastrand", "redox_syscall", - "rustix", + "rustix 0.36.8", "windows-sys 0.42.0", ] @@ -5411,22 +5524,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.109", + "proc-macro2 1.0.56", + "quote 1.0.26", + "syn 2.0.15", ] [[package]] @@ -5522,8 +5635,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" dependencies = [ "proc-macro-hack", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "standback", "syn 1.0.109", ] @@ -5555,14 +5668,13 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.26.0" +version = "1.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" dependencies = [ "autocfg 1.1.0", "bytes", "libc", - "memchr", "mio", "num_cpus", "parking_lot 0.12.1", @@ -5575,13 +5687,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", - "syn 1.0.109", + "proc-macro2 1.0.56", + "quote 1.0.26", + "syn 2.0.15", ] [[package]] @@ -5642,8 +5754,8 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", ] @@ -5747,9 +5859,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.10" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" @@ -5834,9 +5946,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" +checksum = "5b55a3fef2a1e3b3a00ce878640918820d3c51081576ac657d23af9fc7928fdb" dependencies = [ "getrandom 0.2.8", ] @@ -5957,8 +6069,8 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", "wasm-bindgen-shared", ] @@ -5981,7 +6093,7 @@ version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ - "quote 1.0.23", + "quote 1.0.26", "wasm-bindgen-macro-support", ] @@ -5991,8 +6103,8 @@ version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -6051,11 +6163,11 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +checksum = "aa54963694b65584e170cf5dc46aeb4dcaa5584e652ff5f3952e56d66aff0125" dependencies = [ - "webpki 0.22.0", + "rustls-webpki", ] [[package]] @@ -6128,7 +6240,7 @@ dependencies = [ "byteorder", "ccm", "curve25519-dalek 3.2.0", - "der-parser 8.1.0", + "der-parser 8.2.0", "elliptic-curve", "hkdf 0.12.3", "hmac 0.12.1", @@ -6270,15 +6382,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "widestring" version = "0.5.1" @@ -6329,18 +6432,27 @@ dependencies = [ "windows_x86_64_msvc 0.34.0", ] +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + [[package]] name = "windows-sys" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.1", "windows_aarch64_msvc 0.42.1", "windows_i686_gnu 0.42.1", "windows_i686_msvc 0.42.1", "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.1", "windows_x86_64_msvc 0.42.1", ] @@ -6350,7 +6462,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -6359,21 +6480,42 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.1", "windows_aarch64_msvc 0.42.1", "windows_i686_gnu 0.42.1", "windows_i686_msvc 0.42.1", "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.1", "windows_x86_64_msvc 0.42.1", ] +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.34.0" @@ -6386,6 +6528,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.34.0" @@ -6398,6 +6546,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.34.0" @@ -6410,6 +6564,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.34.0" @@ -6422,12 +6582,24 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.34.0" @@ -6440,6 +6612,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "winreg" version = "0.10.1" @@ -6492,14 +6670,13 @@ dependencies = [ [[package]] name = "x509-parser" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +checksum = "bab0c2f54ae1d92f4fcb99c0b7ccf0b1e3451cbd395e5f115ccbdbcb18d4f634" dependencies = [ - "asn1-rs 0.5.1", - "base64 0.13.1", + "asn1-rs 0.5.2", "data-encoding", - "der-parser 8.1.0", + "der-parser 8.2.0", "lazy_static", "nom", "oid-registry 0.6.1", @@ -6524,18 +6701,18 @@ dependencies = [ [[package]] name = "yasna" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aed2e7a52e3744ab4d0c05c20aa065258e84c49fd4226f5191b2ed29712710b4" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" dependencies = [ "time 0.3.20", ] [[package]] name = "zeroize" -version = "1.5.7" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] @@ -6546,8 +6723,8 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ - "proc-macro2 1.0.51", - "quote 1.0.23", + "proc-macro2 1.0.56", + "quote 1.0.26", "syn 1.0.109", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index 875ddd7..7b76760 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,21 +1,28 @@ [workspace] members = [ - 'crates/skw-mpc-auth', - 'crates/skw-mpc-client', - 'crates/skw-mpc-node', - 'crates/skw-mpc-payload', - 'crates/skw-mpc-protocol', - 'crates/skw-mpc-storage', - 'crates/skw-mpc-wasm', - 'crates/skw-round-based', + 'src/full-node/skw-mpc-full-node', + 'src/full-node/skw-mpc-full-swarm', - 'crypto/skw-crypto-curv', - 'crypto/skw-crypto-paillier', - 'crypto/skw-crypto-zk-paillier', + 'src/light-node/skw-mpc-light-node', + 'src/light-node/skw-mpc-light-swarm', - 'bin/skw-auth-service', - 'bin/skw-mpc-client-bin', - # 'bin/skw-mpc-node-bin', + 'src/crates/skw-mpc-payload', + 'src/crates/skw-mpc-auth', + 'src/crates/skw-mpc-payload', + 'src/crates/skw-mpc-protocol', + 'src/crates/skw-round-based', + 'src/crates/skw-mpc-node', + + 'src/crypto/skw-crypto-curv', + 'src/crypto/skw-crypto-paillier', + 'src/crypto/skw-crypto-zk-paillier', + + 'src/storage/skw-mpc-storage', + 'src/storage/skw-mpc-leveldb', + + 'src/bin/skw-auth-service', + 'src/bin/skw-mpc-node-bin', + 'src/bin/skw-mpc-client-bin', ] exclude = [] diff --git a/bin/skw-mpc-client-bin/Cargo.toml b/bin/skw-mpc-client-bin/Cargo.toml deleted file mode 100644 index 0017663..0000000 --- a/bin/skw-mpc-client-bin/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "skw-mpc-client-bin" -version = "0.1.7" -edition = "2021" -authors = ["Song Zhou "] -license = "GPL-3.0" -description = "Mpc node runner" - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] - -[dependencies] -skw-mpc-node = { path = "../../crates/skw-mpc-node", default-features = false, features = ["light-node", "tcp-ws-transport"]} -skw-mpc-client = { path = "../../crates/skw-mpc-client", default-features = false, features = ["full-node", "tcp-ws-transport"]} - -futures = "0.3.1" - -tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } - -log = "0.4.17" -pretty_env_logger = "0.4.0" - -[[bin]] -name = "skw-mpc-client-bin" \ No newline at end of file diff --git a/bin/skw-mpc-client-bin/src/main.rs b/bin/skw-mpc-client-bin/src/main.rs deleted file mode 100644 index f18dac7..0000000 --- a/bin/skw-mpc-client-bin/src/main.rs +++ /dev/null @@ -1,69 +0,0 @@ -use std::{fs, io::Write}; - -use futures::channel::mpsc; -use futures::StreamExt; - -use skw_mpc_client::{ - swarm::{new_swarm_node}, - async_executor, -}; -use skw_mpc_node::{ - node::{NodeClient, light_node_event_loop}, -}; - -const LISTEN_ADDR: &str = "127.0.0.1"; - -#[tokio::main] -async fn main() { - pretty_env_logger::init(); - - let (client_request_sender, client_request_receiver) = mpsc::channel(0); - async_executor(light_node_event_loop(client_request_receiver)); - let mut light_node_client = NodeClient::new(client_request_sender); - - let mut light_client_node_res = light_node_client - .bootstrap_node( - None, - format!("/ip4/{}/tcp/2622/ws", LISTEN_ADDR), - "mpc-storage-db-light-node".to_string() // no db will actually be initialized - ).await; - - async_executor(async move { - loop { - let res = light_client_node_res.select_next_some().await; - log::error!("Result {:?}", res); - } - }); - - let peer_id = light_node_client.peer_id(); - - let ( - local_peer_id, - mut client, - event_loop, - _termination_sender, - ) = new_swarm_node( light_node_client, None ); - async_executor(event_loop.run()); - - client - .start_listening(format!("/ip4/{}/tcp/2619/ws", LISTEN_ADDR).parse().expect("multiaddr should be valid")) - .await - .unwrap(); - - let env_file_node1 = format!("LIGHT_NODE_ID = {}\n", peer_id.to_string()); - let env_file_node2 = format!("CLIENT_NODE_ID = {}\n", local_peer_id.to_string()); - - let mut file = fs::OpenOptions::new() - .append(true) - .open("./.env.peers") - .expect("able to open a file"); - - file.write_all(env_file_node1.as_bytes()).expect("able to write"); - file.write_all(env_file_node2.as_bytes()).expect("able to write"); - - std::env::set_var("LIGHT_NODE_ID", peer_id.to_string()); - std::env::set_var("CLIENT_NODE_ID", local_peer_id.to_string()); - - log::info!("Init done. PeerIds has been written to .env.peers"); - loop {} -} \ No newline at end of file diff --git a/crates/skw-mpc-client/Cargo.toml b/crates/skw-mpc-client/Cargo.toml deleted file mode 100644 index 6b3a071..0000000 --- a/crates/skw-mpc-client/Cargo.toml +++ /dev/null @@ -1,55 +0,0 @@ -[package] -name = "skw-mpc-client" -version = "0.1.7" -edition = "2021" -authors = ["Song Zhou "] -license = "GPL-3.0" -description = "Mpc pubsub implmenetation" -categories = ["asynchronous", "cryptography", "network-programming"] -keywords = ["round-based", "mpc", "protocol"] - -[package.metadata.docs.rs] -all-features = true -rustdoc-args = ["--cfg", "docsrs"] - -[dependencies] -futures = { version = "0.3.1", default-features = false } -async-trait = "0.1.61" -serde_json = "1.0" -bincode = "1.3.3" -log = "0.4.17" -pretty_env_logger = "0.4.0" - -thiserror = { version = "1.0.23", default-features = false } -serde = { version = "1.0", features = ["derive"], default-features = false } -skw-mpc-payload = { path = "../skw-mpc-payload" } -skw-mpc-node = { path = "../skw-mpc-node", default-features = false, optional = true } -rcgen = { version = "0.10.0", optional = true } - -libp2p = { git = "https://github.com/libp2p/rust-libp2p", version = "0.51.0", features = ["serde", "request-response", "macros", "noise", "mplex", "yamux"]} - -tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } -wasm-bindgen-futures = { version = "0.4.34", optional = true } -getrandom = { version = "0.2", default-features = false, optional = true} - -[features] -default = ["full-node", "tcp-ws-transport"] -wasm-transport = ["wasm-bindgen-futures", "libp2p/wasm-ext", "libp2p/wasm-bindgen", "getrandom/js", "libp2p/wasm-ext-websocket"] -tcp-ws-transport = ["libp2p/tcp", "libp2p/tokio", "tokio/rt-multi-thread", "libp2p/websocket", "rcgen", "libp2p/dns"] - -full-node = ["skw-mpc-node/light-node", "skw-mpc-node/tcp-ws-transport"] -light-node = [] - -[dev-dependencies] -skw-mpc-node = { path = "../skw-mpc-node", default-features = false } - - -[[example]] -name = "node-light-client" -path = "examples/node_light.rs" -required-features = ["light-node", "tcp-ws-transport"] - -[[example]] -name = "node-full-client" -path = "examples/node_full.rs" -required-features = ["full-node", "tcp-ws-transport"] diff --git a/crates/skw-mpc-client/examples/node_full.rs b/crates/skw-mpc-client/examples/node_full.rs deleted file mode 100644 index f1b58c4..0000000 --- a/crates/skw-mpc-client/examples/node_full.rs +++ /dev/null @@ -1,46 +0,0 @@ -use futures::{channel::mpsc, StreamExt}; -use skw_mpc_client::{ - swarm::{new_swarm_node}, - async_executor, -}; -use skw_mpc_node::{ - node::{NodeClient, light_node_event_loop}, -}; - -#[tokio::main] -async fn main() { - pretty_env_logger::init(); - - let (client_request_sender, client_request_receiver) = mpsc::channel(0); - async_executor(light_node_event_loop(client_request_receiver)); - let mut light_node_client = NodeClient::new(client_request_sender); - - let mut light_client_node_res = light_node_client - .bootstrap_node( - Some([3u8; 32]), - "/ip4/100.104.199.31/tcp/2622/ws".to_string(), - "mpc-storage-db-12D3KooWK99VoVxNE7XzyBwXEzW7xhK7Gpv85r9F3V3fyKSUKPH5".to_string() - ).await; - - async_executor(async move { - loop { - let res = light_client_node_res.select_next_some().await; - log::error!("Result {:?}", res); - } - }); - - let ( - local_peer_id, - mut client, - event_loop, - _termination_sender, - ) = new_swarm_node( light_node_client, Some([4u8; 32]) ); - async_executor(event_loop.run()); - - client - .start_listening("/ip4/100.104.199.31/tcp/2619/ws".parse().expect("multiaddr should be valid")) - .await - .unwrap(); - - loop {} -} diff --git a/crates/skw-mpc-client/examples/node_light.rs b/crates/skw-mpc-client/examples/node_light.rs deleted file mode 100644 index df0675b..0000000 --- a/crates/skw-mpc-client/examples/node_light.rs +++ /dev/null @@ -1,166 +0,0 @@ -#[cfg(feature = "light-node")] - -use libp2p::{PeerId, Multiaddr}; -use skw_mpc_client::{ - async_executor, - swarm::{new_swarm_node, MpcP2pRequest} -}; -use skw_mpc_node::serde_support::{decode_signature, decode_key}; -use skw_mpc_payload::{PayloadHeader, header::PayloadType, AuthHeader}; - -#[tokio::main] -async fn main() { - pretty_env_logger::init(); - - let client_node: (PeerId, Multiaddr) = ( - "12D3KooWPT98FXMfDQYavZm66EeVjTqP9Nnehn1gyaydqV8L8BQw".parse().unwrap(), - "/ip4/100.104.199.31/tcp/2619/ws/p2p/12D3KooWPT98FXMfDQYavZm66EeVjTqP9Nnehn1gyaydqV8L8BQw".parse().unwrap() - ); - - let node1 = ( - "12D3KooWRndVhVZPCiQwHBBBdg769GyrPUW13zxwqQyf9r3ANaba".parse().unwrap(), - "/ip4/100.104.199.31/tcp/2622/ws/p2p/12D3KooWRndVhVZPCiQwHBBBdg769GyrPUW13zxwqQyf9r3ANaba".parse().unwrap() - ); - - let node2 = ( - "12D3KooWJWoaqZhDaoEFshF7Rh1bpY9ohihFhzcW6d69Lr2NASuq".parse().unwrap(), - "/ip4/100.104.199.31/tcp/2621/ws/p2p/12D3KooWJWoaqZhDaoEFshF7Rh1bpY9ohihFhzcW6d69Lr2NASuq".parse().unwrap() - ); - - let node3 = ( - "12D3KooWK99VoVxNE7XzyBwXEzW7xhK7Gpv85r9F3V3fyKSUKPH5".parse().unwrap(), - "/ip4/100.104.199.31/tcp/2620/ws/p2p/12D3KooWK99VoVxNE7XzyBwXEzW7xhK7Gpv85r9F3V3fyKSUKPH5".parse().unwrap() - ); - - let keygen_request = PayloadHeader { - payload_id: [0u8; 32], - payload_type: PayloadType::KeyGen, - peers: vec![node1.clone(), node2.clone(), node3.clone()], - sender: node1.0, - - t: 2, n: 3 - }; - - let keygen2_request = PayloadHeader { - payload_id: [4u8; 32], - payload_type: PayloadType::KeyGen, - peers: vec![node1.clone(), node2.clone(), node3.clone()], - sender: node1.0, - - t: 2, n: 3 - }; - - - let sign_request = PayloadHeader { - payload_id: [1u8; 32], - payload_type: PayloadType::SignOffline { message: [2u8; 32] }, - peers: vec![node1.clone(), node2.clone()], - sender: node1.0, - - t: 2, n: 3 - }; - - let key_refresh_request = PayloadHeader { - payload_id: [2u8; 32], - payload_type: PayloadType::KeyRefresh, - peers: vec![node1.clone(), node2.clone(), node3.clone()], - sender: node1.0, - - t: 2, n: 3 - }; - - let sign2_request = PayloadHeader { - payload_id: [3u8; 32], - payload_type: PayloadType::SignOffline { message: [2u8; 32] }, - peers: vec![node1.clone(), node2.clone()], - sender: node1.0, - - t: 2, n: 3 - }; - - println!("KeyGEN {:?}", serde_json::to_string(&AuthHeader::test_auth_header())); - - let ( _, mut client, event_loop, _) = new_swarm_node( None ); - async_executor(event_loop.run()); - - let _ = client - .dial(client_node.0, client_node.1) - .await; - - println!("Sending keygen Req"); - let local_key = client - .send_request( - client_node.0, - MpcP2pRequest::Mpc { - auth_header: AuthHeader::test_auth_header(), - job_header: keygen_request, - maybe_local_key: None, - } - ).await; - - let local_key = local_key.unwrap().payload().unwrap(); - - println!("KeyGen Res {:?}", decode_key(&local_key)); - println!("Sending Sign Req"); - - let res = client - .send_request( - client_node.0, - MpcP2pRequest::Mpc { - auth_header: AuthHeader::test_auth_header(), - job_header: sign_request, - maybe_local_key: Some(local_key), - } - ).await; - - let sig_payload = res.unwrap().payload().unwrap(); - let sig = decode_signature(&sig_payload); - println!("Result {:?}", sig); - - - let new_key = client - .send_request( - client_node.0, - MpcP2pRequest::Mpc { - auth_header: AuthHeader::test_auth_header(), - job_header: key_refresh_request, - maybe_local_key: None, - } - ).await; - - let new_key = new_key.unwrap().payload().unwrap(); - - println!("New Key {:?}", decode_key(&new_key)); - - // wait for 1 seconds? - // let ten_millis = std::time::Duration::from_millis(3000); - // std::thread::sleep(ten_millis); - - let res = client - .send_request( - client_node.0, - MpcP2pRequest::Mpc { - auth_header: AuthHeader::test_auth_header(), - job_header: sign2_request, - maybe_local_key: Some(new_key), - } - ).await; - - let sig_payload = res.unwrap().payload().unwrap(); - let sig = decode_signature(&sig_payload); - println!("Result {:?}", sig); - - - let abort_overwriting_key = client - .send_request( - client_node.0, - MpcP2pRequest::Mpc { - auth_header: AuthHeader::test_auth_header(), - job_header: keygen2_request, - maybe_local_key: None, - } - ).await; - - println!("Result {:?}", abort_overwriting_key); - -} diff --git a/crates/skw-mpc-client/src/error.rs b/crates/skw-mpc-client/src/error.rs deleted file mode 100644 index f186f7e..0000000 --- a/crates/skw-mpc-client/src/error.rs +++ /dev/null @@ -1,21 +0,0 @@ -use serde::{Serialize, Deserialize}; - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub enum SwarmError { - FailToListenToAddress, - FailToDailPeer, - AlreadyDailingPeer, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub enum SwarmP2pError { - ResponseChannelClose, - OutboundFailure, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub enum MpcClientError { - SwarmError(SwarmError), - SwarmP2pError(SwarmP2pError), - MpcNodeError(String), -} diff --git a/crates/skw-mpc-client/src/lib.rs b/crates/skw-mpc-client/src/lib.rs deleted file mode 100644 index 70a080d..0000000 --- a/crates/skw-mpc-client/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -pub mod error; -pub mod swarm; - -pub fn async_executor(future: F) - where F: futures::Future + 'static + std::marker::Send, -{ - #[cfg(target_arch = "wasm32")] - wasm_bindgen_futures::spawn_local(future); - - #[cfg(not(target_arch = "wasm32"))] - tokio::spawn(future); -} \ No newline at end of file diff --git a/crates/skw-mpc-client/src/swarm/behavior.rs b/crates/skw-mpc-client/src/swarm/behavior.rs deleted file mode 100644 index dad944e..0000000 --- a/crates/skw-mpc-client/src/swarm/behavior.rs +++ /dev/null @@ -1,139 +0,0 @@ -use libp2p::{ - swarm::{NetworkBehaviour}, - request_response, -}; - -// re-export -pub use self::skw_mpc_p2p_behavior::{SkwMpcP2pCodec, SkwMpcP2pProtocol, MpcP2pRequest, MpcP2pResponse}; - -#[derive(NetworkBehaviour)] -pub struct MpcSwarmBahavior { - // node p2p behavior - pub request_response: request_response::Behaviour, -} - -// Sub protocol - p2p request-response -pub mod skw_mpc_p2p_behavior { - use serde::{Serialize, Deserialize}; - use tokio::io; - use futures::prelude::*; - - use libp2p::core::upgrade::{read_length_prefixed, write_length_prefixed, ProtocolName}; - use libp2p::request_response::Codec; - use skw_mpc_payload::{AuthHeader, PayloadHeader}; - - use crate::error::MpcClientError; - - #[derive(Debug, Clone)] - pub struct SkwMpcP2pProtocol(); - #[derive(Clone)] - pub struct SkwMpcP2pCodec(); - - // Serialized Form of raw request - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] - pub enum MpcP2pRequest { - Mpc { - auth_header: AuthHeader, - job_header: PayloadHeader, - maybe_local_key: Option>, - }, - } - - // Serialized Form of raw response - #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] - pub enum MpcP2pResponse { - Mpc { - payload: Result, MpcClientError>, // can be either sign or keygen output - } - } - - impl MpcP2pResponse { - pub fn payload(&self) -> Result, MpcClientError> { - match self { - Self::Mpc{ payload } => payload.clone(), - } - } - } - - impl ProtocolName for SkwMpcP2pProtocol { - fn protocol_name(&self) -> &[u8] { - b"/skw-mpc-request/1" - } - } - - #[async_trait::async_trait] - impl Codec for SkwMpcP2pCodec { - type Protocol = SkwMpcP2pProtocol; - type Request = MpcP2pRequest; - type Response = MpcP2pResponse; - - async fn read_request( - &mut self, - _: &SkwMpcP2pProtocol, - io: &mut T, - ) -> io::Result - where - T: AsyncRead + Unpin + Send, - { - let vec = read_length_prefixed(io, 100_240).await?; - - if vec.is_empty() { - return Err(io::ErrorKind::UnexpectedEof.into()); - } - bincode::deserialize( &vec ) - .map_err(|_| io::ErrorKind::InvalidData.into() ) - } - - async fn read_response( - &mut self, - _: &SkwMpcP2pProtocol, - io: &mut T, - ) -> io::Result - where - T: AsyncRead + Unpin + Send, - { - let vec = read_length_prefixed(io, 100_240).await?; // update transfer maximum - - if vec.is_empty() { - return Err(io::ErrorKind::UnexpectedEof.into()); - } - - bincode::deserialize( &vec ) - .map_err(|_| io::ErrorKind::InvalidData.into() ) - } - - async fn write_request( - &mut self, - _: &SkwMpcP2pProtocol, - io: &mut T, - raw: MpcP2pRequest, - ) -> io::Result<()> - where - T: AsyncWrite + Unpin + Send, - { - let data = bincode::serialize(&raw).expect("request message to be valid"); - - write_length_prefixed(io, data).await?; - io.close().await?; - - Ok(()) - } - - async fn write_response( - &mut self, - _: &SkwMpcP2pProtocol, - io: &mut T, - raw: MpcP2pResponse, - ) -> io::Result<()> - where - T: AsyncWrite + Unpin + Send, - { - let data = bincode::serialize(&raw).expect("response message to be valid"); - write_length_prefixed(io, data).await?; - io.close().await?; - - Ok(()) - } - } - -} \ No newline at end of file diff --git a/crates/skw-mpc-client/src/swarm/client.rs b/crates/skw-mpc-client/src/swarm/client.rs deleted file mode 100644 index 0c9fe98..0000000 --- a/crates/skw-mpc-client/src/swarm/client.rs +++ /dev/null @@ -1,78 +0,0 @@ -use libp2p::{PeerId, Multiaddr}; -use futures::{SinkExt}; -use futures::channel::{mpsc, oneshot}; - -use crate::error::MpcClientError; - -use super::behavior::{MpcP2pRequest, MpcP2pResponse}; - -#[derive(Debug)] -pub enum MpcSwarmCommand { - // Command to node - #[cfg(feature = "full-node")] - StartListening { - addr: Multiaddr, - result_sender: oneshot::Sender>, - }, - Dial { - peer_id: PeerId, - peer_addr: Multiaddr, - result_sender: oneshot::Sender>, - }, - SendP2pRequest { - to: PeerId, - request: MpcP2pRequest, - result_sender: oneshot::Sender>, - }, -} - -pub struct MpcSwarmClient { - pub command_sender: mpsc::UnboundedSender -} - -impl MpcSwarmClient { - /// Listen for incoming connections on the given address. - #[cfg(feature = "full-node")] - pub async fn start_listening( - &mut self, - addr: Multiaddr, - ) -> Result<(), MpcClientError> { - let (result_sender, result_receiver) = oneshot::channel(); - self.command_sender - .send(MpcSwarmCommand::StartListening { addr, result_sender }) - .await - .expect("MpcSwarmCommand receiver not to be dropped."); - result_receiver - .await - .expect("Sender not to be dropped.") - } - - /// Dial the given peer at the given address. - pub async fn dial( - &mut self, - peer_id: PeerId, - peer_addr: Multiaddr, - ) -> Result<(), MpcClientError> { - let (result_sender, result_receiver) = oneshot::channel(); - - self.command_sender - .send(MpcSwarmCommand::Dial { - peer_id, - peer_addr, - result_sender, - }) - .await - .expect("Command receiver not to be dropped."); - result_receiver.await.expect("Sender not to be dropped.") - } - - pub async fn send_request(&mut self, to: PeerId, request: MpcP2pRequest) -> Result { - let (result_sender, result_receiver) = oneshot::channel(); - self.command_sender - .send(MpcSwarmCommand::SendP2pRequest { to, request, result_sender }) - .await - .expect("Command receiver not to be dropped."); - let status = result_receiver.await.expect("Sender not to be dropped."); - status - } -} \ No newline at end of file diff --git a/crates/skw-mpc-client/src/swarm/mod.rs b/crates/skw-mpc-client/src/swarm/mod.rs deleted file mode 100644 index 0116d0a..0000000 --- a/crates/skw-mpc-client/src/swarm/mod.rs +++ /dev/null @@ -1,149 +0,0 @@ -mod behavior; -mod client; -mod event_loop; - -use libp2p::request_response::ProtocolSupport; -use libp2p::{ - identity, PeerId, Swarm, - request_response, - mplex, noise, yamux, core, InboundUpgradeExt, OutboundUpgradeExt, Transport, -}; - -use futures::channel::mpsc; - -#[cfg(feature = "full-node")] -use skw_mpc_node::node::NodeClient; - -use self::behavior::{MpcSwarmBahavior, SkwMpcP2pCodec, SkwMpcP2pProtocol}; - -// re-export -pub use client::MpcSwarmClient; -pub use event_loop::MpcSwarmEventLoop; -pub use behavior::{MpcP2pRequest, MpcP2pResponse}; - -#[cfg(feature = "tcp-ws-transport")] -fn build_swarm(local_key: identity::Keypair) -> Swarm { - use std::time::Duration; - - use libp2p::{websocket, tcp, dns}; - let local_peer_id = PeerId::from(local_key.public()); - - let transport = { - let multiplexing_config = { - let mut mplex_config = mplex::MplexConfig::new(); - mplex_config.set_max_buffer_behaviour(mplex::MaxBufferBehaviour::Block); - mplex_config.set_max_buffer_size(usize::MAX); - - let mut yamux_config = yamux::YamuxConfig::default(); - // Enable proper flow-control: window updates are only sent when - // buffered data has been consumed. - yamux_config.set_window_update_mode(yamux::WindowUpdateMode::on_read()); - - core::upgrade::SelectUpgrade::new(yamux_config, mplex_config) - .map_inbound(core::muxing::StreamMuxerBox::new) - .map_outbound(core::muxing::StreamMuxerBox::new) - }; - - websocket::WsConfig::new(dns::TokioDnsConfig::system( - tcp::tokio::Transport::new(tcp::Config::default()), - ).unwrap()) - .upgrade(libp2p::core::upgrade::Version::V1) - .authenticate( - noise::NoiseAuthenticated::xx(&local_key) - .expect("Signing libp2p-noise static DH keypair failed."), - ) - .multiplex(multiplexing_config) - .timeout(Duration::from_secs(10)) - - .boxed() - }; - - let request_response = request_response::Behaviour::::new( - SkwMpcP2pCodec(), - std::iter::once((SkwMpcP2pProtocol(), ProtocolSupport::Full)), - Default::default(), - ); - let behaviour = MpcSwarmBahavior { request_response, }; - Swarm::with_tokio_executor(transport, behaviour, local_peer_id) -} - - -#[cfg(all(feature = "wasm-transport", target_arch = "wasm32"))] -fn build_swarm(local_key: identity::Keypair) -> Swarm { - use libp2p::wasm_ext; - let local_peer_id = PeerId::from(local_key.public()); - - let transport = { - let multiplexing_config = { - let mut mplex_config = mplex::MplexConfig::new(); - mplex_config.set_max_buffer_behaviour(mplex::MaxBufferBehaviour::Block); - mplex_config.set_max_buffer_size(usize::MAX); - - let mut yamux_config = yamux::YamuxConfig::default(); - // Enable proper flow-control: window updates are only sent when - // buffered data has been consumed. - yamux_config.set_window_update_mode(yamux::WindowUpdateMode::on_read()); - - core::upgrade::SelectUpgrade::new(yamux_config, mplex_config) - .map_inbound(core::muxing::StreamMuxerBox::new) - .map_outbound(core::muxing::StreamMuxerBox::new) - }; - - let transport_base = wasm_ext::ffi::websocket_transport(); - let transport_base = wasm_ext::ExtTransport::new(transport_base); - libp2p::Transport::upgrade(transport_base, libp2p::core::upgrade::Version::V1) - .authenticate( - noise::NoiseAuthenticated::xx(&local_key) - .expect("Signing libp2p-noise static DH keypair failed."), - ) - .multiplex(multiplexing_config) - .boxed() - }; - - let request_response = request_response::Behaviour::::new( - SkwMpcP2pCodec(), - std::iter::once((SkwMpcP2pProtocol(), ProtocolSupport::Full)), - Default::default(), - ); - let behaviour = MpcSwarmBahavior { request_response, }; - Swarm::with_wasm_executor(transport, behaviour, local_peer_id) -} - -pub fn new_swarm_node( - #[cfg(feature = "full-node")] bootstrapped_client: NodeClient, - local_key: Option<[u8; 32]> -) -> ( - PeerId, // local peer id - MpcSwarmClient, - MpcSwarmEventLoop, - mpsc::Sender<()>, // swarm termination -) { - let local_key = match local_key { - None => identity::Keypair::generate_ed25519(), - Some(mut key) => { - identity::Keypair::Ed25519( - identity::ed25519::SecretKey::from_bytes(&mut key[..]).unwrap().into() - ) - } - }; - - let local_peer_id = PeerId::from(local_key.public()); - let swarm = build_swarm(local_key); - - // the main outgoing channel - // we give it one buffer so that outgoing can be synced - let (command_sender, command_receiver) = mpsc::unbounded(); - let (swarm_termination_sender, swarm_termination_receiver) = mpsc::channel(0); - - ( - local_peer_id, - MpcSwarmClient { command_sender }, - MpcSwarmEventLoop::new( - #[cfg(feature = "full-node")] bootstrapped_client, - swarm, - command_receiver, - swarm_termination_receiver - ), - swarm_termination_sender, - ) -} diff --git a/crates/skw-mpc-node/src/lib.rs b/crates/skw-mpc-node/src/lib.rs deleted file mode 100644 index bdd57e5..0000000 --- a/crates/skw-mpc-node/src/lib.rs +++ /dev/null @@ -1,15 +0,0 @@ -pub mod error; -pub mod swarm; -pub mod node; - -pub mod serde_support; - -pub fn async_executor(future: F) - where F: futures::Future + 'static + std::marker::Send, -{ - #[cfg(target_arch = "wasm32")] - wasm_bindgen_futures::spawn_local(future); - - #[cfg(not(target_arch = "wasm32"))] - tokio::spawn(future); -} \ No newline at end of file diff --git a/crates/skw-mpc-node/src/swarm/mod.rs b/crates/skw-mpc-node/src/swarm/mod.rs deleted file mode 100644 index 1fc6f7e..0000000 --- a/crates/skw-mpc-node/src/swarm/mod.rs +++ /dev/null @@ -1,195 +0,0 @@ -mod behavior; -mod client; -mod event_loop; - -use libp2p::request_response::ProtocolSupport; -use libp2p::{ - identity, PeerId, Swarm, - request_response, Multiaddr, - mplex, noise, yamux, core, InboundUpgradeExt, OutboundUpgradeExt, Transport, -}; - -use futures::channel::mpsc; - -use self::behavior::{MpcSwarmBahavior, SkwMpcP2pCodec, SkwMpcP2pProtocol}; - -// re-export -pub use client::MpcSwarmClient; -pub use event_loop::MpcSwarmEventLoop; -pub use behavior::{MpcP2pRequest, MpcP2pResponse}; - -#[cfg(feature = "full-node")] -pub use swarm_full::new_full_swarm_node; - -#[cfg(feature = "light-node")] -pub use swarm_light::new_light_swarm_node; - -#[cfg(feature = "tcp-ws-transport")] -fn build_swarm(local_key: identity::Keypair) -> Swarm { - use std::time::Duration; - - use libp2p::{websocket, tcp, dns}; - let local_peer_id = PeerId::from(local_key.public()); - - let transport = { - let multiplexing_config = { - let mut mplex_config = mplex::MplexConfig::new(); - mplex_config.set_max_buffer_behaviour(mplex::MaxBufferBehaviour::Block); - mplex_config.set_max_buffer_size(usize::MAX); - - let mut yamux_config = yamux::YamuxConfig::default(); - // Enable proper flow-control: window updates are only sent when - // buffered data has been consumed. - yamux_config.set_window_update_mode(yamux::WindowUpdateMode::on_read()); - - core::upgrade::SelectUpgrade::new(yamux_config, mplex_config) - .map_inbound(core::muxing::StreamMuxerBox::new) - .map_outbound(core::muxing::StreamMuxerBox::new) - }; - - websocket::WsConfig::new(dns::TokioDnsConfig::system( - tcp::tokio::Transport::new(tcp::Config::default()), - ).unwrap()) - .upgrade(libp2p::core::upgrade::Version::V1) - .authenticate( - noise::NoiseAuthenticated::xx(&local_key) - .expect("Signing libp2p-noise static DH keypair failed."), - ) - .multiplex(multiplexing_config) - .timeout(Duration::from_secs(10)) - .boxed() - }; - - let request_response = request_response::Behaviour::::new( - SkwMpcP2pCodec(), - std::iter::once((SkwMpcP2pProtocol(), ProtocolSupport::Full)), - Default::default(), - ); - let behaviour = MpcSwarmBahavior { request_response, }; - Swarm::with_tokio_executor(transport, behaviour, local_peer_id) -} - -#[cfg(feature = "full-node")] -mod swarm_full { - use super::*; - use skw_mpc_payload::{PayloadHeader, CryptoHash}; - - pub fn new_full_swarm_node( - local_key: Option<[u8; 32]> - ) -> ( - PeerId, // local peer id - - MpcSwarmClient, - MpcSwarmEventLoop, - - mpsc::Receiver< Multiaddr >, - mpsc::Receiver< (PayloadHeader, CryptoHash) >, // new job assignment channel - receiver side - mpsc::UnboundedReceiver< Vec >, // main message incoming channel - - mpsc::Sender<()>, // swarm termination - ) { - let local_key = match local_key { - None => identity::Keypair::generate_ed25519(), - Some(mut key) => { - identity::Keypair::Ed25519( - identity::ed25519::SecretKey::from_bytes(&mut key[..]).unwrap().into() - ) - } - }; - - let local_peer_id = PeerId::from(local_key.public()); - // eprintln!("Local peer id: {local_peer_id}"); - - let swarm = build_swarm(local_key); - - // the main message INCOMING channel - let (swarm_incoming_message_sender, swarm_incoming_message_receiver) = mpsc::unbounded(); - - // the new job notifier - let (swarm_incoming_job_sender, swarm_incoming_job_receiver) = mpsc::channel(0); - - // the main outgoing channel - // we give it one buffer so that outgoing can be synced - let (command_sender, command_receiver) = mpsc::unbounded(); - - let (addr_sender, addr_receiver) = mpsc::channel(0); - - let (swarm_termination_sender, swarm_termination_receiver) = mpsc::channel(0); - ( - local_peer_id, - MpcSwarmClient { command_sender }, - MpcSwarmEventLoop::new( - swarm, - swarm_incoming_message_sender, - swarm_incoming_job_sender, - command_receiver, - addr_sender, - swarm_termination_receiver - ), - - addr_receiver, - swarm_incoming_job_receiver, - swarm_incoming_message_receiver, - swarm_termination_sender, - ) - } - -} - -#[cfg(feature = "light-node")] -mod swarm_light { - use super::*; - - pub fn new_light_swarm_node( - local_key: Option<[u8; 32]> - ) -> ( - PeerId, // local peer id - - MpcSwarmClient, - MpcSwarmEventLoop, - - mpsc::Receiver< Multiaddr >, - mpsc::UnboundedReceiver< Vec >, // main message incoming channel - - mpsc::Sender<()>, // swarm termination - ) { - let local_key = match local_key { - None => identity::Keypair::generate_ed25519(), - Some(mut key) => { - identity::Keypair::Ed25519( - identity::ed25519::SecretKey::from_bytes(&mut key[..]).unwrap().into() - ) - } - }; - - let local_peer_id = PeerId::from(local_key.public()); - let swarm = build_swarm(local_key); - - // the main message INCOMING channel - let (swarm_incoming_message_sender, swarm_incoming_message_receiver) = mpsc::unbounded(); - - // the main outgoing channel - // we give it one buffer so that outgoing can be synced - let (command_sender, command_receiver) = mpsc::unbounded(); - - let (addr_sender, addr_receiver) = mpsc::channel(0); - - let (swarm_termination_sender, swarm_termination_receiver) = mpsc::channel(0); - ( - local_peer_id, - MpcSwarmClient { command_sender }, - MpcSwarmEventLoop::new( - swarm, - swarm_incoming_message_sender, - command_receiver, - addr_sender, - swarm_termination_receiver - ), - - addr_receiver, - swarm_incoming_message_receiver, - - swarm_termination_sender, - ) - } -} diff --git a/crates/skw-mpc-storage/src/leveldb.rs b/crates/skw-mpc-storage/src/leveldb.rs deleted file mode 100644 index fadd391..0000000 --- a/crates/skw-mpc-storage/src/leveldb.rs +++ /dev/null @@ -1,244 +0,0 @@ -use futures::{channel::mpsc, StreamExt}; -use rusty_leveldb::{DB, Options}; - -use crate::{DBOpIn, DBOpOut, MpcStorageConfig, MpcStorageError}; - -pub fn default_mpc_storage_opt( - db_name_or_path: String, - in_memory: bool -) -> ( - MpcStorageConfig, - mpsc::Sender, -) { - // we want the db op to be executed as long as they are avalaible - let (db_in_sender, db_in_receiver) = mpsc::channel(0); - ( - MpcStorageConfig::new(db_name_or_path, in_memory, db_in_receiver), - db_in_sender, - ) -} - -pub fn run_db_server( - mut config: MpcStorageConfig -) { - let opt = { - match config.is_in_memory() { - false => Options::default(), - true => rusty_leveldb::in_memory() - } - }; - - // TODO: this unwrap is not correct - let mut db = DB::open(config.db_name_or_path(), opt) - .map_err(|_| MpcStorageError::FailToOpenDB) - .unwrap(); - - async_std::task::spawn(async move { - let mut graceful_terminate = false; - loop { - if graceful_terminate { - break; - } - let db_opt_in = config.db_pending_ops().select_next_some().await; - match db_opt_in { - DBOpIn::WriteToDB { key, value, result_sender } => { - let status = db.put(&key[..], &value[..]) - .map_err(|_| MpcStorageError::FailToWriteDB); - - let flush_status = db.flush() - .map_err(|_| MpcStorageError::FailToFlushDB); - - result_sender - .send(DBOpOut::WriteToDB { status: status.and(flush_status) }) - .expect("db out receiver should not been dropped") - }, - DBOpIn::ReadFromDB { key, result_sender } => { - let v = db.get(&key); - let status = match v { - Some(v) => Ok(v), - None => Err(MpcStorageError::KeyNotInDB) - }; - result_sender - .send(DBOpOut::ReadFromDB { status }) - .expect("db out receiver should not been dropped") - }, - DBOpIn::DeleteFromDB { key, result_sender } => { - let status = db.delete(&key) - .map_err(|_| MpcStorageError::KeyNotInDB); - result_sender - .send(DBOpOut::DeleteFromDB { status }) - .expect("db out receiver should not been dropped") - }, - DBOpIn::Shutdown { result_sender } => { - let flush_status = db.flush() - .map_err(|_| MpcStorageError::FailToFlushDB); - let shutdown_status = db.close() - .map_err(|_| MpcStorageError::FailToCloseDB); - - // TODO: make sure no err before shutdown - graceful_terminate = true; - result_sender - .send(DBOpOut::Shutdown { status: flush_status.and(shutdown_status) }) - .expect("db out receiver should not been dropped") - }, - DBOpIn::ForceFlush { result_sender } => { - let status = db.flush() - .map_err(|_| MpcStorageError::FailToFlushDB); - result_sender - .send(DBOpOut::ForceFlush { status }) - .expect("db out receiver should not been dropped") - }, - } - } - }); -} - -#[cfg(test)] -mod test { - use super::*; - use futures::SinkExt; - use futures::channel::oneshot; - - #[async_std::test] - async fn in_memory() { - let (config, mut in_pipe) = default_mpc_storage_opt("in_memory".to_string(), true); - // async_std::task::spawn(); - run_db_server(config); - - { - let (i, o) = oneshot::channel(); - in_pipe - .send(DBOpIn::WriteToDB { - key: [0u8; 32], - value: vec![1, 2, 3], - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - - { - let (i, o) = oneshot::channel(); - in_pipe.send(DBOpIn::WriteToDB { - key: [1u8; 32], - value: vec![4, 5, 6], - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - - { - let (i, o) = oneshot::channel(); - in_pipe.send(DBOpIn::ReadFromDB { - key: [0u8; 32], - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - - { - let (i, o) = oneshot::channel(); - in_pipe.send(DBOpIn::Shutdown { - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - } - - #[async_std::test] - async fn on_disk() { - // Run #1 - { - let (config, mut in_pipe) = default_mpc_storage_opt("mock".to_string(), false); - run_db_server(config); - - { - let (i, o) = oneshot::channel(); - in_pipe - .send(DBOpIn::WriteToDB { - key: [0u8; 32], - value: vec![1, 2, 3], - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - - { - let (i, o) = oneshot::channel(); - in_pipe.send(DBOpIn::WriteToDB { - key: [1u8; 32], - value: vec![4, 5, 6], - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - - { - let (i, o) = oneshot::channel(); - in_pipe.send(DBOpIn::ReadFromDB { - key: [0u8; 32], - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - - { - let (i, o) = oneshot::channel(); - in_pipe.send(DBOpIn::Shutdown { - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - } - - { - let (config, mut in_pipe) = default_mpc_storage_opt("mock".to_string(), false); - run_db_server(config); - { - let (i, o) = oneshot::channel(); - in_pipe.send(DBOpIn::ReadFromDB { - key: [0u8; 32], - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - - { - let (i, o) = oneshot::channel(); - in_pipe.send(DBOpIn::Shutdown { - result_sender: i, - }) - .await - .expect("receiver not dropped"); - let res = o.await; - println!("{:?}", res.unwrap()); - } - } - } -} diff --git a/crates/skw-mpc-storage/src/lib.rs b/crates/skw-mpc-storage/src/lib.rs deleted file mode 100644 index 080bc75..0000000 --- a/crates/skw-mpc-storage/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -pub mod db; -pub mod types; - -#[cfg(feature = "leveldb-backend")] -pub mod leveldb; - -#[cfg(feature = "leveldb-backend")] -pub use leveldb::{default_mpc_storage_opt, run_db_server}; - -// re-export -pub use db::{DBOpIn, DBOpOut, MpcStorageConfig}; -pub use types::{MpcStorageError}; \ No newline at end of file diff --git a/crates/skw-mpc-wasm/Cargo.toml b/crates/skw-mpc-wasm/Cargo.toml deleted file mode 100644 index ad5d9e5..0000000 --- a/crates/skw-mpc-wasm/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "skw-mpc-wasm" -version = "0.1.0" -authors = ["The wasm-bindgen Developers"] -edition = "2018" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -wasm-bindgen = "=0.2.84" -skw-mpc-client = {path = "../skw-mpc-client", default-features = false, features = ["light-node", "wasm-transport"]} -skw-mpc-payload = { path = "../skw-mpc-payload" } - -futures = "0.3.1" -wasm-bindgen-futures = "0.4.34" -console_error_panic_hook = "0.1.7" -console_log = { version = "0.2", features = ["color"] } -log = "0.4.17" - -serde_json = "*" -hex = "*" -rand = { version = "0.8" } \ No newline at end of file diff --git a/crates/skw-mpc-wasm/README.md b/crates/skw-mpc-wasm/README.md deleted file mode 100644 index ab31a61..0000000 --- a/crates/skw-mpc-wasm/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Hello, World! - -[View documentation for this example online][dox] or [View compiled example -online][compiled] - -[compiled]: https://rustwasm.github.io/wasm-bindgen/exbuild/hello_world/ -[dox]: https://rustwasm.github.io/docs/wasm-bindgen/examples/hello-world.html - -You can build the example locally with: - -``` -$ npm run serve -``` - -and then visiting http://localhost:8080 in a browser should run the example! diff --git a/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm.d.ts b/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm.d.ts deleted file mode 100644 index 838a1a2..0000000 --- a/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm.d.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -/** -* @param {string} auth_header -* @param {string} payload -* @param {string} client_identity -* @param {string} client_addr -* @param {boolean} enable_log -* @returns {Promise} -*/ -export function ext_run_keygen(auth_header: string, payload: string, client_identity: string, client_addr: string, enable_log: boolean): Promise; -/** -* @param {string} auth_header -* @param {string} payload -* @param {string} local_key -* @param {string} client_identity -* @param {string} client_addr -* @param {boolean} enable_log -* @returns {Promise} -*/ -export function ext_run_sign(auth_header: string, payload: string, local_key: string, client_identity: string, client_addr: string, enable_log: boolean): Promise; -/** -* @param {string} auth_header -* @param {string} payload -* @param {string} client_identity -* @param {string} client_addr -* @param {boolean} enable_log -* @returns {Promise} -*/ -export function ext_run_key_refreh(auth_header: string, payload: string, client_identity: string, client_addr: string, enable_log: boolean): Promise; - -export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; - -export interface InitOutput { - readonly memory: WebAssembly.Memory; - readonly ext_run_keygen: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => number; - readonly ext_run_sign: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number) => number; - readonly ext_run_key_refreh: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => number; - readonly __wbindgen_malloc: (a: number) => number; - readonly __wbindgen_realloc: (a: number, b: number, c: number) => number; - readonly __wbindgen_export_2: WebAssembly.Table; - readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__he8207c3660c09238: (a: number, b: number, c: number) => void; - readonly _dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hf665a9151ca393f9: (a: number, b: number) => void; - readonly __wbindgen_free: (a: number, b: number) => void; - readonly __wbindgen_exn_store: (a: number) => void; - readonly wasm_bindgen__convert__closures__invoke2_mut__he07b26b847afeaa7: (a: number, b: number, c: number, d: number) => void; -} - -export type SyncInitInput = BufferSource | WebAssembly.Module; -/** -* Instantiates the given `module`, which can either be bytes or -* a precompiled `WebAssembly.Module`. -* -* @param {SyncInitInput} module -* -* @returns {InitOutput} -*/ -export function initSync(module: SyncInitInput): InitOutput; - -/** -* If `module_or_path` is {RequestInfo} or {URL}, makes a request and -* for everything else, calls `WebAssembly.instantiate` directly. -* -* @param {InitInput | Promise} module_or_path -* -* @returns {Promise} -*/ -export default function init (module_or_path?: InitInput | Promise): Promise; diff --git a/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm.js b/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm.js deleted file mode 100644 index 9759a64..0000000 --- a/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm.js +++ /dev/null @@ -1,741 +0,0 @@ -import { websocket_transport } from './snippets/libp2p-wasm-ext-2e7aa19fa5e25979/src/websockets.js'; - -let wasm; - -const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); - -cachedTextDecoder.decode(); - -let cachedUint8Memory0 = null; - -function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; -} - -function getStringFromWasm0(ptr, len) { - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - -const heap = new Array(128).fill(undefined); - -heap.push(undefined, null, true, false); - -let heap_next = heap.length; - -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - -function getObject(idx) { return heap[idx]; } - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; -} - -let WASM_VECTOR_LEN = 0; - -const cachedTextEncoder = new TextEncoder('utf-8'); - -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' - ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} - : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); - -function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length); - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len); - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3); - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - } - - WASM_VECTOR_LEN = offset; - return ptr; -} - -function isLikeNone(x) { - return x === undefined || x === null; -} - -let cachedInt32Memory0 = null; - -function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; -} - -function debugString(val) { - // primitive types - const type = typeof val; - if (type == 'number' || type == 'boolean' || val == null) { - return `${val}`; - } - if (type == 'string') { - return `"${val}"`; - } - if (type == 'symbol') { - const description = val.description; - if (description == null) { - return 'Symbol'; - } else { - return `Symbol(${description})`; - } - } - if (type == 'function') { - const name = val.name; - if (typeof name == 'string' && name.length > 0) { - return `Function(${name})`; - } else { - return 'Function'; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = '['; - if (length > 0) { - debug += debugString(val[0]); - } - for(let i = 1; i < length; i++) { - debug += ', ' + debugString(val[i]); - } - debug += ']'; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches.length > 1) { - className = builtInMatches[1]; - } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); - } - if (className == 'Object') { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return 'Object(' + JSON.stringify(val) + ')'; - } catch (_) { - return 'Object'; - } - } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; - } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; -} - -function makeMutClosure(arg0, arg1, dtor, f) { - const state = { a: arg0, b: arg1, cnt: 1, dtor }; - const real = (...args) => { - // First up with a closure we increment the internal reference - // count. This ensures that the Rust closure environment won't - // be deallocated while we're invoking it. - state.cnt++; - const a = state.a; - state.a = 0; - try { - return f(a, state.b, ...args); - } finally { - if (--state.cnt === 0) { - wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); - - } else { - state.a = a; - } - } - }; - real.original = state; - - return real; -} -function __wbg_adapter_28(arg0, arg1, arg2) { - wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__he8207c3660c09238(arg0, arg1, addHeapObject(arg2)); -} - -function __wbg_adapter_31(arg0, arg1) { - wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hf665a9151ca393f9(arg0, arg1); -} - -/** -* @param {string} auth_header -* @param {string} payload -* @param {string} client_identity -* @param {string} client_addr -* @param {boolean} enable_log -* @returns {Promise} -*/ -export function ext_run_keygen(auth_header, payload, client_identity, client_addr, enable_log) { - const ptr0 = passStringToWasm0(auth_header, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passStringToWasm0(payload, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - const ptr2 = passStringToWasm0(client_identity, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len2 = WASM_VECTOR_LEN; - const ptr3 = passStringToWasm0(client_addr, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len3 = WASM_VECTOR_LEN; - const ret = wasm.ext_run_keygen(ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3, enable_log); - return takeObject(ret); -} - -/** -* @param {string} auth_header -* @param {string} payload -* @param {string} local_key -* @param {string} client_identity -* @param {string} client_addr -* @param {boolean} enable_log -* @returns {Promise} -*/ -export function ext_run_sign(auth_header, payload, local_key, client_identity, client_addr, enable_log) { - const ptr0 = passStringToWasm0(auth_header, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passStringToWasm0(payload, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - const ptr2 = passStringToWasm0(local_key, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len2 = WASM_VECTOR_LEN; - const ptr3 = passStringToWasm0(client_identity, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len3 = WASM_VECTOR_LEN; - const ptr4 = passStringToWasm0(client_addr, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len4 = WASM_VECTOR_LEN; - const ret = wasm.ext_run_sign(ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3, ptr4, len4, enable_log); - return takeObject(ret); -} - -/** -* @param {string} auth_header -* @param {string} payload -* @param {string} client_identity -* @param {string} client_addr -* @param {boolean} enable_log -* @returns {Promise} -*/ -export function ext_run_key_refreh(auth_header, payload, client_identity, client_addr, enable_log) { - const ptr0 = passStringToWasm0(auth_header, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passStringToWasm0(payload, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - const ptr2 = passStringToWasm0(client_identity, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len2 = WASM_VECTOR_LEN; - const ptr3 = passStringToWasm0(client_addr, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len3 = WASM_VECTOR_LEN; - const ret = wasm.ext_run_key_refreh(ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3, enable_log); - return takeObject(ret); -} - -function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } -} - -function getArrayU8FromWasm0(ptr, len) { - return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); -} - -let cachedUint32Memory0 = null; - -function getUint32Memory0() { - if (cachedUint32Memory0 === null || cachedUint32Memory0.byteLength === 0) { - cachedUint32Memory0 = new Uint32Array(wasm.memory.buffer); - } - return cachedUint32Memory0; -} - -function passArrayJsValueToWasm0(array, malloc) { - const ptr = malloc(array.length * 4); - const mem = getUint32Memory0(); - for (let i = 0; i < array.length; i++) { - mem[ptr / 4 + i] = addHeapObject(array[i]); - } - WASM_VECTOR_LEN = array.length; - return ptr; -} -function __wbg_adapter_121(arg0, arg1, arg2, arg3) { - wasm.wasm_bindgen__convert__closures__invoke2_mut__he07b26b847afeaa7(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); -} - -async function load(module, imports) { - if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { - try { - return await WebAssembly.instantiateStreaming(module, imports); - - } catch (e) { - if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - - } else { - throw e; - } - } - } - - const bytes = await module.arrayBuffer(); - return await WebAssembly.instantiate(bytes, imports); - - } else { - const instance = await WebAssembly.instantiate(module, imports); - - if (instance instanceof WebAssembly.Instance) { - return { instance, module }; - - } else { - return instance; - } - } -} - -function getImports() { - const imports = {}; - imports.wbg = {}; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_cb_drop = function(arg0) { - const obj = takeObject(arg0).original; - if (obj.cnt-- == 1) { - obj.a = 0; - return true; - } - const ret = false; - return ret; - }; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; - imports.wbg.__wbg_new_abda76e883ba8a5f = function() { - const ret = new Error(); - return addHeapObject(ret); - }; - imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { - const ret = getObject(arg1).stack; - const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { - try { - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_free(arg0, arg1); - } - }; - imports.wbg.__wbg_dial_6157af8e109f4814 = function() { return handleError(function (arg0, arg1, arg2, arg3) { - const ret = getObject(arg0).dial(getStringFromWasm0(arg1, arg2), arg3 !== 0); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_listenon_907f6c6cc58cbbc8 = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).listen_on(getStringFromWasm0(arg1, arg2)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_read_3bccde29b650bec6 = function(arg0) { - const ret = getObject(arg0).read; - return addHeapObject(ret); - }; - imports.wbg.__wbg_newaddrs_c05d28600d5f5030 = function(arg0, arg1) { - const ret = getObject(arg1).new_addrs; - var ptr0 = isLikeNone(ret) ? 0 : passArrayJsValueToWasm0(ret, wasm.__wbindgen_malloc); - var len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbg_newconnections_b02386a63b08b62a = function(arg0, arg1) { - const ret = getObject(arg1).new_connections; - var ptr0 = isLikeNone(ret) ? 0 : passArrayJsValueToWasm0(ret, wasm.__wbindgen_malloc); - var len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); - }; - imports.wbg.__wbg_localaddr_2bc4cf8ea445e3e7 = function(arg0, arg1) { - const ret = getObject(arg1).local_addr; - const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbg_observedaddr_2c0b66939a03e8b3 = function(arg0, arg1) { - const ret = getObject(arg1).observed_addr; - const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbg_connection_c4e0c4566cdbca81 = function(arg0) { - const ret = getObject(arg0).connection; - return addHeapObject(ret); - }; - imports.wbg.__wbg_expiredaddrs_3b2f69ef969bb11b = function(arg0, arg1) { - const ret = getObject(arg1).expired_addrs; - var ptr0 = isLikeNone(ret) ? 0 : passArrayJsValueToWasm0(ret, wasm.__wbindgen_malloc); - var len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbindgen_is_null = function(arg0) { - const ret = getObject(arg0) === null; - return ret; - }; - imports.wbg.__wbg_write_6dbb849ac2bacadd = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).write(getArrayU8FromWasm0(arg1, arg2)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_shutdown_b944ceb37fcb76e7 = function() { return handleError(function (arg0) { - getObject(arg0).shutdown(); - }, arguments) }; - imports.wbg.__wbg_close_3f8619df73ed2cf0 = function(arg0) { - getObject(arg0).close(); - }; - imports.wbg.__wbindgen_string_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - var len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbg_websockettransport_df20a71d4a72a605 = function() { - const ret = websocket_transport(); - return addHeapObject(ret); - }; - imports.wbg.__wbg_clearTimeout_76877dbc010e786d = function(arg0) { - const ret = clearTimeout(takeObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_setTimeout_75cb9b6991a4031d = function() { return handleError(function (arg0, arg1) { - const ret = setTimeout(getObject(arg0), arg1); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_debug_7960d327fd96f71a = function(arg0, arg1, arg2, arg3) { - console.debug(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); - }; - imports.wbg.__wbg_error_fd84ca2a8a977774 = function(arg0, arg1, arg2, arg3) { - console.error(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); - }; - imports.wbg.__wbg_info_5566be377f5b52ae = function(arg0, arg1, arg2, arg3) { - console.info(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); - }; - imports.wbg.__wbg_log_7b690f184ae4519b = function(arg0, arg1, arg2, arg3) { - console.log(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); - }; - imports.wbg.__wbg_warn_48cbddced45e5414 = function(arg0, arg1, arg2, arg3) { - console.warn(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); - }; - imports.wbg.__wbg_now_c644db5194be8437 = function(arg0) { - const ret = getObject(arg0).now(); - return ret; - }; - imports.wbg.__wbg_randomFillSync_6894564c2c334c42 = function() { return handleError(function (arg0, arg1, arg2) { - getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); - }, arguments) }; - imports.wbg.__wbg_getRandomValues_805f1c3d65988a5a = function() { return handleError(function (arg0, arg1) { - getObject(arg0).getRandomValues(getObject(arg1)); - }, arguments) }; - imports.wbg.__wbg_crypto_e1d53a1d73fb10b8 = function(arg0) { - const ret = getObject(arg0).crypto; - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_is_object = function(arg0) { - const val = getObject(arg0); - const ret = typeof(val) === 'object' && val !== null; - return ret; - }; - imports.wbg.__wbg_process_038c26bf42b093f8 = function(arg0) { - const ret = getObject(arg0).process; - return addHeapObject(ret); - }; - imports.wbg.__wbg_versions_ab37218d2f0b24a8 = function(arg0) { - const ret = getObject(arg0).versions; - return addHeapObject(ret); - }; - imports.wbg.__wbg_node_080f4b19d15bc1fe = function(arg0) { - const ret = getObject(arg0).node; - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_is_string = function(arg0) { - const ret = typeof(getObject(arg0)) === 'string'; - return ret; - }; - imports.wbg.__wbg_msCrypto_6e7d3e1f92610cbb = function(arg0) { - const ret = getObject(arg0).msCrypto; - return addHeapObject(ret); - }; - imports.wbg.__wbg_require_78a3dcfbdba9cbce = function() { return handleError(function () { - const ret = module.require; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbindgen_is_function = function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; - return ret; - }; - imports.wbg.__wbg_newnoargs_2b8b6bd7753c76ba = function(arg0, arg1) { - const ret = new Function(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_next_88560ec06a094dea = function() { return handleError(function (arg0) { - const ret = getObject(arg0).next(); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_done_1ebec03bbd919843 = function(arg0) { - const ret = getObject(arg0).done; - return ret; - }; - imports.wbg.__wbg_value_6ac8da5cc5b3efda = function(arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); - }; - imports.wbg.__wbg_get_baf4855f9a986186 = function() { return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_call_95d1ea488d03e4e8 = function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_self_e7c1f827057f6584 = function() { return handleError(function () { - const ret = self.self; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_window_a09ec664e14b1b81 = function() { return handleError(function () { - const ret = window.window; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_globalThis_87cbb8506fecf3a9 = function() { return handleError(function () { - const ret = globalThis.globalThis; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_global_c85a9259e621f3db = function() { return handleError(function () { - const ret = global.global; - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbindgen_is_undefined = function(arg0) { - const ret = getObject(arg0) === undefined; - return ret; - }; - imports.wbg.__wbg_instanceof_Error_749a7378f4439ee0 = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Error; - } catch { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbg_message_a95c3ef248e4b57a = function(arg0) { - const ret = getObject(arg0).message; - return addHeapObject(ret); - }; - imports.wbg.__wbg_name_c69a20c4b1197dc0 = function(arg0) { - const ret = getObject(arg0).name; - return addHeapObject(ret); - }; - imports.wbg.__wbg_call_9495de66fdbe016b = function() { return handleError(function (arg0, arg1, arg2) { - const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_instanceof_Object_f5a826c4da0d4a94 = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Object; - } catch { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbg_toString_8c529acfe543ce16 = function(arg0) { - const ret = getObject(arg0).toString(); - return addHeapObject(ret); - }; - imports.wbg.__wbg_new_9d3a9ce4282a18a8 = function(arg0, arg1) { - try { - var state0 = {a: arg0, b: arg1}; - var cb0 = (arg0, arg1) => { - const a = state0.a; - state0.a = 0; - try { - return __wbg_adapter_121(a, state0.b, arg0, arg1); - } finally { - state0.a = a; - } - }; - const ret = new Promise(cb0); - return addHeapObject(ret); - } finally { - state0.a = state0.b = 0; - } - }; - imports.wbg.__wbg_resolve_fd40f858d9db1a04 = function(arg0) { - const ret = Promise.resolve(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_then_ec5db6d509eb475f = function(arg0, arg1) { - const ret = getObject(arg0).then(getObject(arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_then_f753623316e2873a = function(arg0, arg1, arg2) { - const ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_buffer_cf65c07de34b9a08 = function(arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); - }; - imports.wbg.__wbg_new_537b7341ce90bb31 = function(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_17499e8aa4003ebd = function(arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); - }; - imports.wbg.__wbg_length_27a2afe8ab42b09f = function(arg0) { - const ret = getObject(arg0).length; - return ret; - }; - imports.wbg.__wbg_newwithlength_b56c882b57805732 = function(arg0) { - const ret = new Uint8Array(arg0 >>> 0); - return addHeapObject(ret); - }; - imports.wbg.__wbg_subarray_7526649b91a252a6 = function(arg0, arg1, arg2) { - const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len0 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len0; - getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }; - imports.wbg.__wbindgen_throw = function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }; - imports.wbg.__wbindgen_memory = function() { - const ret = wasm.memory; - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_closure_wrapper1806 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 693, __wbg_adapter_28); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_closure_wrapper1997 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 788, __wbg_adapter_31); - return addHeapObject(ret); - }; - - return imports; -} - -function initMemory(imports, maybe_memory) { - -} - -function finalizeInit(instance, module) { - wasm = instance.exports; - init.__wbindgen_wasm_module = module; - cachedInt32Memory0 = null; - cachedUint32Memory0 = null; - cachedUint8Memory0 = null; - - - return wasm; -} - -function initSync(module) { - const imports = getImports(); - - initMemory(imports); - - if (!(module instanceof WebAssembly.Module)) { - module = new WebAssembly.Module(module); - } - - const instance = new WebAssembly.Instance(module, imports); - - return finalizeInit(instance, module); -} - -async function init(input) { - if (typeof input === 'undefined') { - input = new URL('skw_mpc_wasm_bg.wasm', import.meta.url); - } - const imports = getImports(); - - if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { - input = fetch(input); - } - - initMemory(imports); - - const { instance, module } = await load(await input, imports); - - return finalizeInit(instance, module); -} - -export { initSync } -export default init; diff --git a/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm_opt.wasm b/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm_opt.wasm deleted file mode 100644 index 3932748..0000000 Binary files a/crates/skw-mpc-wasm/build-wasm/skw_mpc_wasm_opt.wasm and /dev/null differ diff --git a/crates/skw-mpc-wasm/build-wasm/snippets/libp2p-wasm-ext-2e7aa19fa5e25979/src/websockets.js b/crates/skw-mpc-wasm/build-wasm/snippets/libp2p-wasm-ext-2e7aa19fa5e25979/src/websockets.js deleted file mode 100644 index 1ef2faf..0000000 --- a/crates/skw-mpc-wasm/build-wasm/snippets/libp2p-wasm-ext-2e7aa19fa5e25979/src/websockets.js +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2020 Parity Technologies (UK) Ltd. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. - -export const websocket_transport = () => { - return { - dial: dial, - listen_on: (addr) => { - let err = new Error("Listening on WebSockets is not possible from within a browser"); - err.name = "NotSupportedError"; - throw err; - }, - }; -} - -/// Turns a string multiaddress into a WebSockets string URL. -const multiaddr_to_ws = (addr) => { - let parsed = addr.match(/^\/(ip4|ip6|dns4|dns6|dns)\/(.*?)\/tcp\/(.*?)\/(ws|wss|x-parity-ws\/(.*)|x-parity-wss\/(.*))(|\/p2p\/[a-zA-Z0-9]+)$/); - if (parsed != null) { - let proto = 'wss'; - if (parsed[4] == 'ws' || parsed[4].startsWith('x-parity-ws/')) { - proto = 'ws'; - } - let url = decodeURIComponent(parsed[5] || parsed[6] || ''); - if (parsed[1] == 'ip6') { - return proto + "://[" + parsed[2] + "]:" + parsed[3] + url; - } else { - return proto + "://" + parsed[2] + ":" + parsed[3] + url; - } - } - - let err = new Error("Address not supported: " + addr); - err.name = "NotSupportedError"; - throw err; -} - -// Attempt to dial a multiaddress. -const dial = (addr) => { - let ws = new WebSocket(multiaddr_to_ws(addr)); - ws.binaryType = "arraybuffer"; - let reader = read_queue(); - - return new Promise((open_resolve, open_reject) => { - ws.onerror = (ev) => { - // If `open_resolve` has been called earlier, calling `open_reject` seems to be - // silently ignored. It is easier to unconditionally call `open_reject` rather than - // check in which state the connection is, which would be error-prone. - open_reject(ev); - // Injecting an EOF is how we report to the reading side that the connection has been - // closed. Injecting multiple EOFs is harmless. - reader.inject_eof(); - }; - ws.onclose = (ev) => { - // Same remarks as above. - open_reject(ev); - reader.inject_eof(); - }; - - // We inject all incoming messages into the queue unconditionally. The caller isn't - // supposed to access this queue unless the connection is open. - ws.onmessage = (ev) => reader.inject_array_buffer(ev.data); - - ws.onopen = () => open_resolve({ - read: (function*() { while(ws.readyState == 1) { yield reader.next(); } })(), - write: (data) => { - if (ws.readyState == 1) { - // The passed in `data` is an `ArrayBufferView` [0]. If the - // underlying typed array is a `SharedArrayBuffer` (when - // using WASM threads, so multiple web workers sharing - // memory) the WebSocket's `send` method errors [1][2][3]. - // This limitation will probably be lifted in the future, - // but for now we have to make a copy here .. - // - // [0]: https://developer.mozilla.org/en-US/docs/Web/API/ArrayBufferView - // [1]: https://chromium.googlesource.com/chromium/src/+/1438f63f369fed3766fa5031e7a252c986c69be6%5E%21/ - // [2]: https://bugreports.qt.io/browse/QTBUG-78078 - // [3]: https://chromium.googlesource.com/chromium/src/+/HEAD/third_party/blink/renderer/bindings/IDLExtendedAttributes.md#AllowShared_p - ws.send(data.slice(0)); - return promise_when_send_finished(ws); - } else { - return Promise.reject("WebSocket is closed"); - } - }, - shutdown: () => ws.close(), - close: () => {} - }); - }); -} - -// Takes a WebSocket object and returns a Promise that resolves when bufferedAmount is low enough -// to allow more data to be sent. -const promise_when_send_finished = (ws) => { - return new Promise((resolve, reject) => { - function check() { - if (ws.readyState != 1) { - reject("WebSocket is closed"); - return; - } - - // We put an arbitrary threshold of 8 kiB of buffered data. - if (ws.bufferedAmount < 8 * 1024) { - resolve(); - } else { - setTimeout(check, 100); - } - } - - check(); - }) -} - -// Creates a queue reading system. -const read_queue = () => { - // State of the queue. - let state = { - // Array of promises resolving to `ArrayBuffer`s, that haven't been transmitted back with - // `next` yet. - queue: new Array(), - // If `resolve` isn't null, it is a "resolve" function of a promise that has already been - // returned by `next`. It should be called with some data. - resolve: null, - }; - - return { - // Inserts a new Blob in the queue. - inject_array_buffer: (buffer) => { - if (state.resolve != null) { - state.resolve(buffer); - state.resolve = null; - } else { - state.queue.push(Promise.resolve(buffer)); - } - }, - - // Inserts an EOF message in the queue. - inject_eof: () => { - if (state.resolve != null) { - state.resolve(null); - state.resolve = null; - } else { - state.queue.push(Promise.resolve(null)); - } - }, - - // Returns a Promise that yields the next entry as an ArrayBuffer. - next: () => { - if (state.queue.length != 0) { - return state.queue.shift(0); - } else { - if (state.resolve !== null) - throw "Internal error: already have a pending promise"; - return new Promise((resolve, reject) => { - state.resolve = resolve; - }); - } - } - }; -}; diff --git a/crates/skw-mpc-wasm/package.json b/crates/skw-mpc-wasm/package.json deleted file mode 100644 index 8b08e48..0000000 --- a/crates/skw-mpc-wasm/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "scripts": { - "build": "webpack", - "serve" : "webpack serve" - }, - "devDependencies": { - "@wasm-tool/wasm-pack-plugin": "1.5.0", - "text-encoding": "^0.7.0", - "html-webpack-plugin": "^5.3.2", - "webpack": "^5.49.0", - "webpack-cli": "^4.7.2", - "webpack-dev-server": "^3.11.2" - } -} diff --git a/crates/skw-mpc-wasm/src/lib.rs b/crates/skw-mpc-wasm/src/lib.rs deleted file mode 100644 index ca2148e..0000000 --- a/crates/skw-mpc-wasm/src/lib.rs +++ /dev/null @@ -1,125 +0,0 @@ -#![cfg(target_arch = "wasm32")] - -use skw_mpc_client::{swarm::{new_swarm_node, MpcP2pRequest}, async_executor}; -use wasm_bindgen::prelude::*; -use skw_mpc_payload::{PayloadHeader, AuthHeader}; -use std::panic; - -use futures::sink::SinkExt; - -#[wasm_bindgen] -pub async fn ext_run_keygen(auth_header: &str, payload: &str, client_identity: &str, client_addr: &str, enable_log: bool) -> String { - panic::set_hook(Box::new(console_error_panic_hook::hook)); - if enable_log { - console_log::init_with_level(log::Level::Debug); - } - - let request: PayloadHeader = serde_json::from_str(payload).unwrap(); - let auth_header: AuthHeader = serde_json::from_str(auth_header).unwrap(); - let ( _, mut client, event_loop, mut shutdown_handler) = new_swarm_node( None ); - async_executor(event_loop.run()); - - let client_node = ( - client_identity.parse().unwrap(), - client_addr.parse().unwrap() - ); - - client - .dial(client_node.0, client_node.1) - .await - .unwrap(); - - let res = client - .send_request( - client_node.0, - MpcP2pRequest::Mpc { - auth_header, - job_header: request, - maybe_local_key: None, - } - ).await; - shutdown_handler.send(()).await; - - match res.unwrap().payload() { - Ok(payload) => String::from_utf8(payload).unwrap(), - Err(e) => format!("Node Returns Error {:?}", e) - } -} - -#[wasm_bindgen] -pub async fn ext_run_sign(auth_header: &str, payload: &str, local_key: &str, client_identity: &str, client_addr: &str, enable_log: bool) -> String { - panic::set_hook(Box::new(console_error_panic_hook::hook)); - console_log::init_with_level(log::Level::Debug); - - let request: PayloadHeader = serde_json::from_str(payload).unwrap(); - let auth_header: AuthHeader = serde_json::from_str(auth_header).unwrap(); - let local_key = local_key.as_bytes(); - - let ( _, mut client, event_loop, mut shutdown_handler) = new_swarm_node( None ); - async_executor(event_loop.run()); - - let client_node = ( - client_identity.parse().unwrap(), - client_addr.parse().unwrap() - ); - - client - .dial(client_node.0, client_node.1) - .await - .unwrap(); - - let res = client - .send_request( - client_node.0, - MpcP2pRequest::Mpc { - auth_header, - job_header: request, - maybe_local_key: Some(local_key.to_vec()), - } - ).await; - - shutdown_handler.send(()).await; - match res.unwrap().payload() { - Ok(payload) => String::from_utf8(payload).unwrap(), - Err(e) => format!("Node Returns Error {:?}", e) - } -} - - -#[wasm_bindgen] -pub async fn ext_run_key_refreh(auth_header: &str, payload: &str, client_identity: &str, client_addr: &str, enable_log: bool) -> String { - panic::set_hook(Box::new(console_error_panic_hook::hook)); - console_log::init_with_level(log::Level::Debug); - - let request: PayloadHeader = serde_json::from_str(payload).unwrap(); - let auth_header: AuthHeader = serde_json::from_str(auth_header).unwrap(); - - let ( _, mut client, event_loop, mut shutdown_handler) = new_swarm_node( None ); - async_executor(event_loop.run()); - - let client_node = ( - client_identity.parse().unwrap(), - client_addr.parse().unwrap() - ); - - client - .dial(client_node.0, client_node.1) - .await - .unwrap(); - - let res = client - .send_request( - client_node.0, - MpcP2pRequest::Mpc { - auth_header, - job_header: request, - maybe_local_key: None, - } - ).await; - - shutdown_handler.send(()).await; - match res.unwrap().payload() { - Ok(payload) => String::from_utf8(payload).unwrap(), - Err(e) => format!("Node Returns Error {:?}", e) - } -} diff --git a/crates/skw-mpc-wasm/webpack.config.js b/crates/skw-mpc-wasm/webpack.config.js deleted file mode 100644 index 0e3fcd8..0000000 --- a/crates/skw-mpc-wasm/webpack.config.js +++ /dev/null @@ -1,28 +0,0 @@ -const path = require('path'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const webpack = require('webpack'); -const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); - -module.exports = { - entry: './index.js', - output: { - path: path.resolve(__dirname, 'dist'), - filename: 'index.js', - }, - plugins: [ - new HtmlWebpackPlugin(), - new WasmPackPlugin({ - crateDirectory: path.resolve(__dirname, ".") - }), - // Have this example work in Edge which doesn't ship `TextEncoder` or - // `TextDecoder` at this time. - new webpack.ProvidePlugin({ - TextDecoder: ['text-encoding', 'TextDecoder'], - TextEncoder: ['text-encoding', 'TextEncoder'] - }) - ], - mode: 'development', - experiments: { - asyncWebAssembly: true - } -}; diff --git a/crates/skw-mpc-wasm/yarn.lock b/crates/skw-mpc-wasm/yarn.lock deleted file mode 100644 index 57cd93b..0000000 --- a/crates/skw-mpc-wasm/yarn.lock +++ /dev/null @@ -1,3382 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.21.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.0.tgz#21724cfe12b96696feafab05829695d4d7bd7c48" - integrity sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/json-schema@*", "@types/json-schema@^7.0.8": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/node@*": - version "18.13.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" - integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== - -"@wasm-tool/wasm-pack-plugin@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@wasm-tool/wasm-pack-plugin/-/wasm-pack-plugin-1.5.0.tgz#cb3a363321a326594730e496d68e7e9a0199f42c" - integrity sha512-qsGJ953zrXZdXW58cfYOh2nBXp0SYBsFhkxqh9p4JK8cXllEzHeRXoVO+qtgEB31+s1tsL8eda3Uy97W/7yOAg== - dependencies: - chalk "^2.4.1" - command-exists "^1.2.7" - watchpack "^2.1.1" - which "^2.0.2" - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" - integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== - -"@webpack-cli/info@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" - integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" - integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn@^8.5.0, acorn@^8.7.1: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.1.0, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-html-community@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -async-each@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" - integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg== - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -browserslist@^4.14.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001449: - version "1.0.30001451" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz#2e197c698fc1373d63e1406d6607ea4617c613f1" - integrity sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w== - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-css@^5.2.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -colorette@^2.0.14: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -command-exists@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" - -define-properties@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ== - dependencies: - buffer-indexof "^1.0.0" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.284: - version "1.4.290" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.290.tgz#62ddde1ea2db0dc31b6fe5898911fc85b83977fb" - integrity sha512-3uIkNYprKqAixFqANvs7K3zacGz6iVIMcGG1M/7hMn6Gvzxe52Xg//wRUds7GPv2uouF7EZ4Sh51fLDw+aBkHw== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -errno@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -eventsource@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" - integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -express@^4.17.1: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fastest-levenshtein@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -faye-websocket@^0.11.3, faye-websocket@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -follow-redirects@^1.0.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.0.3, glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-webpack-plugin@^5.3.2: - version "5.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== - dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" - -http-proxy@^1.17.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== - -ip@^1.1.0, ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loglevel@^1.6.8: - version "1.8.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" - integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1, mkdirp@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ== - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -nan@^2.12.1: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== - dependencies: - retry "^0.12.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -portfinder@^1.0.26: - version "1.0.32" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" - integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== - dependencies: - async "^2.6.4" - debug "^3.2.7" - mkdirp "^0.5.6" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^2.0.1, readable-stream@^2.0.2: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.2.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg== - dependencies: - resolve-from "^3.0.0" - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@^1.9.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== - -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^1.10.8: - version "1.10.14" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" - integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== - dependencies: - node-forge "^0.10.0" - -semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sockjs-client@^1.5.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.1.tgz#350b8eda42d6d52ddc030c39943364c11dcad806" - integrity sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw== - dependencies: - debug "^3.2.7" - eventsource "^2.0.2" - faye-websocket "^0.11.4" - inherits "^2.0.4" - url-parse "^1.5.10" - -sockjs@^0.3.21: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.1.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.14" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" - -terser@^5.10.0, terser@^5.14.1: - version "5.16.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.3.tgz#3266017a9b682edfe019b8ecddd2abaae7b39c6b" - integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-encoding@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.7.0.tgz#f895e836e45990624086601798ea98e8f36ee643" - integrity sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tslib@^2.0.3: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -url-parse@^1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -watchpack@^2.1.1, watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -webpack-cli@^4.7.2: - version "4.10.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" - integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.2.0" - "@webpack-cli/info" "^1.5.0" - "@webpack-cli/serve" "^1.7.0" - colorette "^2.0.14" - commander "^7.0.0" - cross-spawn "^7.0.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@^3.7.2: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@^3.11.2: - version "3.11.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3" - integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA== - dependencies: - ansi-html-community "0.0.8" - bonjour "^3.5.0" - chokidar "^2.1.8" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.3.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.8" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.26" - schema-utils "^1.0.0" - selfsigned "^1.10.8" - semver "^6.3.0" - serve-index "^1.9.1" - sockjs "^0.3.21" - sockjs-client "^1.5.0" - spdy "^4.0.2" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "^13.3.2" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.49.0: - version "5.75.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" diff --git a/scripts/start-all.cjs b/scripts/start-all.cjs index bc2c0f0..91bc01a 100644 --- a/scripts/start-all.cjs +++ b/scripts/start-all.cjs @@ -32,9 +32,9 @@ function startAll() { // Mprocs land execSync(`mprocs \ - "RUST_LOG=debug cargo run -p skw-mpc-node-bin --release" \ - "RUST_LOG=debug cargo run -p skw-mpc-client-bin --release" \ - "RUST_LOG=debug cargo run -p skw-auth-service --release" + "RUST_LOG=info cargo run -p skw-mpc-node-bin --release" \ + "RUST_LOG=info cargo run -p skw-mpc-client-bin --release" \ + "RUST_LOG=info cargo run -p skw-auth-service --release" `); } diff --git a/bin/skw-auth-service/Cargo.toml b/src/bin/skw-auth-service/Cargo.toml similarity index 84% rename from bin/skw-auth-service/Cargo.toml rename to src/bin/skw-auth-service/Cargo.toml index c57bb1f..b9c16d1 100644 --- a/bin/skw-auth-service/Cargo.toml +++ b/src/bin/skw-auth-service/Cargo.toml @@ -6,7 +6,9 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -skw-mpc-storage = { path="../../crates/skw-mpc-storage", features = ["leveldb-backend"]} +skw-mpc-storage = { path="../../storage/skw-mpc-storage" } +skw-mpc-leveldb = { path="../../storage/skw-mpc-leveldb" } + skw-mpc-auth = { path="../../crates/skw-mpc-auth" } async-std = { version = "1.6.0", features = ["attributes", "tokio1"] } diff --git a/bin/skw-auth-service/README.md b/src/bin/skw-auth-service/README.md similarity index 100% rename from bin/skw-auth-service/README.md rename to src/bin/skw-auth-service/README.md diff --git a/bin/skw-auth-service/src/env.rs b/src/bin/skw-auth-service/src/env.rs similarity index 92% rename from bin/skw-auth-service/src/env.rs rename to src/bin/skw-auth-service/src/env.rs index 7af6c79..366f56d 100644 --- a/bin/skw-auth-service/src/env.rs +++ b/src/bin/skw-auth-service/src/env.rs @@ -40,7 +40,6 @@ pub struct PeerIds { f1: String, f2: String, l: String, - c: String, } impl PeerIds { @@ -51,10 +50,9 @@ impl PeerIds { let f1 = std::env::var("FULL_NODE1_ID").expect("FULL_NODE1_ID peer id in env"); let f2= std::env::var("FULL_NODE2_ID").expect("FULL_NODE2_ID peer id in env"); let l = std::env::var("LIGHT_NODE_ID").expect("LIGHT_NODE_ID peer id in env"); - let c = std::env::var("CLIENT_NODE_ID").expect("CLIENT_NODE_ID peer id in env"); Self { - f1, f2, l, c, + f1, f2, l, } } } \ No newline at end of file diff --git a/bin/skw-auth-service/src/lib.rs b/src/bin/skw-auth-service/src/lib.rs similarity index 100% rename from bin/skw-auth-service/src/lib.rs rename to src/bin/skw-auth-service/src/lib.rs diff --git a/bin/skw-auth-service/src/main.rs b/src/bin/skw-auth-service/src/main.rs similarity index 97% rename from bin/skw-auth-service/src/main.rs rename to src/bin/skw-auth-service/src/main.rs index 5476575..dbb04c8 100644 --- a/bin/skw-auth-service/src/main.rs +++ b/src/bin/skw-auth-service/src/main.rs @@ -6,7 +6,7 @@ use skw_auth_service::{ routes::misc::peer_ids, shutdown_db, // routes::usage::{usage_link, usage_validate}, shutdown_db }; -use skw_mpc_storage::{run_db_server, default_mpc_storage_opt}; +use skw_mpc_leveldb::{run_db_server, default_mpc_storage_opt}; use tide::{utils::{After}, Response, StatusCode, http::headers::HeaderValue}; use tide::security::{CorsMiddleware, Origin}; diff --git a/bin/skw-auth-service/src/routes/email.rs b/src/bin/skw-auth-service/src/routes/email.rs similarity index 100% rename from bin/skw-auth-service/src/routes/email.rs rename to src/bin/skw-auth-service/src/routes/email.rs diff --git a/bin/skw-auth-service/src/routes/ga.rs b/src/bin/skw-auth-service/src/routes/ga.rs similarity index 100% rename from bin/skw-auth-service/src/routes/ga.rs rename to src/bin/skw-auth-service/src/routes/ga.rs diff --git a/bin/skw-auth-service/src/routes/misc.rs b/src/bin/skw-auth-service/src/routes/misc.rs similarity index 100% rename from bin/skw-auth-service/src/routes/misc.rs rename to src/bin/skw-auth-service/src/routes/misc.rs diff --git a/bin/skw-auth-service/src/routes/mod.rs b/src/bin/skw-auth-service/src/routes/mod.rs similarity index 100% rename from bin/skw-auth-service/src/routes/mod.rs rename to src/bin/skw-auth-service/src/routes/mod.rs diff --git a/bin/skw-auth-service/src/routes/oauth.rs b/src/bin/skw-auth-service/src/routes/oauth.rs similarity index 100% rename from bin/skw-auth-service/src/routes/oauth.rs rename to src/bin/skw-auth-service/src/routes/oauth.rs diff --git a/bin/skw-auth-service/src/routes/usage.rs b/src/bin/skw-auth-service/src/routes/usage.rs similarity index 100% rename from bin/skw-auth-service/src/routes/usage.rs rename to src/bin/skw-auth-service/src/routes/usage.rs diff --git a/bin/skw-auth-service/src/util.rs b/src/bin/skw-auth-service/src/util.rs similarity index 100% rename from bin/skw-auth-service/src/util.rs rename to src/bin/skw-auth-service/src/util.rs diff --git a/src/bin/skw-mpc-client-bin/Cargo.toml b/src/bin/skw-mpc-client-bin/Cargo.toml new file mode 100644 index 0000000..04db3f1 --- /dev/null +++ b/src/bin/skw-mpc-client-bin/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "skw-mpc-client-bin" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +skw-mpc-auth = { path="../../crates/skw-mpc-auth" } +skw-mpc-node = { path="../../crates/skw-mpc-node" } +skw-mpc-payload = { path="../../crates/skw-mpc-payload" } + +skw-mpc-light-node = { path="../../light-node/skw-mpc-light-node" } + +tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } +serde-hex = "0.1.0" +async-std = { version = "1.6.0", features = ["attributes", "tokio1"] } +futures = "0.3.25" +serde = { version = "1.0", features = ["derive"] } +tide = "0.16.0" +serde_json = "1.0.91" +rand = "0.8.5" +hmac-sha1 = "0.1.3" +blake2 = "0.10.6" +http = "0.2.8" +reqwest = { version = "0.11.14", features = ["json"] } +dotenv = "0.15.0" +hex = "0.4.3" +env_logger = "0.10.0" +log = "0.4.17" + +[[bin]] +name = "skw-mpc-client-bin" \ No newline at end of file diff --git a/src/bin/skw-mpc-client-bin/README.md b/src/bin/skw-mpc-client-bin/README.md new file mode 100644 index 0000000..f8eefca --- /dev/null +++ b/src/bin/skw-mpc-client-bin/README.md @@ -0,0 +1,57 @@ +## MPC Auth Service + +This codebase is to provide the authentication service + +## Core Crates +|License|Crate Name|Description|Status|WASM Ready?| +|---|---|---|---|---| +|GPLv3|`crates/skw-mpc-auth`|authentication header implementing the Google Authenticator standard. |Beta|Yes| +|GPLv3|`crates/skw-mpc-client`|client side p2p node used decentralizedly relay requests to nodes.|Internal Alpha|Partially| +|GPLv3|`crates/skw-mpc-node`|p2p node runs on async runtime that handles MPC requests |Internal Alpha|No| +|GPLv3|`crates/skw-mpc-protocol`|cryptographic implementation of the mpc protocol. Partially ported from ZenGoX|Beta|N/A| +|Apache 2.0 OR GPLv3|`crates/skw-mpc-payload`|payload wrapper for messages on wire. |Beta|Yes| +|GPLv3|`crates/skw-mpc-storage`|Async levelDB wrapper|Beta|No| +|GPLv3|`crates/skw-mpc-wasm`|wasm-bindgen wrapper for mpc client|Early Internal Alpha|Yes| +|GPLv3|`crates/skw-round-based`|Async runtime for protocols with multiple rounds of communication. |Ported From ZenGoX|N/A| + + +## Crypto Crates + +|License|Crate Name|Description|Changes|Status|WASM Ready?| +|---|---|---|---|---|---| +|GPLv3|`crypto/skw-crypto-bulletproofs`|See crate README for details. Implements RangeProof with Bulletproof.|Only keep the core RangeProof impl|Ported from ZenGoX|Yes| +|GPLv3|`crypto/skw-crypto-centipede`|See crate README for details. Simple key generation schema.|Almost unchanged.|Ported from ZenGoX|Yes| +|MIT|`crypto/skw-crypto-curv`|See crate README for details. ecc base lib.|Allow conditional compilation for different curves|Ported from ZenGoX|Yes| +|MIT OR Apache2.0|`crypto/skw-crypto-paillier`|See crate README for details. implements the paillier cryptosystem.|Almost unchagned|Ported from ZenGoX|Yes| +|GPLv3|`crypto/skw-crypto-zk-paillier`|See crate README for details. Some zero-knolwedge proof in the paillier cryptosystem.|removed everything besides CorrectKey proof and DLogProof.|Ported from ZenGoX|Yes| + +## Test Deployment Sequencing + +**Step 1:** Bootstrap 2 Fullnodes +`cargo run -p skw-mpc-node --example node-full-node --release --features="full-node tcp-ws-transport" --no-default-features`. will boostrap two nodes that listen to: `/ip4/10.0.0.3/tcp/2620/ws` and `/ip4/10.0.0.3/tcp/2621/ws` with predefined keys `[0u8; 32]` and `[1u8; 32]`. You can change the configuration from `crates/skw-mpc-node/examples/node_full.rs` + +**Step 2 Standalone**: You can bootstrap a client node directly without any client request relay node by `cargo run -p skw-mpc-node --example node-light-node --release --features="light-node tcp-ws-transport" --no-default-features` which will bootstrap a `light-node` that communicates with the two full node spawned from Step 1. Later, the light node starts a `KeyGen` request. Upon receiving outcome from the `KeyGen` response, it will submit `Signing` request to sign a sample hash `[2u8; 32]` and respond the resulting signature. + +**Step 2 With WebSocket Relay**: You can bootstrap a WebSocket server that wrap a `MPC Node light-node` within. Please note that this can be confusing as the `light-node` of the `mpc node` is wrapped within the `full-node` of the client node. The subsequent `light-node-client` is a request-only interface that won't be listen on any ports. + +**Step 3 With WebSocket Relay**: Run `cargo run -p skw-mpc-client --example node-full-client --release --features="full-node tcp-ws-transport" --no-default-features` to initiate a full client node that relay request to a Mpc light node. + +**Step 4 With WebSocket Relay**, With Wasm Runtime: inside the `crates/skw-mpc-wasm` and config accordingly to send or receive request in a browser. + +**Step 4 With WebSocket Relay**, Without Wasm Runtime: Run `cargo run -p skw-mpc-client --example node-light-client --release --features="light-node tcp-ws-transport" --no-default-features` to run a request client node. It will send a `KeyGen` request and a `Signing` request to message hash `[2u8; 32]`. + + +## For M1/M2 Mac Users + +Ref to this on [StackExchange](https://substrate.stackexchange.com/questions/1098/how-to-use-sp-core-in-libraries-that-target-wasm-for-the-web?rq=1). + + +Attach `PATH="/opt/homebrew/opt/llvm/bin:$PATH" CC=/opt/homebrew/opt/llvm/bin/clang AR=/opt/homebrew/opt/llvm/bin/llvm-ar` before your cargo command. + +## License + +Refer to the crate list for details. Most of the codebase is licensed under GPLv3.0 with some exceptions to ported crates. + + +Please [contact us](https://skye.kiwi) if you have questions about +the licensing of our products. diff --git a/src/bin/skw-mpc-client-bin/src/lib.rs b/src/bin/skw-mpc-client-bin/src/lib.rs new file mode 100644 index 0000000..20ee236 --- /dev/null +++ b/src/bin/skw-mpc-client-bin/src/lib.rs @@ -0,0 +1,13 @@ +pub mod routes; +use skw_mpc_light_node::client::NodeClient; + +#[derive(Clone)] +pub struct ServerState { + light_node: NodeClient +} + +impl ServerState { + pub fn new(light_node: NodeClient) -> Self { + Self { light_node } + } +} \ No newline at end of file diff --git a/src/bin/skw-mpc-client-bin/src/main.rs b/src/bin/skw-mpc-client-bin/src/main.rs new file mode 100644 index 0000000..4c88c1e --- /dev/null +++ b/src/bin/skw-mpc-client-bin/src/main.rs @@ -0,0 +1,89 @@ +use std::{fs, io::Write}; + +use futures::{channel::mpsc, StreamExt}; +use skw_mpc_client_bin::{ + ServerState, + routes::misc::status_check, + routes::mpc::mpc_submit, +}; + +use skw_mpc_light_node::{light_node_event_loop, client::NodeClient}; +use skw_mpc_node::async_executor; +use tide::{utils::{After}, Response, StatusCode, http::headers::HeaderValue}; +use tide::security::{CorsMiddleware, Origin}; + +#[tokio::main] +async fn main() { + + // --- Initialize environmental variables and settings --- + dotenv::dotenv().ok(); + env_logger::init(); + + // --- Start A Light Node --- + let (client_request_sender, client_request_receiver) = mpsc::channel(0); + async_executor(light_node_event_loop(client_request_receiver)); + let mut light_node_client = NodeClient::new(client_request_sender); + + let mut light_client_node_res = light_node_client + .bootstrap_node( + Some([3u8; 32]), + "/ip4/127.0.0.1/tcp/2622/ws".to_string(), + "mpc-storage-db-12D3KooWK99VoVxNE7XzyBwXEzW7xhK7Gpv85r9F3V3fyKSUKPH5".to_string() + ).await; + let peer_id = light_node_client.peer_id(); + + let env_file_node1 = format!("LIGHT_NODE_ID = {}\n", peer_id.to_string()); + + let mut file = fs::OpenOptions::new() + .append(true) + .open("./.env.peers") + .expect("able to open a file"); + + file.write_all(env_file_node1.as_bytes()).expect("able to write"); + + log::info!("Peer Id written to .env.peers"); + + async_executor(async move { + loop { + let res = light_client_node_res.select_next_some().await; + log::error!("Node encounter error {:?}", res); + } + }); + + // --- Start web server --- + let state = ServerState::new(light_node_client); + let mut app = tide::with_state(state); + + app.with( + CorsMiddleware::new() + .allow_methods("GET, POST, OPTIONS".parse::().unwrap()) + .allow_origin(Origin::from("*")) + .allow_credentials(false) + ); + app.with(After(|mut res: Response | async { + if let Some(err) = res.error() { + let msg = format!("Error: {:?}", err); + log::error!("Req Error {msg}"); + res.set_status(StatusCode::Ok); + res.set_body(msg); + } + + Ok(res) + })); + + app.at("/info/status").get(status_check); + app.at("/mpc/submit").post(mpc_submit); + // app.at("/usage/link").post(usage_link); + // app.at("/usage/validate").post(usage_validate); + + log::info!("Start listening web server..."); + let _ = app.listen("0.0.0.0:2619").await; + + + // --- Gracefully close the web server --- + log::info!("Web server closed."); + // Shutdown level db + // shutdown_db(storage_in_sender).await.expect("db should be able to close successfully"); + log::info!("Level DB server closed."); + +} diff --git a/src/bin/skw-mpc-client-bin/src/routes/misc.rs b/src/bin/skw-mpc-client-bin/src/routes/misc.rs new file mode 100644 index 0000000..83f8cca --- /dev/null +++ b/src/bin/skw-mpc-client-bin/src/routes/misc.rs @@ -0,0 +1,21 @@ +use tide::Request; +use crate::ServerState; + +// Route: /info/status +type StatusCheckResponse = String; + +pub async fn status_check(_req: Request) -> tide::Result { + Ok("server up".to_string()) +} + +// pub async fn status_check(_req: Request) -> tide::Result { +// let auth_header = AuthHeader::test_auth_header(); +// let job_header = PayloadHeader::default(); +// let maybe_local_key: Option> = Some(vec![1,2,3]); + +// let x = MpcRequestPayload { +// auth_header, job_header, maybe_local_key +// }; + +// Ok(serde_json::to_string(&x).unwrap()) +// } diff --git a/src/bin/skw-mpc-client-bin/src/routes/mod.rs b/src/bin/skw-mpc-client-bin/src/routes/mod.rs new file mode 100644 index 0000000..3a17235 --- /dev/null +++ b/src/bin/skw-mpc-client-bin/src/routes/mod.rs @@ -0,0 +1,3 @@ +pub mod mpc; +pub mod misc; + diff --git a/src/bin/skw-mpc-client-bin/src/routes/mpc.rs b/src/bin/skw-mpc-client-bin/src/routes/mpc.rs new file mode 100644 index 0000000..6b3c85d --- /dev/null +++ b/src/bin/skw-mpc-client-bin/src/routes/mpc.rs @@ -0,0 +1,32 @@ +use skw_mpc_payload::{AuthHeader, PayloadHeader}; +use tide::Request; +use serde::{Deserialize, Serialize}; + +use crate::ServerState; + +#[derive(Serialize, Deserialize)] +pub struct MpcRequestPayload { + pub auth_header: String, + pub job_header: String, + pub maybe_local_key: String, +} + +pub async fn mpc_submit(mut req: Request) -> Result { + let MpcRequestPayload { auth_header, job_header, maybe_local_key } = req.body_json().await?; + + let auth_header: AuthHeader = serde_json::from_str(&auth_header) + .map_err(|e| tide::Error::from_str(500, format!("MPC Error {:?}", e)) )?; + let job_header: PayloadHeader = serde_json::from_str(&job_header) + .map_err(|e| tide::Error::from_str(500, format!("MPC Error {:?}", e)) )?; + let maybe_local_key: Option> = serde_json::from_str(&maybe_local_key) + .map_err(|e| tide::Error::from_str(500, format!("MPC Error {:?}", e)) )?; + + log::info!("{:?}", maybe_local_key); + let mut server_state = req.state().clone(); // Cost of clone is pretty low here ... but there might be a better way + let result = server_state.light_node + .send_request(job_header, auth_header, maybe_local_key) + .await + .map_err(|e| tide::Error::from_str(500, format!("MPC Error {:?}", e)) )?; + + Ok(serde_json::to_string(&result).unwrap()) +} diff --git a/bin/skw-mpc-node-bin/Cargo.toml b/src/bin/skw-mpc-node-bin/Cargo.toml similarity index 78% rename from bin/skw-mpc-node-bin/Cargo.toml rename to src/bin/skw-mpc-node-bin/Cargo.toml index 72b4d98..b93159c 100644 --- a/bin/skw-mpc-node-bin/Cargo.toml +++ b/src/bin/skw-mpc-node-bin/Cargo.toml @@ -11,7 +11,8 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] -skw-mpc-node = { path = "../../crates/skw-mpc-node", default-features = false, features = ["full-node", "tcp-ws-transport"]} +skw-mpc-node = { path = "../../crates/skw-mpc-node" } +skw-mpc-full-node = { path = "../../full-node/skw-mpc-full-node" } futures = "0.3.1" tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } diff --git a/bin/skw-mpc-client-bin/LICENSE b/src/bin/skw-mpc-node-bin/LICENSE similarity index 100% rename from bin/skw-mpc-client-bin/LICENSE rename to src/bin/skw-mpc-node-bin/LICENSE diff --git a/bin/skw-mpc-node-bin/src/main.rs b/src/bin/skw-mpc-node-bin/src/main.rs similarity index 93% rename from bin/skw-mpc-node-bin/src/main.rs rename to src/bin/skw-mpc-node-bin/src/main.rs index 57d920b..09a5e8c 100644 --- a/bin/skw-mpc-node-bin/src/main.rs +++ b/src/bin/skw-mpc-node-bin/src/main.rs @@ -1,10 +1,9 @@ use std::{fs, io::Write}; use futures::channel::mpsc; -use skw_mpc_node::{ - node::{full_node_event_loop, NodeClient}, - async_executor -}; +use skw_mpc_full_node::{full_node_event_loop, client::NodeClient}; +use skw_mpc_node::async_executor; + const LISTEN_ADDR: &str = "127.0.0.1"; diff --git a/crates/skw-mpc-auth/Cargo.toml b/src/crates/skw-mpc-auth/Cargo.toml similarity index 100% rename from crates/skw-mpc-auth/Cargo.toml rename to src/crates/skw-mpc-auth/Cargo.toml diff --git a/bin/skw-mpc-node-bin/LICENSE b/src/crates/skw-mpc-auth/LICENSE similarity index 100% rename from bin/skw-mpc-node-bin/LICENSE rename to src/crates/skw-mpc-auth/LICENSE diff --git a/crates/skw-mpc-auth/README.md b/src/crates/skw-mpc-auth/README.md similarity index 100% rename from crates/skw-mpc-auth/README.md rename to src/crates/skw-mpc-auth/README.md diff --git a/crates/skw-mpc-auth/src/lib.rs b/src/crates/skw-mpc-auth/src/lib.rs similarity index 100% rename from crates/skw-mpc-auth/src/lib.rs rename to src/crates/skw-mpc-auth/src/lib.rs diff --git a/crates/skw-mpc-auth/src/ownership/email.rs b/src/crates/skw-mpc-auth/src/ownership/email.rs similarity index 100% rename from crates/skw-mpc-auth/src/ownership/email.rs rename to src/crates/skw-mpc-auth/src/ownership/email.rs diff --git a/crates/skw-mpc-auth/src/ownership/ga_token.rs b/src/crates/skw-mpc-auth/src/ownership/ga_token.rs similarity index 100% rename from crates/skw-mpc-auth/src/ownership/ga_token.rs rename to src/crates/skw-mpc-auth/src/ownership/ga_token.rs diff --git a/crates/skw-mpc-auth/src/ownership/mod.rs b/src/crates/skw-mpc-auth/src/ownership/mod.rs similarity index 100% rename from crates/skw-mpc-auth/src/ownership/mod.rs rename to src/crates/skw-mpc-auth/src/ownership/mod.rs diff --git a/crates/skw-mpc-auth/src/ownership/oauth.rs b/src/crates/skw-mpc-auth/src/ownership/oauth.rs similarity index 100% rename from crates/skw-mpc-auth/src/ownership/oauth.rs rename to src/crates/skw-mpc-auth/src/ownership/oauth.rs diff --git a/crates/skw-mpc-auth/src/proof/ed25519.rs b/src/crates/skw-mpc-auth/src/proof/ed25519.rs similarity index 100% rename from crates/skw-mpc-auth/src/proof/ed25519.rs rename to src/crates/skw-mpc-auth/src/proof/ed25519.rs diff --git a/crates/skw-mpc-auth/src/proof/ga.rs b/src/crates/skw-mpc-auth/src/proof/ga.rs similarity index 100% rename from crates/skw-mpc-auth/src/proof/ga.rs rename to src/crates/skw-mpc-auth/src/proof/ga.rs diff --git a/crates/skw-mpc-auth/src/proof/jwe.rs b/src/crates/skw-mpc-auth/src/proof/jwe.rs similarity index 100% rename from crates/skw-mpc-auth/src/proof/jwe.rs rename to src/crates/skw-mpc-auth/src/proof/jwe.rs diff --git a/crates/skw-mpc-auth/src/proof/mod.rs b/src/crates/skw-mpc-auth/src/proof/mod.rs similarity index 100% rename from crates/skw-mpc-auth/src/proof/mod.rs rename to src/crates/skw-mpc-auth/src/proof/mod.rs diff --git a/crates/skw-mpc-auth/src/types.rs b/src/crates/skw-mpc-auth/src/types.rs similarity index 100% rename from crates/skw-mpc-auth/src/types.rs rename to src/crates/skw-mpc-auth/src/types.rs diff --git a/crates/skw-mpc-auth/src/usage/mod.rs b/src/crates/skw-mpc-auth/src/usage/mod.rs similarity index 100% rename from crates/skw-mpc-auth/src/usage/mod.rs rename to src/crates/skw-mpc-auth/src/usage/mod.rs diff --git a/crates/skw-mpc-auth/src/usage/mpc.rs b/src/crates/skw-mpc-auth/src/usage/mpc.rs similarity index 100% rename from crates/skw-mpc-auth/src/usage/mpc.rs rename to src/crates/skw-mpc-auth/src/usage/mpc.rs diff --git a/crates/skw-mpc-auth/src/utils.rs b/src/crates/skw-mpc-auth/src/utils.rs similarity index 100% rename from crates/skw-mpc-auth/src/utils.rs rename to src/crates/skw-mpc-auth/src/utils.rs diff --git a/crates/skw-mpc-node/Cargo.toml b/src/crates/skw-mpc-node/Cargo.toml similarity index 75% rename from crates/skw-mpc-node/Cargo.toml rename to src/crates/skw-mpc-node/Cargo.toml index 24f6707..71cb9ee 100644 --- a/crates/skw-mpc-node/Cargo.toml +++ b/src/crates/skw-mpc-node/Cargo.toml @@ -14,13 +14,14 @@ rustdoc-args = ["--cfg", "docsrs"] [dependencies] skw-crypto-curv = { path = "../../crypto/skw-crypto-curv", default-features = false} -skw-mpc-storage = { path = "../skw-mpc-storage", optional = true} skw-mpc-protocol = { path = "../skw-mpc-protocol" } skw-mpc-payload = { path = "../skw-mpc-payload" } skw-mpc-auth = { path = "../skw-mpc-auth" } skw-round-based = { path = "../skw-round-based" } -libp2p = { git = "https://github.com/libp2p/rust-libp2p", version = "0.51.0", features = ["serde", "request-response", "macros", "noise", "mplex", "yamux", "tokio"]} +skw-mpc-storage = { path = "../../storage/skw-mpc-storage" } + +libp2p = { git = "https://github.com/libp2p/rust-libp2p", version = "0.51.0", features = ["serde", "request-response", "macros", "noise", "yamux", "tokio"]} tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } thiserror = { version = "1.0.23", default-features = false } @@ -36,18 +37,5 @@ log = "0.4.17" pretty_env_logger = "0.4.0" [features] -default = ["light-node", "tcp-ws-transport"] +default = ["tcp-ws-transport"] tcp-ws-transport = ["libp2p/tcp", "libp2p/websocket", "tokio/rt-multi-thread", "libp2p/dns",] - -full-node = ["skw-mpc-storage"] -light-node = [] - -[[example]] -name = "node-light-node" -path = "examples/node_light.rs" -required-features = ["light-node", "tcp-ws-transport"] - -[[example]] -name = "node-full-node" -path = "examples/node_full.rs" -required-features = ["full-node", "tcp-ws-transport"] diff --git a/crates/skw-mpc-auth/LICENSE b/src/crates/skw-mpc-node/LICENSE similarity index 100% rename from crates/skw-mpc-auth/LICENSE rename to src/crates/skw-mpc-node/LICENSE diff --git a/crates/skw-mpc-client/README.md b/src/crates/skw-mpc-node/README.md similarity index 100% rename from crates/skw-mpc-client/README.md rename to src/crates/skw-mpc-node/README.md diff --git a/crates/skw-mpc-node/src/error.rs b/src/crates/skw-mpc-node/src/error.rs similarity index 97% rename from crates/skw-mpc-node/src/error.rs rename to src/crates/skw-mpc-node/src/error.rs index a79fe97..1a3101f 100644 --- a/crates/skw-mpc-node/src/error.rs +++ b/src/crates/skw-mpc-node/src/error.rs @@ -1,7 +1,6 @@ use serde::{Serialize, Deserialize}; use thiserror::Error; -#[cfg(feature = "full-node")] use skw_mpc_storage::MpcStorageError; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Error)] @@ -68,7 +67,6 @@ pub enum MpcNodeError { #[error("NodeError: NodeError {0}")] NodeError(NodeError), - #[cfg(feature = "full-node")] #[error("StorageError: StorageError {0}")] StorageError(MpcStorageError), diff --git a/src/crates/skw-mpc-node/src/lib.rs b/src/crates/skw-mpc-node/src/lib.rs new file mode 100644 index 0000000..bed1e6f --- /dev/null +++ b/src/crates/skw-mpc-node/src/lib.rs @@ -0,0 +1,25 @@ +pub mod error; +pub mod swarm; +pub mod node; + +pub mod serde_support; + +pub fn async_executor(future: F) + where F: futures::Future + 'static + std::marker::Send, +{ + #[cfg(target_arch = "wasm32")] + wasm_bindgen_futures::spawn_local(future); + + #[cfg(not(target_arch = "wasm32"))] + tokio::spawn(future); +} + +pub use crate::swarm::behavior::{ + MpcP2pRequest, MpcP2pResponse, MpcSwarmBahavior, MpcSwarmBahaviorEvent, SkwMpcP2pCodec, SkwMpcP2pProtocol +}; +pub use crate::swarm::client::{MpcSwarmClient, MpcSwarmCommand}; + +#[cfg(feature = "tcp-ws-transport")] +pub use crate::swarm::build_swarm; + +pub use crate::node::{ClientRequest, ClientOutcome}; diff --git a/crates/skw-mpc-node/src/node/client_outcome.rs b/src/crates/skw-mpc-node/src/node/client_outcome.rs similarity index 100% rename from crates/skw-mpc-node/src/node/client_outcome.rs rename to src/crates/skw-mpc-node/src/node/client_outcome.rs diff --git a/crates/skw-mpc-node/src/node/client_request.rs b/src/crates/skw-mpc-node/src/node/client_request.rs similarity index 87% rename from crates/skw-mpc-node/src/node/client_request.rs rename to src/crates/skw-mpc-node/src/node/client_request.rs index 6b26e40..3bfb950 100644 --- a/crates/skw-mpc-node/src/node/client_request.rs +++ b/src/crates/skw-mpc-node/src/node/client_request.rs @@ -3,9 +3,7 @@ use libp2p::{PeerId, Multiaddr}; use crate::error::MpcNodeError; -#[cfg(feature = "light-node")] use super::client_outcome::ClientOutcome; -#[cfg(feature = "light-node")] use skw_mpc_payload::{PayloadHeader, AuthHeader}; #[derive(Debug)] @@ -23,8 +21,7 @@ pub enum ClientRequest { > }, - #[cfg(feature = "full-node")] - WriteToDB { + PersisteResult { node: PeerId, key: [u8; 32], value: Vec, @@ -32,7 +29,6 @@ pub enum ClientRequest { result_sender: oneshot::Sender>, }, - #[cfg(feature = "light-node")] MpcRequest { from: PeerId, payload_header: PayloadHeader, diff --git a/crates/skw-mpc-node/src/node/mod.rs b/src/crates/skw-mpc-node/src/node/mod.rs similarity index 84% rename from crates/skw-mpc-node/src/node/mod.rs rename to src/crates/skw-mpc-node/src/node/mod.rs index ea7a0ae..40f8269 100644 --- a/crates/skw-mpc-node/src/node/mod.rs +++ b/src/crates/skw-mpc-node/src/node/mod.rs @@ -1,23 +1,7 @@ mod client_outcome; mod client_request; -mod client; -mod job_manager; - -#[cfg(feature = "full-node")] -mod full; - -#[cfg(feature = "light-node")] -mod light; - -// re-exports -#[cfg(feature = "full-node")] -pub use full::full_node_event_loop; - -#[cfg(feature = "light-node")] -pub use light::light_node_event_loop; pub use client_request::ClientRequest; -pub use client::NodeClient; pub use client_outcome::ClientOutcome; #[macro_export] diff --git a/crates/skw-mpc-node/src/serde_support.rs b/src/crates/skw-mpc-node/src/serde_support.rs similarity index 100% rename from crates/skw-mpc-node/src/serde_support.rs rename to src/crates/skw-mpc-node/src/serde_support.rs diff --git a/crates/skw-mpc-node/src/swarm/behavior.rs b/src/crates/skw-mpc-node/src/swarm/behavior.rs similarity index 100% rename from crates/skw-mpc-node/src/swarm/behavior.rs rename to src/crates/skw-mpc-node/src/swarm/behavior.rs diff --git a/crates/skw-mpc-node/src/swarm/client.rs b/src/crates/skw-mpc-node/src/swarm/client.rs similarity index 100% rename from crates/skw-mpc-node/src/swarm/client.rs rename to src/crates/skw-mpc-node/src/swarm/client.rs diff --git a/src/crates/skw-mpc-node/src/swarm/mod.rs b/src/crates/skw-mpc-node/src/swarm/mod.rs new file mode 100644 index 0000000..1bc77b5 --- /dev/null +++ b/src/crates/skw-mpc-node/src/swarm/mod.rs @@ -0,0 +1,46 @@ +pub mod behavior; +pub mod client; + +use libp2p::request_response::ProtocolSupport; +use libp2p::{ + identity, PeerId, Swarm, + request_response, + noise, yamux, Transport, +}; + +use self::behavior::{MpcSwarmBahavior, SkwMpcP2pCodec, SkwMpcP2pProtocol}; + +#[cfg(feature = "tcp-ws-transport")] +pub fn build_swarm(local_key: identity::Keypair) -> Swarm { + use std::time::Duration; + + use libp2p::{websocket, tcp, dns, swarm::SwarmBuilder}; + let local_peer_id = PeerId::from(local_key.public()); + + let transport = { + let mut yamux_config = yamux::YamuxConfig::default(); + // Enable proper flow-control: window updates are only sent when + // buffered data has been consumed. + yamux_config.set_window_update_mode(yamux::WindowUpdateMode::on_read()); + + websocket::WsConfig::new(dns::TokioDnsConfig::system( + tcp::tokio::Transport::new(tcp::Config::default()), + ).unwrap()) + .upgrade(libp2p::core::upgrade::Version::V1) + .authenticate( + noise::NoiseAuthenticated::xx(&local_key) + .expect("Signing libp2p-noise static DH keypair failed."), + ) + .multiplex(yamux_config) + .timeout(Duration::from_secs(10)) + .boxed() + }; + + let request_response = request_response::Behaviour::::new( + SkwMpcP2pCodec(), + std::iter::once((SkwMpcP2pProtocol(), ProtocolSupport::Full)), + Default::default(), + ); + let behaviour = MpcSwarmBahavior { request_response, }; + SwarmBuilder::with_tokio_executor(transport, behaviour, local_peer_id).build() +} diff --git a/crates/skw-mpc-node/tests/test.rs b/src/crates/skw-mpc-node/tests/test.rs similarity index 100% rename from crates/skw-mpc-node/tests/test.rs rename to src/crates/skw-mpc-node/tests/test.rs diff --git a/crates/skw-mpc-payload/Cargo.toml b/src/crates/skw-mpc-payload/Cargo.toml similarity index 100% rename from crates/skw-mpc-payload/Cargo.toml rename to src/crates/skw-mpc-payload/Cargo.toml diff --git a/crates/skw-mpc-client/LICENSE b/src/crates/skw-mpc-payload/LICENSE similarity index 100% rename from crates/skw-mpc-client/LICENSE rename to src/crates/skw-mpc-payload/LICENSE diff --git a/crates/skw-mpc-node/README.md b/src/crates/skw-mpc-payload/README.md similarity index 100% rename from crates/skw-mpc-node/README.md rename to src/crates/skw-mpc-payload/README.md diff --git a/crates/skw-mpc-payload/src/auth_header.rs b/src/crates/skw-mpc-payload/src/auth_header.rs similarity index 100% rename from crates/skw-mpc-payload/src/auth_header.rs rename to src/crates/skw-mpc-payload/src/auth_header.rs diff --git a/crates/skw-mpc-payload/src/env.rs b/src/crates/skw-mpc-payload/src/env.rs similarity index 100% rename from crates/skw-mpc-payload/src/env.rs rename to src/crates/skw-mpc-payload/src/env.rs diff --git a/crates/skw-mpc-payload/src/header.rs b/src/crates/skw-mpc-payload/src/header.rs similarity index 100% rename from crates/skw-mpc-payload/src/header.rs rename to src/crates/skw-mpc-payload/src/header.rs diff --git a/crates/skw-mpc-payload/src/lib.rs b/src/crates/skw-mpc-payload/src/lib.rs similarity index 100% rename from crates/skw-mpc-payload/src/lib.rs rename to src/crates/skw-mpc-payload/src/lib.rs diff --git a/crates/skw-mpc-payload/src/types.rs b/src/crates/skw-mpc-payload/src/types.rs similarity index 100% rename from crates/skw-mpc-payload/src/types.rs rename to src/crates/skw-mpc-payload/src/types.rs diff --git a/crates/skw-mpc-protocol/Cargo.lock b/src/crates/skw-mpc-protocol/Cargo.lock similarity index 100% rename from crates/skw-mpc-protocol/Cargo.lock rename to src/crates/skw-mpc-protocol/Cargo.lock diff --git a/crates/skw-mpc-protocol/Cargo.toml b/src/crates/skw-mpc-protocol/Cargo.toml similarity index 100% rename from crates/skw-mpc-protocol/Cargo.toml rename to src/crates/skw-mpc-protocol/Cargo.toml diff --git a/crates/skw-mpc-protocol/LICENSE b/src/crates/skw-mpc-protocol/LICENSE similarity index 100% rename from crates/skw-mpc-protocol/LICENSE rename to src/crates/skw-mpc-protocol/LICENSE diff --git a/crates/skw-mpc-protocol/README.md b/src/crates/skw-mpc-protocol/README.md similarity index 100% rename from crates/skw-mpc-protocol/README.md rename to src/crates/skw-mpc-protocol/README.md diff --git a/crates/skw-mpc-protocol/src/gg20/blame.rs b/src/crates/skw-mpc-protocol/src/gg20/blame.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/blame.rs rename to src/crates/skw-mpc-protocol/src/gg20/blame.rs diff --git a/crates/skw-mpc-protocol/src/gg20/mod.rs b/src/crates/skw-mpc-protocol/src/gg20/mod.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/mod.rs rename to src/crates/skw-mpc-protocol/src/gg20/mod.rs diff --git a/crates/skw-mpc-protocol/src/gg20/party_i.rs b/src/crates/skw-mpc-protocol/src/gg20/party_i.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/party_i.rs rename to src/crates/skw-mpc-protocol/src/gg20/party_i.rs diff --git a/crates/skw-mpc-protocol/src/gg20/state_machine/keygen.rs b/src/crates/skw-mpc-protocol/src/gg20/state_machine/keygen.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/state_machine/keygen.rs rename to src/crates/skw-mpc-protocol/src/gg20/state_machine/keygen.rs diff --git a/crates/skw-mpc-protocol/src/gg20/state_machine/keygen/rounds.rs b/src/crates/skw-mpc-protocol/src/gg20/state_machine/keygen/rounds.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/state_machine/keygen/rounds.rs rename to src/crates/skw-mpc-protocol/src/gg20/state_machine/keygen/rounds.rs diff --git a/crates/skw-mpc-protocol/src/gg20/state_machine/mod.rs b/src/crates/skw-mpc-protocol/src/gg20/state_machine/mod.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/state_machine/mod.rs rename to src/crates/skw-mpc-protocol/src/gg20/state_machine/mod.rs diff --git a/crates/skw-mpc-protocol/src/gg20/state_machine/sign.rs b/src/crates/skw-mpc-protocol/src/gg20/state_machine/sign.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/state_machine/sign.rs rename to src/crates/skw-mpc-protocol/src/gg20/state_machine/sign.rs diff --git a/crates/skw-mpc-protocol/src/gg20/state_machine/sign/fmt.rs b/src/crates/skw-mpc-protocol/src/gg20/state_machine/sign/fmt.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/state_machine/sign/fmt.rs rename to src/crates/skw-mpc-protocol/src/gg20/state_machine/sign/fmt.rs diff --git a/crates/skw-mpc-protocol/src/gg20/state_machine/sign/rounds.rs b/src/crates/skw-mpc-protocol/src/gg20/state_machine/sign/rounds.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/state_machine/sign/rounds.rs rename to src/crates/skw-mpc-protocol/src/gg20/state_machine/sign/rounds.rs diff --git a/crates/skw-mpc-protocol/src/gg20/state_machine/traits.rs b/src/crates/skw-mpc-protocol/src/gg20/state_machine/traits.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/state_machine/traits.rs rename to src/crates/skw-mpc-protocol/src/gg20/state_machine/traits.rs diff --git a/crates/skw-mpc-protocol/src/gg20/test.rs b/src/crates/skw-mpc-protocol/src/gg20/test.rs similarity index 100% rename from crates/skw-mpc-protocol/src/gg20/test.rs rename to src/crates/skw-mpc-protocol/src/gg20/test.rs diff --git a/crates/skw-mpc-protocol/src/key_refresh/add_party_message.rs b/src/crates/skw-mpc-protocol/src/key_refresh/add_party_message.rs similarity index 100% rename from crates/skw-mpc-protocol/src/key_refresh/add_party_message.rs rename to src/crates/skw-mpc-protocol/src/key_refresh/add_party_message.rs diff --git a/crates/skw-mpc-protocol/src/key_refresh/error.rs b/src/crates/skw-mpc-protocol/src/key_refresh/error.rs similarity index 100% rename from crates/skw-mpc-protocol/src/key_refresh/error.rs rename to src/crates/skw-mpc-protocol/src/key_refresh/error.rs diff --git a/crates/skw-mpc-protocol/src/key_refresh/mod.rs b/src/crates/skw-mpc-protocol/src/key_refresh/mod.rs similarity index 100% rename from crates/skw-mpc-protocol/src/key_refresh/mod.rs rename to src/crates/skw-mpc-protocol/src/key_refresh/mod.rs diff --git a/crates/skw-mpc-protocol/src/key_refresh/refresh_message.rs b/src/crates/skw-mpc-protocol/src/key_refresh/refresh_message.rs similarity index 100% rename from crates/skw-mpc-protocol/src/key_refresh/refresh_message.rs rename to src/crates/skw-mpc-protocol/src/key_refresh/refresh_message.rs diff --git a/crates/skw-mpc-protocol/src/key_refresh/test.rs b/src/crates/skw-mpc-protocol/src/key_refresh/test.rs similarity index 100% rename from crates/skw-mpc-protocol/src/key_refresh/test.rs rename to src/crates/skw-mpc-protocol/src/key_refresh/test.rs diff --git a/crates/skw-mpc-protocol/src/lib.rs b/src/crates/skw-mpc-protocol/src/lib.rs similarity index 100% rename from crates/skw-mpc-protocol/src/lib.rs rename to src/crates/skw-mpc-protocol/src/lib.rs diff --git a/crates/skw-mpc-protocol/src/utilities/mod.rs b/src/crates/skw-mpc-protocol/src/utilities/mod.rs similarity index 100% rename from crates/skw-mpc-protocol/src/utilities/mod.rs rename to src/crates/skw-mpc-protocol/src/utilities/mod.rs diff --git a/crates/skw-mpc-protocol/src/utilities/mta/mod.rs b/src/crates/skw-mpc-protocol/src/utilities/mta/mod.rs similarity index 100% rename from crates/skw-mpc-protocol/src/utilities/mta/mod.rs rename to src/crates/skw-mpc-protocol/src/utilities/mta/mod.rs diff --git a/crates/skw-mpc-protocol/src/utilities/mta/range_proofs.rs b/src/crates/skw-mpc-protocol/src/utilities/mta/range_proofs.rs similarity index 100% rename from crates/skw-mpc-protocol/src/utilities/mta/range_proofs.rs rename to src/crates/skw-mpc-protocol/src/utilities/mta/range_proofs.rs diff --git a/crates/skw-mpc-protocol/src/utilities/mta/test.rs b/src/crates/skw-mpc-protocol/src/utilities/mta/test.rs similarity index 100% rename from crates/skw-mpc-protocol/src/utilities/mta/test.rs rename to src/crates/skw-mpc-protocol/src/utilities/mta/test.rs diff --git a/crates/skw-mpc-protocol/src/utilities/zk_pdl_with_slack/mod.rs b/src/crates/skw-mpc-protocol/src/utilities/zk_pdl_with_slack/mod.rs similarity index 100% rename from crates/skw-mpc-protocol/src/utilities/zk_pdl_with_slack/mod.rs rename to src/crates/skw-mpc-protocol/src/utilities/zk_pdl_with_slack/mod.rs diff --git a/crates/skw-mpc-protocol/src/utilities/zk_pdl_with_slack/test.rs b/src/crates/skw-mpc-protocol/src/utilities/zk_pdl_with_slack/test.rs similarity index 100% rename from crates/skw-mpc-protocol/src/utilities/zk_pdl_with_slack/test.rs rename to src/crates/skw-mpc-protocol/src/utilities/zk_pdl_with_slack/test.rs diff --git a/crates/skw-round-based/CHANGELOG.md b/src/crates/skw-round-based/CHANGELOG.md similarity index 100% rename from crates/skw-round-based/CHANGELOG.md rename to src/crates/skw-round-based/CHANGELOG.md diff --git a/crates/skw-round-based/Cargo.lock b/src/crates/skw-round-based/Cargo.lock similarity index 100% rename from crates/skw-round-based/Cargo.lock rename to src/crates/skw-round-based/Cargo.lock diff --git a/crates/skw-round-based/Cargo.toml b/src/crates/skw-round-based/Cargo.toml similarity index 100% rename from crates/skw-round-based/Cargo.toml rename to src/crates/skw-round-based/Cargo.toml diff --git a/crates/skw-mpc-node/LICENSE b/src/crates/skw-round-based/LICENSE similarity index 100% rename from crates/skw-mpc-node/LICENSE rename to src/crates/skw-round-based/LICENSE diff --git a/crates/skw-round-based/README.md b/src/crates/skw-round-based/README.md similarity index 100% rename from crates/skw-round-based/README.md rename to src/crates/skw-round-based/README.md diff --git a/crates/skw-round-based/src/async_runtime/mod.rs b/src/crates/skw-round-based/src/async_runtime/mod.rs similarity index 100% rename from crates/skw-round-based/src/async_runtime/mod.rs rename to src/crates/skw-round-based/src/async_runtime/mod.rs diff --git a/crates/skw-round-based/src/async_runtime/watcher.rs b/src/crates/skw-round-based/src/async_runtime/watcher.rs similarity index 100% rename from crates/skw-round-based/src/async_runtime/watcher.rs rename to src/crates/skw-round-based/src/async_runtime/watcher.rs diff --git a/crates/skw-round-based/src/containers/broadcast.rs b/src/crates/skw-round-based/src/containers/broadcast.rs similarity index 100% rename from crates/skw-round-based/src/containers/broadcast.rs rename to src/crates/skw-round-based/src/containers/broadcast.rs diff --git a/crates/skw-round-based/src/containers/mod.rs b/src/crates/skw-round-based/src/containers/mod.rs similarity index 100% rename from crates/skw-round-based/src/containers/mod.rs rename to src/crates/skw-round-based/src/containers/mod.rs diff --git a/crates/skw-round-based/src/containers/p2p.rs b/src/crates/skw-round-based/src/containers/p2p.rs similarity index 100% rename from crates/skw-round-based/src/containers/p2p.rs rename to src/crates/skw-round-based/src/containers/p2p.rs diff --git a/crates/skw-round-based/src/containers/push.rs b/src/crates/skw-round-based/src/containers/push.rs similarity index 100% rename from crates/skw-round-based/src/containers/push.rs rename to src/crates/skw-round-based/src/containers/push.rs diff --git a/crates/skw-round-based/src/containers/store_err.rs b/src/crates/skw-round-based/src/containers/store_err.rs similarity index 100% rename from crates/skw-round-based/src/containers/store_err.rs rename to src/crates/skw-round-based/src/containers/store_err.rs diff --git a/crates/skw-round-based/src/containers/traits.rs b/src/crates/skw-round-based/src/containers/traits.rs similarity index 100% rename from crates/skw-round-based/src/containers/traits.rs rename to src/crates/skw-round-based/src/containers/traits.rs diff --git a/crates/skw-round-based/src/dev/async_simulation.rs b/src/crates/skw-round-based/src/dev/async_simulation.rs similarity index 100% rename from crates/skw-round-based/src/dev/async_simulation.rs rename to src/crates/skw-round-based/src/dev/async_simulation.rs diff --git a/crates/skw-round-based/src/dev/mod.rs b/src/crates/skw-round-based/src/dev/mod.rs similarity index 100% rename from crates/skw-round-based/src/dev/mod.rs rename to src/crates/skw-round-based/src/dev/mod.rs diff --git a/crates/skw-round-based/src/dev/simulation.rs b/src/crates/skw-round-based/src/dev/simulation.rs similarity index 100% rename from crates/skw-round-based/src/dev/simulation.rs rename to src/crates/skw-round-based/src/dev/simulation.rs diff --git a/crates/skw-round-based/src/dev/simulation/benchmark.rs b/src/crates/skw-round-based/src/dev/simulation/benchmark.rs similarity index 100% rename from crates/skw-round-based/src/dev/simulation/benchmark.rs rename to src/crates/skw-round-based/src/dev/simulation/benchmark.rs diff --git a/crates/skw-round-based/src/lib.rs b/src/crates/skw-round-based/src/lib.rs similarity index 100% rename from crates/skw-round-based/src/lib.rs rename to src/crates/skw-round-based/src/lib.rs diff --git a/crates/skw-round-based/src/sm.rs b/src/crates/skw-round-based/src/sm.rs similarity index 100% rename from crates/skw-round-based/src/sm.rs rename to src/crates/skw-round-based/src/sm.rs diff --git a/crates/skw-round-based/tests/silly_protocol/mod.rs b/src/crates/skw-round-based/tests/silly_protocol/mod.rs similarity index 100% rename from crates/skw-round-based/tests/silly_protocol/mod.rs rename to src/crates/skw-round-based/tests/silly_protocol/mod.rs diff --git a/crates/skw-round-based/tests/silly_protocol/rounds.rs b/src/crates/skw-round-based/tests/silly_protocol/rounds.rs similarity index 100% rename from crates/skw-round-based/tests/silly_protocol/rounds.rs rename to src/crates/skw-round-based/tests/silly_protocol/rounds.rs diff --git a/crates/skw-round-based/tests/simulate_silly_protocol.rs b/src/crates/skw-round-based/tests/simulate_silly_protocol.rs similarity index 100% rename from crates/skw-round-based/tests/simulate_silly_protocol.rs rename to src/crates/skw-round-based/tests/simulate_silly_protocol.rs diff --git a/crypto/skw-crypto-curv/CHANGELOG.md b/src/crypto/skw-crypto-curv/CHANGELOG.md similarity index 100% rename from crypto/skw-crypto-curv/CHANGELOG.md rename to src/crypto/skw-crypto-curv/CHANGELOG.md diff --git a/crypto/skw-crypto-curv/Cargo.toml b/src/crypto/skw-crypto-curv/Cargo.toml similarity index 100% rename from crypto/skw-crypto-curv/Cargo.toml rename to src/crypto/skw-crypto-curv/Cargo.toml diff --git a/crypto/skw-crypto-curv/LICENSE b/src/crypto/skw-crypto-curv/LICENSE similarity index 100% rename from crypto/skw-crypto-curv/LICENSE rename to src/crypto/skw-crypto-curv/LICENSE diff --git a/crypto/skw-crypto-curv/README.md b/src/crypto/skw-crypto-curv/README.md similarity index 100% rename from crypto/skw-crypto-curv/README.md rename to src/crypto/skw-crypto-curv/README.md diff --git a/crypto/skw-crypto-curv/audit/kzen-curv-audit final 03.01.2019.pdf b/src/crypto/skw-crypto-curv/audit/kzen-curv-audit final 03.01.2019.pdf similarity index 100% rename from crypto/skw-crypto-curv/audit/kzen-curv-audit final 03.01.2019.pdf rename to src/crypto/skw-crypto-curv/audit/kzen-curv-audit final 03.01.2019.pdf diff --git a/crypto/skw-crypto-curv/examples/diffie_hellman_key_exchange.rs b/src/crypto/skw-crypto-curv/examples/diffie_hellman_key_exchange.rs similarity index 100% rename from crypto/skw-crypto-curv/examples/diffie_hellman_key_exchange.rs rename to src/crypto/skw-crypto-curv/examples/diffie_hellman_key_exchange.rs diff --git a/crypto/skw-crypto-curv/examples/pedersen_commitment.rs b/src/crypto/skw-crypto-curv/examples/pedersen_commitment.rs similarity index 100% rename from crypto/skw-crypto-curv/examples/pedersen_commitment.rs rename to src/crypto/skw-crypto-curv/examples/pedersen_commitment.rs diff --git a/crypto/skw-crypto-curv/examples/proof_of_knowledge_of_dlog.rs b/src/crypto/skw-crypto-curv/examples/proof_of_knowledge_of_dlog.rs similarity index 100% rename from crypto/skw-crypto-curv/examples/proof_of_knowledge_of_dlog.rs rename to src/crypto/skw-crypto-curv/examples/proof_of_knowledge_of_dlog.rs diff --git a/crypto/skw-crypto-curv/examples/verifiable_secret_sharing.rs b/src/crypto/skw-crypto-curv/examples/verifiable_secret_sharing.rs similarity index 100% rename from crypto/skw-crypto-curv/examples/verifiable_secret_sharing.rs rename to src/crypto/skw-crypto-curv/examples/verifiable_secret_sharing.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/big_native.rs b/src/crypto/skw-crypto-curv/src/arithmetic/big_native.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/big_native.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/big_native.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/big_native/primes.rs b/src/crypto/skw-crypto-curv/src/arithmetic/big_native/primes.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/big_native/primes.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/big_native/primes.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/big_native/ring_algorithms.rs b/src/crypto/skw-crypto-curv/src/arithmetic/big_native/ring_algorithms.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/big_native/ring_algorithms.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/big_native/ring_algorithms.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/errors.rs b/src/crypto/skw-crypto-curv/src/arithmetic/errors.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/errors.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/errors.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/macros.rs b/src/crypto/skw-crypto-curv/src/arithmetic/macros.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/macros.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/macros.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/mod.rs b/src/crypto/skw-crypto-curv/src/arithmetic/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/mod.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/mod.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/samplable.rs b/src/crypto/skw-crypto-curv/src/arithmetic/samplable.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/samplable.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/samplable.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/serde_support.rs b/src/crypto/skw-crypto-curv/src/arithmetic/serde_support.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/serde_support.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/serde_support.rs diff --git a/crypto/skw-crypto-curv/src/arithmetic/traits.rs b/src/crypto/skw-crypto-curv/src/arithmetic/traits.rs similarity index 100% rename from crypto/skw-crypto-curv/src/arithmetic/traits.rs rename to src/crypto/skw-crypto-curv/src/arithmetic/traits.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/hash_commitment.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/hash_commitment.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/hash_commitment.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/hash_commitment.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/mod.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/mod.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/mod.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/pedersen_commitment.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/pedersen_commitment.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/pedersen_commitment.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/pedersen_commitment.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/traits.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/traits.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/traits.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/commitments/traits.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/ext.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/ext.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/ext.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/ext.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/merkle_tree.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/merkle_tree.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/merkle_tree.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/merkle_tree.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/mod.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/mod.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/hashing/mod.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/mod.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/mod.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/mod.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/low_degree_exponent_interpolation.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/low_degree_exponent_interpolation.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/low_degree_exponent_interpolation.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/low_degree_exponent_interpolation.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/mod.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/mod.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/mod.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_correct_homomorphic_elgamal_enc.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_correct_homomorphic_elgamal_enc.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_correct_homomorphic_elgamal_enc.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_correct_homomorphic_elgamal_enc.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_correct_homomorphic_elgamal_encryption_of_dlog.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_correct_homomorphic_elgamal_encryption_of_dlog.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_correct_homomorphic_elgamal_encryption_of_dlog.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_correct_homomorphic_elgamal_encryption_of_dlog.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_dlog.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_dlog.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_dlog.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_dlog.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_ec_ddh.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_ec_ddh.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_ec_ddh.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_ec_ddh.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_valid_pedersen.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_valid_pedersen.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_valid_pedersen.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_valid_pedersen.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_valid_pedersen_blind.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_valid_pedersen_blind.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_valid_pedersen_blind.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/proofs/sigma_valid_pedersen_blind.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/feldman_vss.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/feldman_vss.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/feldman_vss.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/feldman_vss.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/mod.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/mod.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/mod.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/polynomial.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/polynomial.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/polynomial.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/secret_sharing/polynomial.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/coin_flip_optimal_rounds.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/coin_flip_optimal_rounds.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/coin_flip_optimal_rounds.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/coin_flip_optimal_rounds.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/dh_key_exchange.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/dh_key_exchange.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/dh_key_exchange.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/dh_key_exchange.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/dh_key_exchange_variant_with_pok_comm.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/dh_key_exchange_variant_with_pok_comm.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/dh_key_exchange_variant_with_pok_comm.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/dh_key_exchange_variant_with_pok_comm.rs diff --git a/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/mod.rs b/src/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/mod.rs rename to src/crypto/skw-crypto-curv/src/cryptographic_primitives/twoparty/mod.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/g1.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/g1.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/g1.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/g1.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/g2.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/g2.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/g2.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/g2.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/mod.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/mod.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/mod.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/pairing.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/pairing.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/pairing.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/pairing.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/scalar.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/scalar.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/scalar.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/bls12_381/scalar.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/curve_ristretto.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/curve_ristretto.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/curve_ristretto.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/curve_ristretto.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/ed25519.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/ed25519.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/ed25519.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/ed25519.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/mod.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/mod.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/mod.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/p256.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/p256.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/p256.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/p256.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/secp256_k1.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/secp256_k1.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/secp256_k1.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/secp256_k1.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/test.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/test.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/test.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/test.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/traits.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/traits.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/traits.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/traits.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/arithmetic.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/arithmetic.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/arithmetic.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/arithmetic.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/encoded_point.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/encoded_point.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/encoded_point.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/encoded_point.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/encoded_scalar.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/encoded_scalar.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/encoded_scalar.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/encoded_scalar.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/error.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/error.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/error.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/error.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/generator.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/generator.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/generator.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/generator.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/mod.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/mod.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/mod.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/point.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/point.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/point.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/point.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/scalar.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/scalar.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/scalar.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/scalar.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/serde_support.rs b/src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/serde_support.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/curves/wrappers/serde_support.rs rename to src/crypto/skw-crypto-curv/src/elliptic/curves/wrappers/serde_support.rs diff --git a/crypto/skw-crypto-curv/src/elliptic/mod.rs b/src/crypto/skw-crypto-curv/src/elliptic/mod.rs similarity index 100% rename from crypto/skw-crypto-curv/src/elliptic/mod.rs rename to src/crypto/skw-crypto-curv/src/elliptic/mod.rs diff --git a/crypto/skw-crypto-curv/src/lib.rs b/src/crypto/skw-crypto-curv/src/lib.rs similarity index 100% rename from crypto/skw-crypto-curv/src/lib.rs rename to src/crypto/skw-crypto-curv/src/lib.rs diff --git a/crypto/skw-crypto-curv/src/marker.rs b/src/crypto/skw-crypto-curv/src/marker.rs similarity index 100% rename from crypto/skw-crypto-curv/src/marker.rs rename to src/crypto/skw-crypto-curv/src/marker.rs diff --git a/crypto/skw-crypto-curv/src/test_utils.rs b/src/crypto/skw-crypto-curv/src/test_utils.rs similarity index 100% rename from crypto/skw-crypto-curv/src/test_utils.rs rename to src/crypto/skw-crypto-curv/src/test_utils.rs diff --git a/crypto/skw-crypto-paillier/Cargo.toml b/src/crypto/skw-crypto-paillier/Cargo.toml similarity index 100% rename from crypto/skw-crypto-paillier/Cargo.toml rename to src/crypto/skw-crypto-paillier/Cargo.toml diff --git a/crypto/skw-crypto-paillier/LICENSE b/src/crypto/skw-crypto-paillier/LICENSE similarity index 100% rename from crypto/skw-crypto-paillier/LICENSE rename to src/crypto/skw-crypto-paillier/LICENSE diff --git a/crypto/skw-crypto-paillier/LICENSE-APACHE b/src/crypto/skw-crypto-paillier/LICENSE-APACHE similarity index 100% rename from crypto/skw-crypto-paillier/LICENSE-APACHE rename to src/crypto/skw-crypto-paillier/LICENSE-APACHE diff --git a/crypto/skw-crypto-paillier/LICENSE-MIT b/src/crypto/skw-crypto-paillier/LICENSE-MIT similarity index 100% rename from crypto/skw-crypto-paillier/LICENSE-MIT rename to src/crypto/skw-crypto-paillier/LICENSE-MIT diff --git a/crypto/skw-crypto-paillier/README.md b/src/crypto/skw-crypto-paillier/README.md similarity index 100% rename from crypto/skw-crypto-paillier/README.md rename to src/crypto/skw-crypto-paillier/README.md diff --git a/crypto/skw-crypto-paillier/benches/arith.rs b/src/crypto/skw-crypto-paillier/benches/arith.rs similarity index 100% rename from crypto/skw-crypto-paillier/benches/arith.rs rename to src/crypto/skw-crypto-paillier/benches/arith.rs diff --git a/crypto/skw-crypto-paillier/benches/encryption.rs b/src/crypto/skw-crypto-paillier/benches/encryption.rs similarity index 100% rename from crypto/skw-crypto-paillier/benches/encryption.rs rename to src/crypto/skw-crypto-paillier/benches/encryption.rs diff --git a/crypto/skw-crypto-paillier/benches/helpers/mod.rs b/src/crypto/skw-crypto-paillier/benches/helpers/mod.rs similarity index 100% rename from crypto/skw-crypto-paillier/benches/helpers/mod.rs rename to src/crypto/skw-crypto-paillier/benches/helpers/mod.rs diff --git a/crypto/skw-crypto-paillier/benches/keygen.rs b/src/crypto/skw-crypto-paillier/benches/keygen.rs similarity index 100% rename from crypto/skw-crypto-paillier/benches/keygen.rs rename to src/crypto/skw-crypto-paillier/benches/keygen.rs diff --git a/crypto/skw-crypto-paillier/examples/basic.rs b/src/crypto/skw-crypto-paillier/examples/basic.rs similarity index 100% rename from crypto/skw-crypto-paillier/examples/basic.rs rename to src/crypto/skw-crypto-paillier/examples/basic.rs diff --git a/crypto/skw-crypto-paillier/examples/core.rs b/src/crypto/skw-crypto-paillier/examples/core.rs similarity index 100% rename from crypto/skw-crypto-paillier/examples/core.rs rename to src/crypto/skw-crypto-paillier/examples/core.rs diff --git a/crypto/skw-crypto-paillier/examples/packed.rs b/src/crypto/skw-crypto-paillier/examples/packed.rs similarity index 100% rename from crypto/skw-crypto-paillier/examples/packed.rs rename to src/crypto/skw-crypto-paillier/examples/packed.rs diff --git a/crypto/skw-crypto-paillier/examples/simple-voting.rs b/src/crypto/skw-crypto-paillier/examples/simple-voting.rs similarity index 100% rename from crypto/skw-crypto-paillier/examples/simple-voting.rs rename to src/crypto/skw-crypto-paillier/examples/simple-voting.rs diff --git a/crypto/skw-crypto-paillier/src/core.rs b/src/crypto/skw-crypto-paillier/src/core.rs similarity index 100% rename from crypto/skw-crypto-paillier/src/core.rs rename to src/crypto/skw-crypto-paillier/src/core.rs diff --git a/crypto/skw-crypto-paillier/src/encoding/integral.rs b/src/crypto/skw-crypto-paillier/src/encoding/integral.rs similarity index 100% rename from crypto/skw-crypto-paillier/src/encoding/integral.rs rename to src/crypto/skw-crypto-paillier/src/encoding/integral.rs diff --git a/crypto/skw-crypto-paillier/src/encoding/mod.rs b/src/crypto/skw-crypto-paillier/src/encoding/mod.rs similarity index 100% rename from crypto/skw-crypto-paillier/src/encoding/mod.rs rename to src/crypto/skw-crypto-paillier/src/encoding/mod.rs diff --git a/crypto/skw-crypto-paillier/src/keygen.rs b/src/crypto/skw-crypto-paillier/src/keygen.rs similarity index 100% rename from crypto/skw-crypto-paillier/src/keygen.rs rename to src/crypto/skw-crypto-paillier/src/keygen.rs diff --git a/crypto/skw-crypto-paillier/src/lib.rs b/src/crypto/skw-crypto-paillier/src/lib.rs similarity index 100% rename from crypto/skw-crypto-paillier/src/lib.rs rename to src/crypto/skw-crypto-paillier/src/lib.rs diff --git a/crypto/skw-crypto-paillier/src/serialize.rs b/src/crypto/skw-crypto-paillier/src/serialize.rs similarity index 100% rename from crypto/skw-crypto-paillier/src/serialize.rs rename to src/crypto/skw-crypto-paillier/src/serialize.rs diff --git a/crypto/skw-crypto-paillier/src/traits.rs b/src/crypto/skw-crypto-paillier/src/traits.rs similarity index 100% rename from crypto/skw-crypto-paillier/src/traits.rs rename to src/crypto/skw-crypto-paillier/src/traits.rs diff --git a/crypto/skw-crypto-zk-paillier/Cargo.toml b/src/crypto/skw-crypto-zk-paillier/Cargo.toml similarity index 100% rename from crypto/skw-crypto-zk-paillier/Cargo.toml rename to src/crypto/skw-crypto-zk-paillier/Cargo.toml diff --git a/crypto/skw-crypto-zk-paillier/LICENSE b/src/crypto/skw-crypto-zk-paillier/LICENSE similarity index 100% rename from crypto/skw-crypto-zk-paillier/LICENSE rename to src/crypto/skw-crypto-zk-paillier/LICENSE diff --git a/crypto/skw-crypto-zk-paillier/README.md b/src/crypto/skw-crypto-zk-paillier/README.md similarity index 100% rename from crypto/skw-crypto-zk-paillier/README.md rename to src/crypto/skw-crypto-zk-paillier/README.md diff --git a/crypto/skw-crypto-zk-paillier/src/lib.rs b/src/crypto/skw-crypto-zk-paillier/src/lib.rs similarity index 100% rename from crypto/skw-crypto-zk-paillier/src/lib.rs rename to src/crypto/skw-crypto-zk-paillier/src/lib.rs diff --git a/crypto/skw-crypto-zk-paillier/src/serialize.rs b/src/crypto/skw-crypto-zk-paillier/src/serialize.rs similarity index 100% rename from crypto/skw-crypto-zk-paillier/src/serialize.rs rename to src/crypto/skw-crypto-zk-paillier/src/serialize.rs diff --git a/crypto/skw-crypto-zk-paillier/src/zkproofs/correct_key_ni.rs b/src/crypto/skw-crypto-zk-paillier/src/zkproofs/correct_key_ni.rs similarity index 100% rename from crypto/skw-crypto-zk-paillier/src/zkproofs/correct_key_ni.rs rename to src/crypto/skw-crypto-zk-paillier/src/zkproofs/correct_key_ni.rs diff --git a/crypto/skw-crypto-zk-paillier/src/zkproofs/errors.rs b/src/crypto/skw-crypto-zk-paillier/src/zkproofs/errors.rs similarity index 100% rename from crypto/skw-crypto-zk-paillier/src/zkproofs/errors.rs rename to src/crypto/skw-crypto-zk-paillier/src/zkproofs/errors.rs diff --git a/crypto/skw-crypto-zk-paillier/src/zkproofs/mod.rs b/src/crypto/skw-crypto-zk-paillier/src/zkproofs/mod.rs similarity index 100% rename from crypto/skw-crypto-zk-paillier/src/zkproofs/mod.rs rename to src/crypto/skw-crypto-zk-paillier/src/zkproofs/mod.rs diff --git a/crypto/skw-crypto-zk-paillier/src/zkproofs/utils.rs b/src/crypto/skw-crypto-zk-paillier/src/zkproofs/utils.rs similarity index 100% rename from crypto/skw-crypto-zk-paillier/src/zkproofs/utils.rs rename to src/crypto/skw-crypto-zk-paillier/src/zkproofs/utils.rs diff --git a/crypto/skw-crypto-zk-paillier/src/zkproofs/wi_dlog_proof.rs b/src/crypto/skw-crypto-zk-paillier/src/zkproofs/wi_dlog_proof.rs similarity index 100% rename from crypto/skw-crypto-zk-paillier/src/zkproofs/wi_dlog_proof.rs rename to src/crypto/skw-crypto-zk-paillier/src/zkproofs/wi_dlog_proof.rs diff --git a/src/full-node/skw-mpc-full-node/Cargo.toml b/src/full-node/skw-mpc-full-node/Cargo.toml new file mode 100644 index 0000000..249538d --- /dev/null +++ b/src/full-node/skw-mpc-full-node/Cargo.toml @@ -0,0 +1,48 @@ +[package] +name = "skw-mpc-full-node" +version = "0.1.7" +edition = "2021" +authors = ["Song Zhou "] +license = "GPL-3.0" +description = "Mpc pubsub implmenetation" +categories = ["asynchronous", "cryptography", "network-programming"] +keywords = ["round-based", "mpc", "protocol"] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +skw-mpc-full-swarm = { path = "../skw-mpc-full-swarm" } + +skw-crypto-curv = { path = "../../crypto/skw-crypto-curv", default-features = false} +skw-mpc-storage = { path = "../../storage/skw-mpc-storage" } +skw-mpc-leveldb = { path = "../../storage/skw-mpc-leveldb", optional = true} + +skw-mpc-node = { path = "../../crates/skw-mpc-node" } + +skw-mpc-protocol = { path = "../../crates/skw-mpc-protocol" } +skw-mpc-payload = { path = "../../crates/skw-mpc-payload" } +skw-mpc-auth = { path = "../../crates/skw-mpc-auth" } +skw-round-based = { path = "../../crates/skw-round-based" } + +libp2p = { git = "https://github.com/libp2p/rust-libp2p", version = "0.51.0", features = ["serde", "request-response", "macros", "noise", "mplex", "yamux", "tokio"]} +tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } + +thiserror = { version = "1.0.23", default-features = false } +serde = { version = "1.0", features = ["derive"], default-features = false } +futures = "0.3.1" +serde_json = "1.0" +log = "0.4.17" + +[dev-dependencies] +pretty_env_logger = "0.4.0" + +[features] +default = ["tcp-ws-transport", "skw-mpc-leveldb"] +tcp-ws-transport = ["libp2p/tcp", "libp2p/websocket", "tokio/rt-multi-thread", "libp2p/dns",] + +[[example]] +name = "node-full-node" +path = "examples/node_full.rs" +required-features = ["tcp-ws-transport"] diff --git a/crates/skw-mpc-payload/LICENSE b/src/full-node/skw-mpc-full-node/LICENSE similarity index 100% rename from crates/skw-mpc-payload/LICENSE rename to src/full-node/skw-mpc-full-node/LICENSE diff --git a/crates/skw-mpc-payload/README.md b/src/full-node/skw-mpc-full-node/README.md similarity index 100% rename from crates/skw-mpc-payload/README.md rename to src/full-node/skw-mpc-full-node/README.md diff --git a/crates/skw-mpc-node/examples/node_full.rs b/src/full-node/skw-mpc-full-node/examples/node_full.rs similarity index 93% rename from crates/skw-mpc-node/examples/node_full.rs rename to src/full-node/skw-mpc-full-node/examples/node_full.rs index 52c9269..bd049f2 100644 --- a/crates/skw-mpc-node/examples/node_full.rs +++ b/src/full-node/skw-mpc-full-node/examples/node_full.rs @@ -1,8 +1,6 @@ use futures::{channel::mpsc, StreamExt}; -use skw_mpc_node::{ - node::{full_node_event_loop, NodeClient}, - async_executor -}; +use skw_mpc_full_node::{full_node_event_loop, client::NodeClient}; +use skw_mpc_node::{async_executor}; #[tokio::main] async fn main() { diff --git a/src/full-node/skw-mpc-full-node/src/client.rs b/src/full-node/skw-mpc-full-node/src/client.rs new file mode 100644 index 0000000..3e82e6c --- /dev/null +++ b/src/full-node/skw-mpc-full-node/src/client.rs @@ -0,0 +1,71 @@ +use futures::{channel::{mpsc, oneshot}, SinkExt, StreamExt}; +use libp2p::{PeerId, Multiaddr}; + +use skw_mpc_node::{ + ClientRequest, + error::MpcNodeError +}; + +#[derive(Clone)] +pub struct NodeClient { + self_peer_id: Option, + external_request_sender: mpsc::Sender +} + +impl NodeClient { + pub fn new(external_request_sender: mpsc::Sender) -> Self { + Self { + self_peer_id: None, + external_request_sender, + } + } + + pub fn peer_id(&self) -> PeerId { + self.self_peer_id.unwrap() + } + + pub async fn bootstrap_node( + &mut self, + local_key: Option<[u8; 32]>, + listen_addr: String, + db_name: String, + ) -> mpsc::Receiver> { + let (result_sender, mut result_receiver) = mpsc::channel(0); + self.external_request_sender + .send(ClientRequest::BootstrapNode { local_key, listen_addr, db_name, result_sender }) + .await + .expect("mpc node exteranl request receiver not to be droppped"); + + // Result on the initial bootstrapping + let result = result_receiver.select_next_some().await; + match result { + Ok((peer_id, _peer_addr)) => { self.self_peer_id = Some(peer_id); }, + Err(e) => { log::error!("Node Throw Error {:?}", e); } + }; + result_receiver + } + + pub async fn shutdown(&mut self, node: PeerId) -> Result<(), MpcNodeError> { + let (result_sender, result_receiver) = oneshot::channel(); + self.external_request_sender + .send(ClientRequest::Shutdown { node, result_sender }) + .await + .expect("mpc node exteranl request receiver not to be droppped"); + + result_receiver + .await + .expect("mpc node not to dropped") + } + + pub async fn write_to_db(&mut self, node: PeerId, key: [u8; 32], value: Vec) -> Result<(), MpcNodeError> { + let (result_sender, result_receiver) = oneshot::channel(); + self.external_request_sender + .send(ClientRequest::PersisteResult { node, key, value, result_sender }) + .await + .expect("mpc node exteranl request receiver not to be droppped"); + + result_receiver + .await + .expect("mpc node not to dropped") + } +} diff --git a/src/full-node/skw-mpc-full-node/src/job_manager.rs b/src/full-node/skw-mpc-full-node/src/job_manager.rs new file mode 100644 index 0000000..4ff1cf3 --- /dev/null +++ b/src/full-node/skw-mpc-full-node/src/job_manager.rs @@ -0,0 +1,505 @@ +use std::{collections::HashMap, fmt::Debug}; + +use futures::{channel::{mpsc, oneshot}, StreamExt, TryStreamExt}; +use libp2p::{PeerId}; +use serde::{Serialize, de::DeserializeOwned}; + +use skw_crypto_curv::elliptic::curves::secp256_k1::Secp256k1; +use skw_crypto_curv::{BigInt, arithmetic::Converter}; + +use skw_mpc_payload::{CryptoHash, PayloadHeader, Payload, header::PayloadType}; +use skw_round_based::{async_runtime::AsyncProtocol, Msg}; +use skw_mpc_protocol::{gg20::state_machine::{keygen::{self, LocalKey}, sign::{self, SignManual, PartialSignature}}, key_refresh::{JoinMessage, RefreshMessage}}; + +use skw_mpc_node::{ + async_executor, MpcSwarmClient, MpcP2pRequest, MpcP2pResponse, ClientOutcome, + serde_support::{decode_payload, encode_payload, encode_key, encode_signature}, + error::{MpcNodeError, MpcProtocolError, NodeError}, wire_incoming_pipe, +}; + +type KeyGenMessage = Msg; +type SignOfflineMessage = Msg; +type PartialSignatureMessage = Msg; +type JoinMessageMsg = Msg; +type RefreshMessageMsg = Msg; + +// 'node should be the same as 'static for most of the time +pub struct JobManager<'node> { + local_peer_id: PeerId, + client: &'node mut MpcSwarmClient, + + // Protocol IO For KeyGen + keygen_protocol_incoming_channel: HashMap, std::io::Error>>>, + keygen_outgoing_sender: mpsc::UnboundedSender>, + + // Protocol IO For SignOffline + sign_offline_protocol_incoming_channel: HashMap, std::io::Error>>>, + sign_offline_outgoing_sender: mpsc::UnboundedSender>, + + sign_fianlize_partial_signature_incoming_channel: HashMap, std::io::Error>>>, + sign_fianlize_partial_signature_outgoing_sender: mpsc::UnboundedSender>, + + // Protocol IO For KeyRefresh + key_refresh_join_message_incoming_channel: HashMap, std::io::Error>>>, + key_refresh_join_message_outgoing_sender: mpsc::UnboundedSender>, + + key_refresh_refresh_message_incoming_channel: HashMap, std::io::Error>>>, + key_refresh_refresh_message_outgoing_sender: mpsc::UnboundedSender>, +} + +impl<'node> JobManager<'node> { + pub fn new( + local_peer_id: PeerId, + client: &'node mut MpcSwarmClient, + + keygen_outgoing_sender: mpsc::UnboundedSender>, + + sign_offline_outgoing_sender: mpsc::UnboundedSender>, + sign_fianlize_partial_signature_outgoing_sender: mpsc::UnboundedSender>, + + key_refresh_join_message_outgoing_sender: mpsc::UnboundedSender>, + key_refresh_refresh_message_outgoing_sender: mpsc::UnboundedSender>, + ) -> Self { + Self { + local_peer_id, + + client, + + keygen_protocol_incoming_channel: Default::default(), + keygen_outgoing_sender, + + sign_offline_protocol_incoming_channel: Default::default(), + sign_offline_outgoing_sender, + sign_fianlize_partial_signature_incoming_channel: Default::default(), + sign_fianlize_partial_signature_outgoing_sender, + + key_refresh_join_message_incoming_channel: Default::default(), + key_refresh_join_message_outgoing_sender, + + key_refresh_refresh_message_incoming_channel: Default::default(), + key_refresh_refresh_message_outgoing_sender, + } + } + + pub fn keygen_accept_new_job(&mut self, + key_shard_id: CryptoHash, + new_header: PayloadHeader, + result_sender: oneshot::Sender>, + ) { + let job_id = new_header.clone().payload_id; + let local_peer_id = self.local_peer_id.clone(); + let (incoming_sender, incoming_receiver) = mpsc::channel(2); + let outgoing_sender = self.keygen_outgoing_sender.clone(); + self.keygen_protocol_incoming_channel.insert(job_id, incoming_sender.clone()); + + // spin up the thread to handle these tasks + async_executor(async move { + let local_index = new_header.peers.iter() + .position(|p| p.0.clone() == local_peer_id) + .unwrap() + .saturating_add(1); + + match keygen::Keygen::new( + local_index.try_into().unwrap(), + new_header.t.saturating_sub(1), // we need to sub t by 1 - ref to kzen-curv's VSS impl + new_header.n + ) { + Ok(keygen_sm) => { + match AsyncProtocol::new(keygen_sm, + incoming_receiver, outgoing_sender, + new_header.clone() + ) + .run() + .await + { + Ok(local_key) => { + result_sender + .send(Ok(ClientOutcome::KeyGen { + peer_id: local_peer_id, + payload_id: new_header.payload_id, + key_shard_id, + local_key: encode_key(&local_key) + })) + .expect("result_receiver not to be dropped") + }, + Err(e) => { + result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::KeyGenError(e.to_string())))) + .expect("result_receiver not to be dropped"); + } + } + }, + Err(e) => { + result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::KeyGenError(e.to_string())))) + .expect("result_receiver not to be dropped"); + } + } + }); + } + + pub async fn sign_accept_new_job(&mut self, + key_shard_id: CryptoHash, + new_header: PayloadHeader, + + local_key: LocalKey, + message: CryptoHash, + result_sender: oneshot::Sender>, + ) { + let job_id = new_header.clone().payload_id; + let local_peer_id = self.local_peer_id.clone(); + + let (incoming_sender, incoming_receiver) = mpsc::channel(2); + let (incoming_partial_sig_sender, incoming_partial_sig_receiver) = mpsc::channel(2); + + let outgoing_sender = self.sign_offline_outgoing_sender.clone(); + let sign_fianlize_partial_signature_outgoing_sender = self.sign_fianlize_partial_signature_outgoing_sender.clone(); + + self.sign_fianlize_partial_signature_incoming_channel.insert(job_id, incoming_partial_sig_sender.clone()); + self.sign_offline_protocol_incoming_channel.insert(job_id, incoming_sender.clone()); + + // spin up the thread to handle these tasks + async_executor(async move { + let local_index: u16 = new_header.clone().peers.iter() + .position(|p| p.0.clone() == local_peer_id) + .unwrap() + .saturating_add(1) + .try_into().unwrap(); + + // TODO: we hardcode the node to call to peers + let peers_index = [1u16, 2u16]; + + match sign::OfflineStage::new( + local_index, peers_index.to_vec(), local_key + ) { + Ok(offline_sign_sm) => { + match AsyncProtocol::new(offline_sign_sm, + incoming_receiver, outgoing_sender, + new_header.clone() + ) + .run() + .await + { + Ok(completed_offline_stage) => { + match SignManual::new( + BigInt::from_bytes(&message[..]), + completed_offline_stage + ) { + Ok((signing, partial_signature)) => { + let mut sign_fianlize_header = new_header.clone(); + sign_fianlize_header.payload_type = PayloadType::SignFinalize; + + sign_fianlize_partial_signature_outgoing_sender + .unbounded_send(Payload { + payload_header: sign_fianlize_header, + body: Msg { + sender: local_index, receiver: None, + body: partial_signature + } + }) + .expect("sign_fianlize_partial_signature_outgoing_sender channel should not be dropped"); + + // let partial_sigs_payload: Vec> = + match incoming_partial_sig_receiver + .take(new_header.clone().peers.len() - 1) + .try_collect::>>() + .await + { + Ok(partial_sigs_payload) => { + let partial_sigs: Vec = partial_sigs_payload + .iter() + .map(|p| p.body.clone().body) + .collect(); + match signing + .complete(&partial_sigs) + { + Ok(sig) => { + result_sender + .send(Ok(ClientOutcome::Sign { + key_shard_id, + peer_id: local_peer_id, + payload_id: new_header.payload_id, + sig: encode_signature(&sig), + })) + .expect("result_receiver not to be dropped"); + }, + Err(e) => { + result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::SignError(e.to_string())))) + .expect("result_receiver not to be dropped") + } + } + }, + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::SignError(e.to_string())))) + .expect("result_receiver not to be dropped") + }; + }, + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::SignError(e.to_string())))) + .expect("result_receiver not to be dropped") + }; + }, + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::SignError(e.to_string())))) + .expect("result_receiver not to be dropped") + } + }, + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::SignError(e.to_string())))) + .expect("result_receiver not to be dropped") + }; + }); + } + + + pub async fn key_refresh_accept_new_job(&mut self, + key_shard_id: CryptoHash, + new_header: PayloadHeader, + + maybe_local_key: Option>, + + result_sender: oneshot::Sender>, + ) { + let job_id = new_header.clone().payload_id; + let local_peer_id = self.local_peer_id.clone(); + + let (incoming_join_msg_sender, incoming_join_msg_receiver) = mpsc::channel(2); + let (incoming_refresh_msg_sender, incoming_refresh_msg_receiver) = mpsc::channel(2); + + let joing_msg_outgoing = self.key_refresh_join_message_outgoing_sender.clone(); + let refresh_msg_outgoing = self.key_refresh_refresh_message_outgoing_sender.clone(); + + self.key_refresh_join_message_incoming_channel.insert(job_id, incoming_join_msg_sender.clone()); + self.key_refresh_refresh_message_incoming_channel.insert(job_id, incoming_refresh_msg_sender.clone()); + + // spin up the thread to handle these tasks + async_executor(async move { + let local_index: u16 = new_header.peers.iter() + .position(|p| p.0.clone() == local_peer_id) + .unwrap() + .saturating_add(1) + .try_into().unwrap(); + + match maybe_local_key { + Some(mut local_key) => { + // we are gonna rotate our key + + // 0. collect joinMessage + match incoming_join_msg_receiver + // For now - only one party is gonna issue the join message + .take(1) + .try_collect::>>() + .await + { + Ok(payload_join_msgs) => { + let join_msgs = payload_join_msgs.iter().map(|p| { + p.clone().body.body + }) + .collect::>(); + + match RefreshMessage::replace(&join_msgs, &mut local_key) { + // 1. build refresh message + Ok((refresh_msg, decryption_key)) => { + // 2. broadcast refreshMessage + refresh_msg_outgoing + .unbounded_send(Payload { + payload_header: new_header.clone(), + body: Msg { + sender: local_index, receiver: None, + body: refresh_msg.clone() + } + }) + .expect("refresh_msg_outgoing channel should not be dropped"); + + // 3. collect RefreshMessage + match incoming_refresh_msg_receiver + .take(new_header.clone().peers.len() - 1 - 1) + .try_collect::>>() + .await + { + + Ok(payload_refresh_msgs) => { + let mut refresh_msgs = payload_refresh_msgs.iter().map(|p| { + p.clone().body.body + }) + .collect::>(); + + // push the refresh msg of ourselves + refresh_msgs.push(refresh_msg); + + match RefreshMessage::collect( + &refresh_msgs, + &mut local_key, + decryption_key, + &join_msgs, + ) { + + Ok(_) => result_sender + .send(Ok(ClientOutcome::KeyRefresh { + peer_id: local_peer_id, + payload_id: new_header.payload_id, + key_shard_id, + new_key: encode_key(&local_key) + })) + .expect("result_receiver not to be dropped"), + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::KeyRefreshError(e.to_string())))) + .expect("result_receiver not to be dropped") + } + }, + + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::KeyRefreshError(e.to_string())))) + .expect("result_receiver not to be dropped") + } + + }, + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::KeyRefreshError(e.to_string())))) + .expect("result_receiver not to be dropped") + } + }, + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::KeyRefreshError(e.to_string())))) + .expect("result_receiver not to be dropped") + } + // return the new localKey + }, + + None => { + // we are initiating the rotation request + + // 1. build joinMsg + let (join_message, dk) = JoinMessage::distribute(local_index as u16); + + // 2. Broadcast joinMsg + joing_msg_outgoing + .unbounded_send(Payload { + payload_header: new_header.clone(), body: Msg { + sender: local_index, + receiver: None, + body: join_message.clone() + } + }) + .expect("joing_msg_outgoing channel should not be dropped"); + + // 3. collect refreshMessage + match incoming_refresh_msg_receiver + .take(new_header.clone().peers.len() - 1) + .try_collect::>>() + .await { + Ok(payload_refresh_msg) => { + let refresh_msgs = payload_refresh_msg.iter().map(|p| { + p.clone().body.body + }) + .collect::>(); + + let t = new_header.clone().t; + let n = new_header.clone().n; + + // 4. generate & return the new local key + match join_message.clone().collect( + &refresh_msgs, + dk, + &[join_message.clone()], + t.saturating_sub(1), n + ) { + Ok(k) => result_sender.send(Ok(ClientOutcome::KeyRefresh { + peer_id: local_peer_id, + key_shard_id, + payload_id: new_header.clone().payload_id, + new_key: encode_key(&k) + })) + .expect("result_receiver not to be dropped"), + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::KeyRefreshError(e.to_string())))) + .expect("result_receiver not to be dropped") + } + }, + Err(e) => result_sender + .send(Err(MpcNodeError::MpcProtocolError(MpcProtocolError::KeyRefreshError(e.to_string())))) + .expect("result_receiver not to be dropped") + } + } + } + }); + } + + pub async fn handle_incoming(&mut self, + raw_payload: &[u8], + ) -> Result<(), MpcNodeError> { + // Note: currently - we try to guess the type of the payload ... there might be another way + let maybe_keygen = wire_incoming_pipe!(KeyGenMessage, raw_payload, self.keygen_protocol_incoming_channel); + let maybe_sign_offline = wire_incoming_pipe!(SignOfflineMessage, raw_payload, self.sign_offline_protocol_incoming_channel); + let maybe_partial_sig = wire_incoming_pipe!(PartialSignatureMessage, raw_payload, self.sign_fianlize_partial_signature_incoming_channel); + let maybe_join_msg = wire_incoming_pipe!(JoinMessageMsg, raw_payload, self.key_refresh_join_message_incoming_channel); + let maybe_refresh_msg = wire_incoming_pipe!(RefreshMessageMsg, raw_payload, self.key_refresh_refresh_message_incoming_channel); + + if maybe_keygen || maybe_sign_offline || maybe_partial_sig || maybe_join_msg || maybe_refresh_msg { + Ok(()) + } else { + Err(MpcNodeError::NodeError(NodeError::InputUnknown)) + } + } + + pub async fn handle_outgoing(&mut self, + payload: Payload>, + ) -> Result<(), MpcNodeError> + where M: Clone + Serialize + DeserializeOwned + Debug + { + let local_peer_id = self.local_peer_id.clone(); + + match payload.body.receiver { + // this is a p2p message - only one receiver is assigned + Some(to) => { + if to < 1 && to > payload.payload_header.peers.len() as u16 { + return Err(MpcNodeError::NodeError(NodeError::InvalidOutgoingParameter)); + } + let to_peer = payload.payload_header.peers[(to - 1) as usize].clone(); + + self.client + .dial(to_peer.0, to_peer.1) + .await?; + + let mut payload_out = payload.clone(); + payload_out.payload_header.sender = local_peer_id; + if let MpcP2pResponse::RawMessage { status } = self.client + .send_request(to_peer.0, MpcP2pRequest::RawMessage { + payload: encode_payload(&payload_out) + }) + .await? + { + status?; + } else { + unreachable!() + } + }, + // this is a broadcast message + None => { + for peer in payload.clone().payload_header.peers { + if peer.0.to_string() != self.local_peer_id.to_string() { + self.client + .dial(peer.0, peer.1) + .await?; + + let mut payload_out = payload.clone(); + payload_out.payload_header.sender = local_peer_id; + if let MpcP2pResponse::RawMessage { status } = self.client + .send_request(peer.0, MpcP2pRequest::RawMessage { + payload: encode_payload(&payload_out) + }) + .await? + { + status?; + } else { + unreachable!() + } + } + } + } + } + + Ok(()) + } +} \ No newline at end of file diff --git a/src/full-node/skw-mpc-full-node/src/lib.rs b/src/full-node/skw-mpc-full-node/src/lib.rs new file mode 100644 index 0000000..b161578 --- /dev/null +++ b/src/full-node/skw-mpc-full-node/src/lib.rs @@ -0,0 +1,5 @@ +pub mod job_manager; +pub mod node; +pub mod client; + +pub use node::full_node_event_loop; \ No newline at end of file diff --git a/crates/skw-mpc-node/src/node/full.rs b/src/full-node/skw-mpc-full-node/src/node.rs similarity index 96% rename from crates/skw-mpc-node/src/node/full.rs rename to src/full-node/skw-mpc-full-node/src/node.rs index f12f970..09f6f22 100644 --- a/crates/skw-mpc-node/src/node/full.rs +++ b/src/full-node/skw-mpc-full-node/src/node.rs @@ -5,15 +5,17 @@ use libp2p::PeerId; use skw_crypto_curv::elliptic::curves::Secp256k1; use skw_mpc_payload::{header::PayloadType, PayloadHeader, CryptoHash}; use skw_mpc_protocol::gg20::state_machine::keygen::LocalKey; -use skw_mpc_storage::{default_mpc_storage_opt, run_db_server, DBOpIn, DBOpOut}; -use crate::{ +use skw_mpc_storage::{DBOpIn, DBOpOut}; +use skw_mpc_leveldb::{default_mpc_storage_opt, run_db_server}; + +use skw_mpc_full_swarm::new_swarm_node; + +use skw_mpc_node::{ async_executor, error::{MpcNodeError, NodeError}, - swarm::{ new_full_swarm_node }, - serde_support::{decode_key}, - node::client_request::ClientRequest, - node::client_outcome::ClientOutcome, wire_outgoing_pipe, + serde_support::decode_key, + ClientRequest, ClientOutcome, wire_outgoing_pipe, }; use super::job_manager::JobManager; @@ -95,7 +97,7 @@ pub async fn full_node_event_loop( let (storage_config, mut storage_in_sender) = default_mpc_storage_opt( db_name, false ); - run_db_server(storage_config); + run_db_server(storage_config).expect("abort full node if failed to open DB"); let db_in_chanel = storage_in_sender.clone(); async_executor(async move { @@ -109,7 +111,7 @@ pub async fn full_node_event_loop( mut job_assignment_receiver, mut swarm_message_receiver, mut swarm_termination_sender, - ) = new_full_swarm_node(local_key); + ) = new_swarm_node(local_key); async_executor(swarm_event_loop.run()); let mut interal_results = FuturesUnordered::new(); @@ -287,7 +289,7 @@ pub async fn full_node_event_loop( .send(Ok(())) .expect("result receiver not to be dropped"); } - ClientRequest::WriteToDB { node, key, value, result_sender } => { + ClientRequest::PersisteResult { node, key, value, result_sender } => { let (db_write_result_sender, db_write_result_receiver) = oneshot::channel(); db_in_channels @@ -311,6 +313,7 @@ pub async fn full_node_event_loop( } } } + ClientRequest::MpcRequest { .. } => unreachable!(), } } } diff --git a/src/full-node/skw-mpc-full-swarm/Cargo.toml b/src/full-node/skw-mpc-full-swarm/Cargo.toml new file mode 100644 index 0000000..9fe1cb1 --- /dev/null +++ b/src/full-node/skw-mpc-full-swarm/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "skw-mpc-full-swarm" +version = "0.1.7" +edition = "2021" +authors = ["Song Zhou "] +license = "GPL-3.0" +description = "Mpc pubsub implmenetation" +categories = ["asynchronous", "cryptography", "network-programming"] +keywords = ["round-based", "mpc", "protocol"] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +skw-mpc-payload = { path = "../../crates/skw-mpc-payload" } +skw-mpc-node = { path = "../../crates/skw-mpc-node" } +tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } +libp2p = { git = "https://github.com/libp2p/rust-libp2p", version = "0.51.0", features = ["serde", "request-response", "macros", ]} +log = "0.4.17" +futures = "0.3.1" diff --git a/crates/skw-mpc-storage/LICENSE b/src/full-node/skw-mpc-full-swarm/LICENSE similarity index 100% rename from crates/skw-mpc-storage/LICENSE rename to src/full-node/skw-mpc-full-swarm/LICENSE diff --git a/crates/skw-mpc-storage/README.md b/src/full-node/skw-mpc-full-swarm/README.md similarity index 100% rename from crates/skw-mpc-storage/README.md rename to src/full-node/skw-mpc-full-swarm/README.md diff --git a/crates/skw-mpc-node/src/swarm/event_loop.rs b/src/full-node/skw-mpc-full-swarm/src/event_loop.rs similarity index 69% rename from crates/skw-mpc-node/src/swarm/event_loop.rs rename to src/full-node/skw-mpc-full-swarm/src/event_loop.rs index fdffac6..e5d3d6d 100644 --- a/crates/skw-mpc-node/src/swarm/event_loop.rs +++ b/src/full-node/skw-mpc-full-swarm/src/event_loop.rs @@ -1,34 +1,27 @@ -use core::panic; use std::collections::{HashMap, hash_map::Entry}; use libp2p::{ swarm::{SwarmEvent, ConnectionHandlerUpgrErr}, PeerId, - Swarm, - multiaddr, + Swarm, multiaddr, request_response::{self, RequestId,}, Multiaddr, }; use futures::{StreamExt, SinkExt}; use futures::channel::{oneshot, mpsc}; -#[cfg(feature = "full-node")] -use skw_mpc_payload::CryptoHash; +use skw_mpc_payload::{PayloadHeader, CryptoHash}; -#[cfg(feature = "full-node")] -use skw_mpc_payload::{PayloadHeader}; - -use super::{ - behavior::{MpcSwarmBahavior, MpcSwarmBahaviorEvent, MpcP2pRequest, MpcP2pResponse}, - client::MpcSwarmCommand, +use skw_mpc_node::{ + MpcSwarmBahavior, MpcSwarmBahaviorEvent, MpcP2pRequest, MpcP2pResponse, + MpcSwarmCommand, }; -use crate::error::{ MpcNodeError, SwarmError, SwarmP2pError }; +use skw_mpc_node::error::{ MpcNodeError, SwarmError, SwarmP2pError }; pub struct MpcSwarmEventLoop { swarm: Swarm, swarm_incoming_message_sender: mpsc::UnboundedSender< Vec >, - #[cfg(feature = "full-node")] swarm_incoming_job_sender: mpsc::Sender <(PayloadHeader, CryptoHash)>, command_receiver: mpsc::UnboundedReceiver, @@ -46,7 +39,6 @@ impl MpcSwarmEventLoop { swarm_incoming_message_sender: mpsc::UnboundedSender< Vec >, - #[cfg(feature = "full-node")] swarm_incoming_job_sender: mpsc::Sender <(PayloadHeader, CryptoHash)>, command_receiver: mpsc::UnboundedReceiver, @@ -59,8 +51,7 @@ impl MpcSwarmEventLoop { swarm, swarm_incoming_message_sender, - - #[cfg(feature = "full-node")] + swarm_incoming_job_sender, command_receiver, @@ -149,73 +140,60 @@ impl MpcSwarmEventLoop { request, channel, request_id } => { match request { - MpcP2pRequest::StartJob { - #[cfg(feature = "full-node")] - job_header, - #[cfg(feature = "full-node")] - auth_header, - .. - } => { + MpcP2pRequest::StartJob { job_header, auth_header, ..} => { - #[cfg(feature = "full-node")] - { - // if the auth_header is invalid - send error - if !auth_header.validate() { - // if false { - log::error!("Received Invalid AuthHeader"); - match self.swarm - .behaviour_mut() - .request_response - .send_response(channel, MpcP2pResponse::StartJob { - status: Err(MpcNodeError::SwarmP2pError(SwarmP2pError::BadAuthHeader)) - }) - { - Ok(_) => {} - Err(response) => { - log::debug!("Mpc StartJob Reponse channel closed {:?}", response); - self - .pending_request - .remove(&request_id) - .expect("client request channel to still be pending.") - .send(Err(MpcNodeError::SwarmP2pError(SwarmP2pError::ResponseChannelClose))) - .expect("p2p response receiver not to be dropped"); - } - } - } else { - for (peer, address) in job_header.peers.iter() { - self.swarm - .behaviour_mut() - .request_response - .add_address(peer, address.clone()); + // if the auth_header is invalid - send error + if !auth_header.validate() { + // if false { + log::error!("Received Invalid AuthHeader"); + match self.swarm + .behaviour_mut() + .request_response + .send_response(channel, MpcP2pResponse::StartJob { + status: Err(MpcNodeError::SwarmP2pError(SwarmP2pError::BadAuthHeader)) + }) + { + Ok(_) => {} + Err(response) => { + log::debug!("Mpc StartJob Reponse channel closed {:?}", response); + self + .pending_request + .remove(&request_id) + .expect("client request channel to still be pending.") + .send(Err(MpcNodeError::SwarmP2pError(SwarmP2pError::ResponseChannelClose))) + .expect("p2p response receiver not to be dropped"); } - - match self.swarm + } + } else { + for (peer, address) in job_header.peers.iter() { + self.swarm .behaviour_mut() .request_response - .send_response(channel, MpcP2pResponse::StartJob { - status: Ok(()) - }) - { - Ok(_) => self.swarm_incoming_job_sender - .send((job_header, auth_header.key_shard_id())) - .await - .expect("swarm_incoming_job_sender should not be dropped. qed."), - Err(response) => { - log::debug!("Mpc StartJob Reponse channel closed {:?}", response); - self - .pending_request - .remove(&request_id) - .expect("client request channel to still be pending.") - .send(Err(MpcNodeError::SwarmP2pError(SwarmP2pError::ResponseChannelClose))) - .expect("p2p response receiver not to be dropped"); - } - } - }; - } + .add_address(peer, address.clone()); + } - // NOP for light node - light node client never receive StartJob Request - #[cfg(feature = "light-node")] - {} + match self.swarm + .behaviour_mut() + .request_response + .send_response(channel, MpcP2pResponse::StartJob { + status: Ok(()) + }) + { + Ok(_) => self.swarm_incoming_job_sender + .send((job_header, auth_header.key_shard_id())) + .await + .expect("swarm_incoming_job_sender should not be dropped. qed."), + Err(response) => { + log::debug!("Mpc StartJob Reponse channel closed {:?}", response); + self + .pending_request + .remove(&request_id) + .expect("client request channel to still be pending.") + .send(Err(MpcNodeError::SwarmP2pError(SwarmP2pError::ResponseChannelClose))) + .expect("p2p response receiver not to be dropped"); + } + } + }; }, MpcP2pRequest::RawMessage { payload } => { diff --git a/src/full-node/skw-mpc-full-swarm/src/lib.rs b/src/full-node/skw-mpc-full-swarm/src/lib.rs new file mode 100644 index 0000000..f9de8da --- /dev/null +++ b/src/full-node/skw-mpc-full-swarm/src/lib.rs @@ -0,0 +1,67 @@ +pub mod event_loop; + +use event_loop::MpcSwarmEventLoop; +use libp2p::{ identity, PeerId, Multiaddr }; + +use futures::channel::mpsc; + +use skw_mpc_node::{MpcSwarmClient, build_swarm}; +use skw_mpc_payload::{PayloadHeader, CryptoHash}; + +pub fn new_swarm_node( + local_key: Option<[u8; 32]> +) -> ( + PeerId, // local peer id + + MpcSwarmClient, + MpcSwarmEventLoop, + + mpsc::Receiver< Multiaddr >, + mpsc::Receiver< (PayloadHeader, CryptoHash) >, // new job assignment channel - receiver side + mpsc::UnboundedReceiver< Vec >, // main message incoming channel + + mpsc::Sender<()>, // swarm termination +) { + let local_key = match local_key { + None => identity::Keypair::generate_ed25519(), + Some(key) => { + identity::Keypair::ed25519_from_bytes(key).unwrap() + } + }; + + let local_peer_id = PeerId::from(local_key.public()); + // eprintln!("Local peer id: {local_peer_id}"); + + let swarm = build_swarm(local_key); + + // the main message INCOMING channel + let (swarm_incoming_message_sender, swarm_incoming_message_receiver) = mpsc::unbounded(); + + // the new job notifier + let (swarm_incoming_job_sender, swarm_incoming_job_receiver) = mpsc::channel(0); + + // the main outgoing channel + // we give it one buffer so that outgoing can be synced + let (command_sender, command_receiver) = mpsc::unbounded(); + + let (addr_sender, addr_receiver) = mpsc::channel(0); + + let (swarm_termination_sender, swarm_termination_receiver) = mpsc::channel(0); + ( + local_peer_id, + MpcSwarmClient { command_sender }, + MpcSwarmEventLoop::new( + swarm, + swarm_incoming_message_sender, + swarm_incoming_job_sender, + command_receiver, + addr_sender, + swarm_termination_receiver + ), + + addr_receiver, + swarm_incoming_job_receiver, + swarm_incoming_message_receiver, + swarm_termination_sender, + ) +} diff --git a/src/light-node/skw-mpc-light-node/Cargo.toml b/src/light-node/skw-mpc-light-node/Cargo.toml new file mode 100644 index 0000000..f88e4fd --- /dev/null +++ b/src/light-node/skw-mpc-light-node/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "skw-mpc-light-node" +version = "0.1.7" +edition = "2021" +authors = ["Song Zhou "] +license = "GPL-3.0" +description = "Mpc pubsub implmenetation" +categories = ["asynchronous", "cryptography", "network-programming"] +keywords = ["round-based", "mpc", "protocol"] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +skw-mpc-light-swarm = { path = "../skw-mpc-light-swarm" } + +skw-crypto-curv = { path = "../../crypto/skw-crypto-curv", default-features = false} +skw-mpc-storage = { path = "../../storage/skw-mpc-storage" } +skw-mpc-node = { path = "../../crates/skw-mpc-node" } + +skw-mpc-protocol = { path = "../../crates/skw-mpc-protocol" } +skw-mpc-payload = { path = "../../crates/skw-mpc-payload" } +skw-mpc-auth = { path = "../../crates/skw-mpc-auth" } +skw-round-based = { path = "../../crates/skw-round-based" } + +libp2p = { git = "https://github.com/libp2p/rust-libp2p", version = "0.51.0", features = ["serde", "request-response", "macros", "noise", "mplex", "yamux", "tokio"]} +tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } + +thiserror = { version = "1.0.23", default-features = false } +serde = { version = "1.0", features = ["derive"], default-features = false } +futures = "0.3.1" +serde_json = "1.0" +log = "0.4.17" + +[dev-dependencies] +pretty_env_logger = "0.4.0" + +[features] +default = ["tcp-ws-transport"] +tcp-ws-transport = ["libp2p/tcp", "libp2p/websocket", "tokio/rt-multi-thread", "libp2p/dns",] + +[[example]] +name = "node-light-node" +path = "examples/node_light.rs" +required-features = ["tcp-ws-transport"] diff --git a/crates/skw-round-based/LICENSE b/src/light-node/skw-mpc-light-node/LICENSE similarity index 100% rename from crates/skw-round-based/LICENSE rename to src/light-node/skw-mpc-light-node/LICENSE diff --git a/src/light-node/skw-mpc-light-node/README.md b/src/light-node/skw-mpc-light-node/README.md new file mode 100644 index 0000000..e69de29 diff --git a/crates/skw-mpc-node/examples/node_light.rs b/src/light-node/skw-mpc-light-node/examples/node_light.rs similarity index 96% rename from crates/skw-mpc-node/examples/node_light.rs rename to src/light-node/skw-mpc-light-node/examples/node_light.rs index 105fe14..760921d 100644 --- a/crates/skw-mpc-node/examples/node_light.rs +++ b/src/light-node/skw-mpc-light-node/examples/node_light.rs @@ -1,8 +1,7 @@ use futures::{channel::mpsc, StreamExt}; -use skw_mpc_node::{ - node::{NodeClient, light_node_event_loop}, - async_executor, serde_support::decode_key -}; +use skw_mpc_light_node::{light_node_event_loop, client::NodeClient}; +use skw_mpc_node::{async_executor, serde_support::decode_key}; + use skw_mpc_payload::{PayloadHeader, header::PayloadType, AuthHeader}; use std::{thread, time}; diff --git a/crates/skw-mpc-node/src/node/client.rs b/src/light-node/skw-mpc-light-node/src/client.rs similarity index 90% rename from crates/skw-mpc-node/src/node/client.rs rename to src/light-node/skw-mpc-light-node/src/client.rs index 662f7d6..c4b514c 100644 --- a/crates/skw-mpc-node/src/node/client.rs +++ b/src/light-node/skw-mpc-light-node/src/client.rs @@ -1,13 +1,10 @@ use futures::{channel::{mpsc, oneshot}, SinkExt, StreamExt}; use libp2p::{PeerId, Multiaddr}; -use crate::error::MpcNodeError; - -use super::ClientRequest; - -#[cfg(feature = "light-node")] -use super::client_outcome::ClientOutcome; -#[cfg(feature = "light-node")] +use skw_mpc_node::{ + ClientRequest, + error::MpcNodeError, ClientOutcome +}; use skw_mpc_payload::{PayloadHeader, AuthHeader}; #[derive(Clone)] @@ -49,28 +46,22 @@ impl NodeClient { result_receiver } - #[cfg(feature = "light-node")] - pub async fn send_request( - &mut self, - payload_header: PayloadHeader, - auth_header: AuthHeader, - maybe_local_key: Option>, - ) -> Result { - let from = self.self_peer_id.unwrap(); + pub async fn shutdown(&mut self, node: PeerId) -> Result<(), MpcNodeError> { let (result_sender, result_receiver) = oneshot::channel(); self.external_request_sender - .send(ClientRequest::MpcRequest { from, payload_header, auth_header, maybe_local_key, result_sender}) + .send(ClientRequest::Shutdown { node, result_sender }) .await .expect("mpc node exteranl request receiver not to be droppped"); - result_receiver.await + result_receiver + .await .expect("mpc node not to dropped") } - pub async fn shutdown(&mut self, node: PeerId) -> Result<(), MpcNodeError> { + pub async fn write_to_db(&mut self, node: PeerId, key: [u8; 32], value: Vec) -> Result<(), MpcNodeError> { let (result_sender, result_receiver) = oneshot::channel(); self.external_request_sender - .send(ClientRequest::Shutdown { node, result_sender }) + .send(ClientRequest::PersisteResult { node, key, value, result_sender }) .await .expect("mpc node exteranl request receiver not to be droppped"); @@ -79,16 +70,20 @@ impl NodeClient { .expect("mpc node not to dropped") } - #[cfg(feature = "full-node")] - pub async fn write_to_db(&mut self, node: PeerId, key: [u8; 32], value: Vec) -> Result<(), MpcNodeError> { + pub async fn send_request( + &mut self, + payload_header: PayloadHeader, + auth_header: AuthHeader, + maybe_local_key: Option>, + ) -> Result { + let from = self.self_peer_id.unwrap(); let (result_sender, result_receiver) = oneshot::channel(); self.external_request_sender - .send(ClientRequest::WriteToDB { node, key, value, result_sender }) + .send(ClientRequest::MpcRequest { from, payload_header, auth_header, maybe_local_key, result_sender}) .await .expect("mpc node exteranl request receiver not to be droppped"); - result_receiver - .await + result_receiver.await .expect("mpc node not to dropped") } } diff --git a/crates/skw-mpc-node/src/node/job_manager.rs b/src/light-node/skw-mpc-light-node/src/job_manager.rs similarity index 99% rename from crates/skw-mpc-node/src/node/job_manager.rs rename to src/light-node/skw-mpc-light-node/src/job_manager.rs index ba28f2b..78b5a6b 100644 --- a/crates/skw-mpc-node/src/node/job_manager.rs +++ b/src/light-node/skw-mpc-light-node/src/job_manager.rs @@ -7,28 +7,22 @@ use serde::{Serialize, de::DeserializeOwned}; use skw_crypto_curv::elliptic::curves::secp256_k1::Secp256k1; use skw_crypto_curv::{BigInt, arithmetic::Converter}; -use skw_mpc_payload::{CryptoHash, PayloadHeader, Payload, header::PayloadType}; +use skw_mpc_payload::{CryptoHash, PayloadHeader, Payload, header::PayloadType, AuthHeader}; use skw_round_based::{async_runtime::AsyncProtocol, Msg}; use skw_mpc_protocol::{gg20::state_machine::{keygen::{self, LocalKey}, sign::{self, SignManual, PartialSignature}}, key_refresh::{JoinMessage, RefreshMessage}}; -use crate::{ - async_executor, - swarm::{MpcSwarmClient, MpcP2pRequest, MpcP2pResponse}, +use skw_mpc_node::{ + async_executor, MpcSwarmClient, MpcP2pRequest, MpcP2pResponse, ClientOutcome, serde_support::{decode_payload, encode_payload, encode_key, encode_signature}, error::{MpcNodeError, MpcProtocolError, NodeError}, wire_incoming_pipe, }; -use crate::node::client_outcome::ClientOutcome; - type KeyGenMessage = Msg; type SignOfflineMessage = Msg; type PartialSignatureMessage = Msg; type JoinMessageMsg = Msg; type RefreshMessageMsg = Msg; -#[cfg(feature = "light-node")] -use skw_mpc_payload::AuthHeader; - // 'node should be the same as 'static for most of the time pub struct JobManager<'node> { local_peer_id: PeerId, @@ -87,7 +81,6 @@ impl<'node> JobManager<'node> { } } - #[cfg(feature = "light-node")] pub async fn init_new_job(&mut self, new_auth_header: AuthHeader, new_header: PayloadHeader, diff --git a/src/light-node/skw-mpc-light-node/src/lib.rs b/src/light-node/skw-mpc-light-node/src/lib.rs new file mode 100644 index 0000000..0ce1ef3 --- /dev/null +++ b/src/light-node/skw-mpc-light-node/src/lib.rs @@ -0,0 +1,5 @@ +pub mod job_manager; +pub mod node; +pub mod client; + +pub use node::light_node_event_loop; \ No newline at end of file diff --git a/crates/skw-mpc-node/src/node/light.rs b/src/light-node/skw-mpc-light-node/src/node.rs similarity index 97% rename from crates/skw-mpc-node/src/node/light.rs rename to src/light-node/skw-mpc-light-node/src/node.rs index c8b73c8..3f7b6e8 100644 --- a/crates/skw-mpc-node/src/node/light.rs +++ b/src/light-node/skw-mpc-light-node/src/node.rs @@ -2,17 +2,16 @@ use std::collections::HashMap; use futures::{channel::{oneshot, mpsc}, StreamExt, SinkExt}; use libp2p::PeerId; + use skw_mpc_payload::{header::PayloadType, PayloadHeader, AuthHeader, CryptoHash}; -use crate::{ +use skw_mpc_light_swarm::new_swarm_node; + +use skw_mpc_node::{ async_executor, - node::client_request::{ClientRequest}, - node::client_outcome::ClientOutcome, error::{MpcNodeError, NodeError}, - swarm::{ new_light_swarm_node }, serde_support::decode_key, - - wire_outgoing_pipe, + ClientRequest, ClientOutcome, wire_outgoing_pipe, }; use super::job_manager::JobManager; @@ -52,6 +51,7 @@ async fn assign_job( Ok(()) } + pub async fn light_node_event_loop( mut client_in: mpsc::Receiver ) { @@ -87,7 +87,7 @@ pub async fn light_node_event_loop( mut addr_receiver, mut swarm_message_receiver, mut swarm_termination_sender, - ) = new_light_swarm_node(local_key); + ) = new_swarm_node(local_key); async_executor(swarm_event_loop.run()); swarm_client.start_listening(listen_addr.parse().expect("address need to be valid")) @@ -207,6 +207,9 @@ pub async fn light_node_event_loop( .send(Ok(())) .expect("result receiver not to be dropped"); } + + // NOP for light client + ClientRequest::PersisteResult { .. } => { } } } } diff --git a/src/light-node/skw-mpc-light-swarm/Cargo.toml b/src/light-node/skw-mpc-light-swarm/Cargo.toml new file mode 100644 index 0000000..f6cb6f5 --- /dev/null +++ b/src/light-node/skw-mpc-light-swarm/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "skw-mpc-light-swarm" +version = "0.1.7" +edition = "2021" +authors = ["Song Zhou "] +license = "GPL-3.0" +description = "Mpc pubsub implmenetation" +categories = ["asynchronous", "cryptography", "network-programming"] +keywords = ["round-based", "mpc", "protocol"] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +skw-mpc-payload = { path = "../../crates/skw-mpc-payload" } +skw-mpc-node = { path = "../../crates/skw-mpc-node" } +tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } +libp2p = { git = "https://github.com/libp2p/rust-libp2p", version = "0.51.0", features = ["serde", "request-response", "macros", ]} +log = "0.4.17" +futures = "0.3.1" diff --git a/src/light-node/skw-mpc-light-swarm/LICENSE b/src/light-node/skw-mpc-light-swarm/LICENSE new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/src/light-node/skw-mpc-light-swarm/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/src/light-node/skw-mpc-light-swarm/README.md b/src/light-node/skw-mpc-light-swarm/README.md new file mode 100644 index 0000000..e69de29 diff --git a/crates/skw-mpc-client/src/swarm/event_loop.rs b/src/light-node/skw-mpc-light-swarm/src/event_loop.rs similarity index 52% rename from crates/skw-mpc-client/src/swarm/event_loop.rs rename to src/light-node/skw-mpc-light-swarm/src/event_loop.rs index 7a1bfea..0c09e7b 100644 --- a/crates/skw-mpc-client/src/swarm/event_loop.rs +++ b/src/light-node/skw-mpc-light-swarm/src/event_loop.rs @@ -1,56 +1,56 @@ -use core::panic; use std::collections::{HashMap, hash_map::Entry}; use libp2p::{ swarm::{SwarmEvent, ConnectionHandlerUpgrErr}, PeerId, - Swarm, - multiaddr, - request_response::{self, RequestId,}, + Swarm, multiaddr, + request_response::{self, RequestId,}, Multiaddr, }; -use futures::{StreamExt, FutureExt}; +use futures::{StreamExt, SinkExt}; use futures::channel::{oneshot, mpsc}; -#[cfg(feature = "full-node")] -use skw_mpc_node::node::NodeClient; - -use crate::error::{MpcClientError, SwarmError, SwarmP2pError}; - -use super::{ - behavior::{MpcSwarmBahavior, MpcSwarmBahaviorEvent, MpcP2pRequest, MpcP2pResponse}, - client::MpcSwarmCommand, +use skw_mpc_node::{ + MpcSwarmBahavior, MpcSwarmBahaviorEvent, MpcP2pRequest, MpcP2pResponse, + MpcSwarmCommand, }; -pub struct MpcSwarmEventLoop { - #[cfg(feature = "full-node")] - light_node_client: NodeClient, +use skw_mpc_node::error::{ MpcNodeError, SwarmError, SwarmP2pError }; +pub struct MpcSwarmEventLoop { swarm: Swarm, + + swarm_incoming_message_sender: mpsc::UnboundedSender< Vec >, + command_receiver: mpsc::UnboundedReceiver, - pending_dial: HashMap>>, - pending_request: HashMap>>, + pending_dial: HashMap>>, + pending_request: HashMap>>, + + listen_to_addr_sender: mpsc::Sender< Multiaddr >, swarm_termination_receiver: mpsc::Receiver<()>, } impl MpcSwarmEventLoop { pub fn new( - // Assume node is bootstrapped and running well - #[cfg(feature = "full-node")] - light_node_client: NodeClient, - swarm: Swarm, + + swarm_incoming_message_sender: mpsc::UnboundedSender< Vec >, + command_receiver: mpsc::UnboundedReceiver, + + listen_to_addr_sender: mpsc::Sender< Multiaddr >, + swarm_termination_receiver: mpsc::Receiver<()>, ) -> Self { Self { - #[cfg(feature = "full-node")] - light_node_client, + swarm, - swarm, + swarm_incoming_message_sender, + command_receiver, pending_dial: Default::default(), pending_request: Default::default(), + listen_to_addr_sender, swarm_termination_receiver, } } @@ -59,7 +59,7 @@ impl MpcSwarmEventLoop { loop { futures::select! { // events are INCOMING Streams for the node raw events - event = self.swarm.select_next_some().fuse() => { + event = self.swarm.select_next_some() => { self.handle_event(event).await; }, @@ -85,6 +85,10 @@ impl MpcSwarmEventLoop { // general network SwarmEvent::NewListenAddr { address, .. } => { let local_peer_id = self.swarm.local_peer_id().clone(); + self.listen_to_addr_sender + .send(address.clone().with(multiaddr::Protocol::P2p(local_peer_id.into()))) + .await + .expect("local address receiver not to be dropped"); log::info!( "Local node is listening on {:?}", address.with(multiaddr::Protocol::P2p(local_peer_id.into())) @@ -93,6 +97,7 @@ impl MpcSwarmEventLoop { SwarmEvent::ConnectionEstablished { peer_id, endpoint, .. } => { + log::debug!("ConnectionEstablished {:?}", peer_id); if endpoint.is_dialer() { if let Some(sender) = self.pending_dial.remove(&peer_id) { let _ = sender @@ -109,7 +114,7 @@ impl MpcSwarmEventLoop { if let Some(sender) = self.pending_dial.remove(&peer_id) { log::error!("OutgoingConnectionError Error {:?}", error); sender - .send(Err(MpcClientError::SwarmError(SwarmError::FailToDailPeer))) + .send(Err(MpcNodeError::SwarmError(SwarmError::FailToDailPeer))) .expect("dailing result receiver not to be dropped"); } } @@ -120,82 +125,57 @@ impl MpcSwarmEventLoop { // p2p events SwarmEvent::Behaviour(MpcSwarmBahaviorEvent::RequestResponse( request_response::Event::Message { message, .. }, - )) => { - match message { - // p2p message request hanlder - request_response::Message::Request { - #[cfg(feature = "full-node")] - request_id, - #[cfg(feature = "full-node")] - request, - #[cfg(feature = "full-node")] - channel, .. - } => { - #[cfg(feature = "full-node")] - match request { - MpcP2pRequest::Mpc { auth_header, job_header, maybe_local_key } => { - match self.light_node_client.send_request( - job_header, auth_header, maybe_local_key - ) - .await - { - Ok(client_outcome) => match self.swarm - .behaviour_mut() - .request_response - .send_response(channel, MpcP2pResponse::Mpc { - payload: Ok(client_outcome.payload()) - }) - { - Ok(_) => { } // let the - Response - section take over - Err(response) => { - log::debug!("Mpc StartJob Reponse channel closed {:?}", response); - self - .pending_request - .remove(&request_id) - .expect("client request channel to still be pending.") - .send(Err(MpcClientError::SwarmP2pError(SwarmP2pError::ResponseChannelClose))) - .expect("p2p response receiver not to be dropped"); - } - }, - - Err(e) => { - match self.swarm - .behaviour_mut() - .request_response - .send_response(channel, MpcP2pResponse::Mpc { payload: Err(MpcClientError::MpcNodeError(e.to_string()))}) - { - Ok(_) => { } // let the - Response - section take over - Err(response) => { - log::debug!("Mpc StartJob Reponse channel closed {:?}", response); - self - .pending_request - .remove(&request_id) - .expect("client request channel to still be pending.") - .send(Err(MpcClientError::SwarmP2pError(SwarmP2pError::ResponseChannelClose))) - .expect("p2p response receiver not to be dropped"); - } - } - } - - } - }, - } - - // Light Node never receive requests - #[cfg(feature = "light-node")] - {} + )) => match message { + + // p2p message request hanlder + request_response::Message::Request { + request, channel, request_id + } => { + match request { + // NOP for light node for StartJob + MpcP2pRequest::StartJob { ..} => { }, + + MpcP2pRequest::RawMessage { payload } => { + self.swarm_incoming_message_sender + .unbounded_send( payload ) + .expect("swarm_incoming_message_sender should not be dropped. qed."); + + match self.swarm + .behaviour_mut() + .request_response + .send_response(channel, MpcP2pResponse::RawMessage { + status: Ok(()) + }) + { + Ok(_) => {} + Err(response) => { + log::debug!("Mpc RawMessage Reponse channel closed {:?}", response); + self + .pending_request + .remove(&request_id) + .expect("client request channel to still be pending.") + .send(Err(MpcNodeError::SwarmP2pError(SwarmP2pError::ResponseChannelClose))) + .expect("p2p response receiver not to be dropped"); + } + } + }, } + } - // p2p message response hanlder - request_response::Message::Response { request_id, response } => { - let _ = self - .pending_request - .remove(&request_id) - .expect("Request to still be pending.") - .send(Ok(response)); - } + // p2p message response hanlder + request_response::Message::Response { + request_id, + response, + } => { + self + .pending_request + .remove(&request_id) + .expect("Request to still be pending.") + .send(Ok(response)) + .expect("p2p response receiver not to be dropped"); } }, + // p2p message misc handler SwarmEvent::Behaviour(MpcSwarmBahaviorEvent::RequestResponse( request_response::Event::OutboundFailure { @@ -207,7 +187,7 @@ impl MpcSwarmEventLoop { .pending_request .remove(&request_id) .expect("Request to still be pending.") - .send(Err(MpcClientError::SwarmP2pError(SwarmP2pError::OutboundFailure))) + .send(Err(MpcNodeError::SwarmP2pError(SwarmP2pError::OutboundFailure))) .expect("p2p response receiver not to be dropped"); } SwarmEvent::Behaviour(MpcSwarmBahaviorEvent::RequestResponse( @@ -220,12 +200,11 @@ impl MpcSwarmEventLoop { async fn handle_command(&mut self, request: MpcSwarmCommand) { match request { - #[cfg(feature = "full-node")] MpcSwarmCommand::StartListening { addr, result_sender } => { let res = self.swarm.listen_on(addr) .map_err(|e| { log::error!("Listen Error {:?}", e); - MpcClientError::SwarmError(SwarmError::FailToListenToAddress) + MpcNodeError::SwarmError(SwarmError::FailToListenToAddress) }) .map(|_| ()); result_sender @@ -246,13 +225,13 @@ impl MpcSwarmEventLoop { Ok(_) => { e.insert(result_sender); }, Err(error) => { log::error!("Dailing Error {:?}", error); - result_sender.send(Err(MpcClientError::SwarmError(SwarmError::FailToDailPeer))) + result_sender.send(Err(MpcNodeError::SwarmError(SwarmError::FailToDailPeer))) .expect("swarm command result receiver not to be dropped"); } } } else { result_sender - .send(Err(MpcClientError::SwarmError(SwarmError::AlreadyDailingPeer))) + .send(Err(MpcNodeError::SwarmError(SwarmError::AlreadyDailingPeer))) .expect("swarm command result receiver not to be dropped"); } }, diff --git a/src/light-node/skw-mpc-light-swarm/src/lib.rs b/src/light-node/skw-mpc-light-swarm/src/lib.rs new file mode 100644 index 0000000..90cbd6e --- /dev/null +++ b/src/light-node/skw-mpc-light-swarm/src/lib.rs @@ -0,0 +1,60 @@ +pub mod event_loop; + +use crate::event_loop::MpcSwarmEventLoop; +use libp2p::{ identity, PeerId, Multiaddr }; + +use futures::channel::mpsc; + +use skw_mpc_node::{MpcSwarmClient, build_swarm}; + +pub fn new_swarm_node( + local_key: Option<[u8; 32]> +) -> ( + PeerId, // local peer id + + MpcSwarmClient, + MpcSwarmEventLoop, + + mpsc::Receiver< Multiaddr >, + mpsc::UnboundedReceiver< Vec >, // main message incoming channel + + mpsc::Sender<()>, // swarm termination +) { + let local_key = match local_key { + None => identity::Keypair::generate_ed25519(), + Some(key) => { + identity::Keypair::ed25519_from_bytes(key).unwrap() + } + }; + + let local_peer_id = PeerId::from(local_key.public()); + // eprintln!("Local peer id: {local_peer_id}"); + + let swarm = build_swarm(local_key); + + // the new job notifier + let (swarm_incoming_message_sender, swarm_incoming_message_receiver) = mpsc::unbounded(); + + // the main outgoing channel + // we give it one buffer so that outgoing can be synced + let (command_sender, command_receiver) = mpsc::unbounded(); + + let (addr_sender, addr_receiver) = mpsc::channel(0); + + let (swarm_termination_sender, swarm_termination_receiver) = mpsc::channel(0); + ( + local_peer_id, + MpcSwarmClient { command_sender }, + MpcSwarmEventLoop::new( + swarm, + swarm_incoming_message_sender, + command_receiver, + addr_sender, + swarm_termination_receiver + ), + + addr_receiver, + swarm_incoming_message_receiver, + swarm_termination_sender, + ) +} diff --git a/crates/skw-mpc-storage/Cargo.toml b/src/storage/skw-mpc-leveldb/Cargo.toml similarity index 80% rename from crates/skw-mpc-storage/Cargo.toml rename to src/storage/skw-mpc-leveldb/Cargo.toml index 7cf455c..42da2ff 100644 --- a/crates/skw-mpc-storage/Cargo.toml +++ b/src/storage/skw-mpc-leveldb/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "skw-mpc-storage" +name = "skw-mpc-leveldb" version = "0.1.7" edition = "2021" authors = ["SkyeKiwi "] @@ -13,12 +13,12 @@ all-features = true rustdoc-args = ["--cfg", "docsrs"] [dependencies] -serde = { version = "1.0", features = ["derive"], default-features = false } -async-std = { version = "1.12.0", features = ["attributes"] } -thiserror = { version = "1.0.23", default-features = false } -futures = "0.3.1" +skw-mpc-storage = { path = "../skw-mpc-storage" } +tokio = { version = "1.25", default-features = false, features = ["rt", "macros"] } +serde = { version = "1.0", features = ["derive"], default-features = false } rusty-leveldb = { version = "1.0.6", default-features = false, optional = true} +futures = "0.3.1" [features] default = ["leveldb-backend"] diff --git a/src/storage/skw-mpc-leveldb/LICENSE b/src/storage/skw-mpc-leveldb/LICENSE new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/src/storage/skw-mpc-leveldb/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/src/storage/skw-mpc-leveldb/README.md b/src/storage/skw-mpc-leveldb/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/storage/skw-mpc-leveldb/src/lib.rs b/src/storage/skw-mpc-leveldb/src/lib.rs new file mode 100644 index 0000000..54e78f6 --- /dev/null +++ b/src/storage/skw-mpc-leveldb/src/lib.rs @@ -0,0 +1,152 @@ +use futures::{channel::mpsc, StreamExt}; +use rusty_leveldb::{DB, Options}; + +use skw_mpc_storage::{DBOpIn, DBOpOut, MpcStorageConfig, MpcStorageError}; +use tokio::task::JoinHandle; + +pub fn default_mpc_storage_opt( + db_name_or_path: String, + in_memory: bool +) -> ( + MpcStorageConfig, + mpsc::Sender, +) { + // we want the db op to be executed as long as they are avalaible + let (db_in_sender, db_in_receiver) = mpsc::channel(0); + ( + MpcStorageConfig::new(db_name_or_path, in_memory, db_in_receiver), + db_in_sender, + ) +} + +pub fn run_db_server( + mut config: MpcStorageConfig +) -> Result, MpcStorageError> { + let opt = { + match config.is_in_memory() { + false => Options::default(), + true => rusty_leveldb::in_memory() + } + }; + + // TODO: this unwrap is not correct + let mut db = DB::open(config.db_name_or_path(), opt) + .map_err(|_| MpcStorageError::FailToOpenDB)?; + + Ok(tokio::task::spawn(async move { + let mut graceful_terminate = false; + loop { + if graceful_terminate { + break; + } + let db_opt_in = config.db_pending_ops().select_next_some().await; + match db_opt_in { + DBOpIn::WriteToDB { key, value, result_sender } => { + let status = db.put(&key[..], &value[..]) + .map_err(|_| MpcStorageError::FailToWriteDB); + + let flush_status = db.flush() + .map_err(|_| MpcStorageError::FailToFlushDB); + + result_sender + .send(DBOpOut::WriteToDB { status: status.and(flush_status) }) + .expect("db out receiver should not been dropped") + }, + DBOpIn::ReadFromDB { key, result_sender } => { + let v = db.get(&key); + let status = match v { + Some(v) => Ok(v), + None => Err(MpcStorageError::KeyNotInDB) + }; + result_sender + .send(DBOpOut::ReadFromDB { status }) + .expect("db out receiver should not been dropped") + }, + DBOpIn::DeleteFromDB { key, result_sender } => { + let status = db.delete(&key) + .map_err(|_| MpcStorageError::KeyNotInDB); + result_sender + .send(DBOpOut::DeleteFromDB { status }) + .expect("db out receiver should not been dropped") + }, + DBOpIn::Shutdown { result_sender } => { + let flush_status = db.flush() + .map_err(|_| MpcStorageError::FailToFlushDB); + let shutdown_status = db.close() + .map_err(|_| MpcStorageError::FailToCloseDB); + + // TODO: make sure no err before shutdown + graceful_terminate = true; + result_sender + .send(DBOpOut::Shutdown { status: flush_status.and(shutdown_status) }) + .expect("db out receiver should not been dropped") + }, + DBOpIn::ForceFlush { result_sender } => { + let status = db.flush() + .map_err(|_| MpcStorageError::FailToFlushDB); + result_sender + .send(DBOpOut::ForceFlush { status }) + .expect("db out receiver should not been dropped") + }, + } + } + })) +} + +#[cfg(test)] +mod test { + use super::*; + use futures::SinkExt; + use skw_mpc_storage::{write_to_db, read_from_db, shutdown_db}; + + #[tokio::test] + async fn in_memory() { + let (config, mut in_pipe) = default_mpc_storage_opt("in_memory".to_string(), true); + let jh = run_db_server(config).unwrap(); + + write_to_db!( in_pipe, [0u8; 32], vec![1, 2, 3] ).unwrap(); + write_to_db!( in_pipe, [1u8; 32], vec![4, 5, 6] ).unwrap(); + let v = read_from_db!( in_pipe, [1u8; 32] ).unwrap(); + assert_eq!(v, vec![4, 5, 6]); + + let v = read_from_db!( in_pipe, [0u8; 32] ).unwrap(); + assert_eq!(v, vec![1, 2, 3]); + + shutdown_db!( in_pipe ).unwrap(); + jh.await.unwrap(); + } + + #[tokio::test] + async fn on_disk() { + // Run #1 + { + let (config, mut in_pipe) = default_mpc_storage_opt("mock".to_string(), false); + let jh = run_db_server(config).unwrap(); + + write_to_db!( in_pipe, [0u8; 32], vec![1, 2, 3] ).unwrap(); + write_to_db!( in_pipe, [1u8; 32], vec![4, 5, 6] ).unwrap(); + let v = read_from_db!( in_pipe, [1u8; 32] ).unwrap(); + assert_eq!(v, vec![4, 5, 6]); + + let v = read_from_db!( in_pipe, [0u8; 32] ).unwrap(); + assert_eq!(v, vec![1, 2, 3]); + + shutdown_db!( in_pipe ).unwrap(); + jh.await.unwrap(); + } + + { + let (config, mut in_pipe) = default_mpc_storage_opt("mock".to_string(), false); + let jh = run_db_server(config).unwrap(); + + let v = read_from_db!( in_pipe, [1u8; 32] ).unwrap(); + assert_eq!(v, vec![4, 5, 6]); + + let v = read_from_db!( in_pipe, [0u8; 32] ).unwrap(); + assert_eq!(v, vec![1, 2, 3]); + + shutdown_db!( in_pipe ).unwrap(); + jh.await.unwrap(); + } + } +} diff --git a/src/storage/skw-mpc-storage/Cargo.toml b/src/storage/skw-mpc-storage/Cargo.toml new file mode 100644 index 0000000..fae8003 --- /dev/null +++ b/src/storage/skw-mpc-storage/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "skw-mpc-storage" +version = "0.1.7" +edition = "2021" +authors = ["SkyeKiwi "] +license = "GPL-3.0" +description = "storage abstraction for SkyeKiwi Mpc nodes" +categories = ["asynchronous", "cryptography", "network-programming"] +keywords = ["round-based", "mpc", "protocol"] + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +serde = { version = "1.0", features = ["derive"], default-features = false } +thiserror = { version = "1.0.23", default-features = false } +futures = "0.3.1" diff --git a/src/storage/skw-mpc-storage/LICENSE b/src/storage/skw-mpc-storage/LICENSE new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/src/storage/skw-mpc-storage/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/src/storage/skw-mpc-storage/README.md b/src/storage/skw-mpc-storage/README.md new file mode 100644 index 0000000..e69de29 diff --git a/crates/skw-mpc-storage/src/db.rs b/src/storage/skw-mpc-storage/src/db.rs similarity index 65% rename from crates/skw-mpc-storage/src/db.rs rename to src/storage/skw-mpc-storage/src/db.rs index ba32441..ed40ed0 100644 --- a/crates/skw-mpc-storage/src/db.rs +++ b/src/storage/skw-mpc-storage/src/db.rs @@ -57,6 +57,32 @@ pub enum DBOpOut { }, } +impl DBOpOut { + pub fn payload(&self) -> Result, MpcStorageError> { + match self { + DBOpOut::ReadFromDB { status } => status.clone(), + _ => Err(MpcStorageError::NoPayload), + } + } + + pub fn status(&self) -> Result<(), MpcStorageError> { + match self { + DBOpOut::WriteToDB { status } => status.clone(), + DBOpOut::ReadFromDB { status } => { + if status.is_ok() { + Ok(()) + } else { + // SAFETY: this unwrap is safe because we have assure status is err + Err(status.clone().err().unwrap()) + } + }, + DBOpOut::DeleteFromDB { status } => status.clone(), + DBOpOut::ForceFlush { status } => status.clone(), + DBOpOut::Shutdown { status } => status.clone(), + } + } +} + pub struct MpcStorageConfig { db_name_or_path: String, in_memory: bool, @@ -89,4 +115,4 @@ impl MpcStorageConfig { pub fn db_pending_ops(&mut self) -> &mut mpsc::Receiver { &mut self.db_in_receiver } -} \ No newline at end of file +} diff --git a/src/storage/skw-mpc-storage/src/lib.rs b/src/storage/skw-mpc-storage/src/lib.rs new file mode 100644 index 0000000..517c592 --- /dev/null +++ b/src/storage/skw-mpc-storage/src/lib.rs @@ -0,0 +1,62 @@ +pub mod db; +pub mod types; + +// re-export +pub use db::{DBOpIn, DBOpOut, MpcStorageConfig}; +pub use types::{MpcStorageError}; + +#[macro_export] +macro_rules! read_from_db { + ($db_channel: expr, $key: expr) => { + { + let (i, o) = futures::channel::oneshot::channel(); + let op = DBOpIn::ReadFromDB { key: $key, result_sender: i }; + $db_channel.send(op).await.expect("db server must be running"); + let res = o.await.expect("db server must be running"); + + res.payload() + } + }; +} + +#[macro_export] +macro_rules! write_to_db { + ($db_channel: expr, $key: expr, $value: expr) => { + { + let (i, o) = futures::channel::oneshot::channel(); + let op = DBOpIn::WriteToDB { key: $key, value: $value, result_sender: i }; + $db_channel.send(op).await.expect("db server must be running"); + let res = o.await.expect("db server must be running"); + + res.status() + } + }; +} + +#[macro_export] +macro_rules! delete_from_db { + ($db_channel: expr, $key: expr) => { + { + let (i, o) = futures::channel::oneshot::channel(); + let op = DBOpIn::DeleteFromDB { key: $key, result_sender: i }; + $db_channel.send(op).await.expect("db server must be running"); + let res = o.await.expect("db server must be running"); + + res.status() + } + }; +} + +#[macro_export] +macro_rules! shutdown_db { + ($db_channel: expr) => { + { + let (i, o) = futures::channel::oneshot::channel(); + let op = DBOpIn::Shutdown { result_sender: i }; + $db_channel.send(op).await.expect("db server must be running"); + let res = o.await.expect("db server must be running"); + + res.status() + } + }; +} diff --git a/crates/skw-mpc-storage/src/types.rs b/src/storage/skw-mpc-storage/src/types.rs similarity index 88% rename from crates/skw-mpc-storage/src/types.rs rename to src/storage/skw-mpc-storage/src/types.rs index d12c2c2..fa40220 100644 --- a/crates/skw-mpc-storage/src/types.rs +++ b/src/storage/skw-mpc-storage/src/types.rs @@ -15,4 +15,6 @@ pub enum MpcStorageError { FailToCloseDB, #[error("Storage: failed to find key in DB")] KeyNotInDB, + #[error("Storage: no payload for this type of op")] + NoPayload, } \ No newline at end of file