From 70451dc2548bc0b20d48cadd73b1d2a30e48f69d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Og=C3=B3rek?= Date: Tue, 7 Feb 2023 12:53:02 +0100 Subject: [PATCH] fix(sourcemap): Initial implementation for sourcemap processing (#992) --- Cargo.lock | 846 ++++++++++++++---- crates/symbolicator-service/Cargo.toml | 3 +- .../src/services/download/mod.rs | 26 +- .../src/services/download/sentry.rs | 75 +- .../symbolicator-service/src/services/mod.rs | 7 +- .../src/services/sourcemap.rs | 51 ++ .../src/services/symbolication/mod.rs | 19 +- .../src/services/symbolication/sourcemap.rs | 320 +++++++ crates/symbolicator-service/src/types/mod.rs | 72 ++ .../src/sources/sentry.rs | 49 +- crates/symbolicator/src/endpoints/mod.rs | 4 + .../symbolicator/src/endpoints/sourcemap.rs | 51 ++ crates/symbolicator/src/service.rs | 48 +- 13 files changed, 1375 insertions(+), 196 deletions(-) create mode 100644 crates/symbolicator-service/src/services/sourcemap.rs create mode 100644 crates/symbolicator-service/src/services/symbolication/sourcemap.rs create mode 100644 crates/symbolicator/src/endpoints/sourcemap.rs diff --git a/Cargo.lock b/Cargo.lock index 4e7b24ab9..76cf6a7e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,16 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + [[package]] name = "addr2line" version = "0.19.0" @@ -17,6 +27,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "0.7.20" @@ -46,9 +67,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" dependencies = [ "backtrace", ] @@ -67,9 +88,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0224938f92e7aef515fac2ff2d18bd1115c1394ddf4a092e0c87e8be9499ee5" +checksum = "3e90af4de65aa7b293ef2d09daff88501eb254f58edde2e1ac02c82d873eadad" dependencies = [ "derive_arbitrary", ] @@ -86,6 +107,20 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "ast_node" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf94863c5fdfee166d0907c44e5fee970123b2b7307046d35d1e671aa93afbba" +dependencies = [ + "darling", + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + [[package]] name = "async-compression" version = "0.3.15" @@ -116,7 +151,7 @@ dependencies = [ "slab", "socket2", "waker-fn", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -131,9 +166,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705339e0e4a9690e2908d2b3d049d85682cf19fbd5782494498fbf7003a6a282" +checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" dependencies = [ "proc-macro2", "quote", @@ -484,16 +519,16 @@ dependencies = [ "aws-smithy-http", "aws-smithy-types", "http", - "rustc_version", + "rustc_version 0.4.0", "tracing", "zeroize", ] [[package]] name = "axum" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1304eab461cf02bd70b083ed8273388f9724c549b316ba3d1e213ce0e9e7fb7e" +checksum = "e5694b64066a2459918d8074c2ce0d5a88f409431994c2356617c8ae0c4721fc" dependencies = [ "async-trait", "axum-core", @@ -525,9 +560,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f487e40dc9daee24d8a1779df88522f159a54a980f99cfbe43db0be0bd3444a8" +checksum = "1cae3e661676ffbacb30f1a824089a8c9150e71017f7e1e38f2aa32009188d34" dependencies = [ "async-trait", "bytes", @@ -596,6 +631,15 @@ dependencies = [ "simd-abstraction", ] +[[package]] +name = "better_scoped_tls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73e8ecdec39e98aa3b19e8cd0b8ed8f77ccb86a6b0b2dc7cd86d105438a2123" +dependencies = [ + "scoped-tls", +] + [[package]] name = "binary-merge" version = "0.1.2" @@ -691,9 +735,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.11.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecount" @@ -709,9 +753,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytes-utils" @@ -779,16 +823,16 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.16", "serde", "serde_json", ] [[package]] name = "cc" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" dependencies = [ "jobserver", ] @@ -858,9 +902,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.1.1" +version = "4.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec7a4128863c188deefe750ac1d1dfe66c236909f845af04beed823638dc1b2" +checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" dependencies = [ "bitflags", "clap_derive", @@ -877,7 +921,7 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "proc-macro-error", "proc-macro2", "quote", @@ -931,7 +975,7 @@ dependencies = [ "lazy_static", "libc", "unicode-width", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -973,7 +1017,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfea2db42e9927a3845fb268a10a72faed6d416065f77873f05e411457c363e" dependencies = [ - "rustc_version", + "rustc_version 0.4.0", ] [[package]] @@ -1107,9 +1151,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d1075c37807dcf850c379432f0df05ba52cc30f279c5cfc43cc221ce7f8579" +checksum = "bc831ee6a32dd495436e317595e639a587aa9907bef96fe6e6abc290ab6204e9" dependencies = [ "cc", "cxxbridge-flags", @@ -1119,9 +1163,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5044281f61b27bc598f2f6647d480aed48d2bf52d6eb0b627d84c0361b17aa70" +checksum = "94331d54f1b1a8895cd81049f7eaaaef9d05a7dcb4d1fd08bf3ff0806246789d" dependencies = [ "cc", "codespan-reporting", @@ -1134,21 +1178,56 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b50bc93ba22c27b0d31128d2d130a0a6b3d267ae27ef7e4fae2167dfe8781c" +checksum = "48dcd35ba14ca9b40d6e4b4b39961f23d835dbb8eed74565ded361d93e1feb8a" [[package]] name = "cxxbridge-macro" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e61fda7e62115119469c7b3591fd913ecca96fb766cfd3f2e2502ab7bc87a5" +checksum = "81bbeb29798b407ccd82a3324ade1a7286e0d29851475990b612670f6f5124d2" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "data-encoding" version = "2.3.3" @@ -1167,9 +1246,9 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf460bbff5f571bfc762da5102729f59f338be7db17a21fade44c5c4f5005350" +checksum = "8beee4701e2e229e8098bbdecdca12449bc3e322f137d269182fa1291e20bd00" dependencies = [ "proc-macro2", "quote", @@ -1236,9 +1315,9 @@ checksum = "f0bc8fbe9441c17c9f46f75dfe27fa1ddb6c68a461ccaed0481419219d4f10d3" [[package]] name = "either" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "elementtree" @@ -1336,9 +1415,9 @@ checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if", ] @@ -1349,7 +1428,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ - "heck 0.4.0", + "heck 0.4.1", "proc-macro2", "quote", "syn", @@ -1366,6 +1445,18 @@ dependencies = [ "syn", ] +[[package]] +name = "enum_kind" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b940da354ae81ef0926c5eaa428207b8f4f091d3956c891dfbd124162bed99" +dependencies = [ + "pmutil", + "proc-macro2", + "swc_macros_common", + "syn", +] + [[package]] name = "errno" version = "0.2.8" @@ -1426,7 +1517,7 @@ dependencies = [ "cfg-if", "libc", "redox_syscall", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -1482,10 +1573,16 @@ dependencies = [ ] [[package]] -name = "fs_extra" -version = "1.2.0" +name = "from_variant" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" +checksum = "f0981e470d2ab9f643df3921d54f1952ea100c39fdb6a3fdc820e20d2291df6c" +dependencies = [ + "pmutil", + "proc-macro2", + "swc_macros_common", + "syn", +] [[package]] name = "funty" @@ -1495,9 +1592,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" dependencies = [ "futures-channel", "futures-core", @@ -1510,9 +1607,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" dependencies = [ "futures-core", "futures-sink", @@ -1520,15 +1617,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" dependencies = [ "futures-core", "futures-task", @@ -1537,9 +1634,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" [[package]] name = "futures-lite" @@ -1558,9 +1655,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" dependencies = [ "proc-macro2", "quote", @@ -1569,21 +1666,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" dependencies = [ "futures-channel", "futures-core", @@ -1645,9 +1742,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec7af912d60cdbd3677c1af9352ebae6fb8394d165568a2234df0fa00f87793" +checksum = "221996f774192f0f718773def8201c4ae31f02616a54ccfc2d358bb0e5cefdec" dependencies = [ "fallible-iterator", "stable_deref_trait", @@ -1706,9 +1803,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -1728,6 +1825,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "856b5cb0902c2b6d65d5fd97dfa30f9b70c7538e770b98eab5ed52d8db923e01" + [[package]] name = "hex" version = "0.4.3" @@ -1812,9 +1915,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.23" +version = "0.14.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c" +checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" dependencies = [ "bytes", "futures-channel", @@ -1887,6 +1990,12 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.2.3" @@ -1908,6 +2017,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "if_chain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" + [[package]] name = "indent_write" version = "2.2.0" @@ -1960,12 +2075,12 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -1995,16 +2110,38 @@ dependencies = [ "serde", ] +[[package]] +name = "is-macro" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c068d4c6b922cd6284c609cfa6dec0e41615c9c5a1a4ba729a970d8daba05fb" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "is-terminal" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" +checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.0", "io-lifetimes", "rustix", - "windows-sys", + "windows-sys 0.45.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", ] [[package]] @@ -2021,12 +2158,11 @@ checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "jemalloc-sys" -version = "0.5.2+5.3.0-patched" +version = "0.5.3+5.3.0-patched" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134163979b6eed9564c98637b710b40979939ba351f59952708234ea11b5f3f8" +checksum = "f9bd5d616ea7ed58b571b2e209a65759664d7fb021a0819d7a790afc67e47ca1" dependencies = [ "cc", - "fs_extra", "libc", ] @@ -2055,11 +2191,26 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72167d68f5fce3b8655487b8038691a3c9984ee769590f93f2a631f4ad64e4f5" +[[package]] +name = "js-source-scopes" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d4280832c317c2dff2bf1dfb1fb30ea87d91c0a3d4ba5e2856c6ac47ef44f2c" +dependencies = [ + "indexmap", + "sourcemap", + "swc_common", + "swc_ecma_parser", + "swc_ecma_visit", + "thiserror", + "tracing", +] + [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] @@ -2096,6 +2247,79 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +[[package]] +name = "lexical" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6" +dependencies = [ + "lexical-core", +] + +[[package]] +name = "lexical-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +dependencies = [ + "lexical-util", + "static_assertions", +] + [[package]] name = "libc" version = "0.2.139" @@ -2187,9 +2411,9 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "matchit" @@ -2344,7 +2568,7 @@ dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2358,9 +2582,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b49a05f67020456541f4f29cbaa812016a266a86ec76f96d3873d459c68fe5e" +checksum = "19b9268097a2cf211ac9955b1cc95e80fa84fff5c2d13ba292916445dc8a311f" dependencies = [ "async-io", "async-lock", @@ -2372,7 +2596,7 @@ dependencies = [ "once_cell", "parking_lot 0.12.1", "quanta", - "rustc_version", + "rustc_version 0.4.0", "scheduled-thread-pool", "skeptic", "smallvec", @@ -2484,6 +2708,7 @@ dependencies = [ "autocfg", "num-integer", "num-traits", + "serde", ] [[package]] @@ -2526,9 +2751,9 @@ dependencies = [ [[package]] name = "object" -version = "0.30.2" +version = "0.30.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8c786513eb403643f2a88c244c2aaa270ef2153f55094587d0c48a3cf22a83" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" dependencies = [ "memchr", ] @@ -2586,9 +2811,9 @@ dependencies = [ [[package]] name = "os_info" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4750134fb6a5d49afc80777394ad5d95b04bc12068c6abb92fae8f43817270f" +checksum = "5c424bc68d15e0778838ac013b5b3449544d8133633d8016319e7e05a820b8c0" dependencies = [ "log", "serde", @@ -2637,7 +2862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.6", + "parking_lot_core 0.9.7", ] [[package]] @@ -2656,15 +2881,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -2715,9 +2940,9 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pest" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4257b4a04d91f7e9e6290be5d3da4804dd5784fafde3a497d73eb2b4a158c30a" +checksum = "4ab62d2fa33726dbe6321cc97ef96d8cde531e3eeaf858a058de53a8a6d40d8f" dependencies = [ "thiserror", "ucd-trie", @@ -2725,9 +2950,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241cda393b0cdd65e62e07e12454f1f25d57017dcc514b1514cd3c4645e3a0a6" +checksum = "8bf026e2d0581559db66d837fe5242320f525d85c76283c61f4d51a1238d65ea" dependencies = [ "pest", "pest_generator", @@ -2735,9 +2960,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46b53634d8c8196302953c74d5352f33d0c512a9499bd2ce468fc9f4128fa27c" +checksum = "2b27bd18aa01d91c8ed2b61ea23406a676b42d82609c6e2581fba42f0c15f17f" dependencies = [ "pest", "pest_meta", @@ -2748,15 +2973,25 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef4f1332a8d4678b41966bb4cc1d0676880e84183a1ecc3f4b69f03e99c7a51" +checksum = "9f02b677c1859756359fc9983c2e56a0237f18624a3789528804406b7e915e5d" dependencies = [ "once_cell", "pest", "sha2", ] +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared", + "rand", +] + [[package]] name = "phf_shared" version = "0.10.0" @@ -2810,6 +3045,17 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +[[package]] +name = "pmutil" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3894e5d549cccbe44afecf72922f277f603cd4bb0219c8342631ef18fffbe004" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "polling" version = "2.5.2" @@ -2821,7 +3067,7 @@ dependencies = [ "libc", "log", "wepoll-ffi", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2876,9 +3122,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.49" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] @@ -2995,9 +3241,9 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "10.6.0" +version = "10.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6823ea29436221176fe662da99998ad3b4db2c7f31e7b6f5fe43adccd6320bb" +checksum = "c307f7aacdbab3f0adee67d52739a1d71112cc068d6fab169ddeb18e48877fad" dependencies = [ "bitflags", ] @@ -3014,9 +3260,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.10.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" +checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -3156,27 +3402,36 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", +] + [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.16", ] [[package]] name = "rustix" -version = "0.36.6" +version = "0.36.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -3239,7 +3494,7 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -3251,6 +3506,12 @@ dependencies = [ "parking_lot 0.12.1", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.1.0" @@ -3295,9 +3556,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.7.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ "bitflags", "core-foundation", @@ -3308,14 +3569,23 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.16" @@ -3325,6 +3595,12 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "sentry" version = "0.29.2" @@ -3378,7 +3654,7 @@ dependencies = [ "hostname", "libc", "os_info", - "rustc_version", + "rustc_version 0.4.0", "sentry-core", "uname", ] @@ -3481,9 +3757,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "7434af0dc1cbd59268aa98b4c22c131c0584d2232f6fb166efb993e2832e896a" dependencies = [ "itoa 1.0.5", "ryu", @@ -3513,9 +3789,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.16" +version = "0.9.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b5b431e8907b50339b51223b97d102db8d987ced36f6e4d03621db9316c834" +checksum = "8fb06d4b6cdaef0e0c51fa881acb721bed3c924cfaa71d9c94a3b771dfdf6567" dependencies = [ "indexmap", "itoa 1.0.5", @@ -3676,6 +3952,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "sourcemap" +version = "6.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebe057d110ddba043708da3fb010bf562ff6e9d4d60c9ee92860527bcbeccd6" +dependencies = [ + "base64 0.13.1", + "if_chain", + "rustc_version 0.2.3", + "serde", + "serde_json", + "unicode-id", + "url", +] + [[package]] name = "spin" version = "0.5.2" @@ -3694,6 +3985,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "string_cache" version = "0.8.4" @@ -3708,6 +4005,31 @@ dependencies = [ "serde", ] +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_enum" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "994453cd270ad0265796eb24abf5540091ed03e681c5f3c12bc33e4db33253e1" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + [[package]] name = "strsim" version = "0.8.0" @@ -3750,6 +4072,145 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +[[package]] +name = "swc_atoms" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "731cf66bd8e11030f056f91f9d8af77f83ec4377ff04d1670778a57d1607402a" +dependencies = [ + "once_cell", + "rustc-hash", + "serde", + "string_cache", + "string_cache_codegen", + "triomphe", +] + +[[package]] +name = "swc_common" +version = "0.29.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97e491d31418cd33fea58e9f893316fc04b30e2b5d0e750c066e2ba4907ae54" +dependencies = [ + "ahash", + "ast_node", + "better_scoped_tls", + "cfg-if", + "either", + "from_variant", + "new_debug_unreachable", + "num-bigint", + "once_cell", + "rustc-hash", + "serde", + "siphasher", + "string_cache", + "swc_atoms", + "swc_eq_ignore_macros", + "swc_visit", + "tracing", + "unicode-width", + "url", +] + +[[package]] +name = "swc_ecma_ast" +version = "0.94.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7823e863bebbcbcabba5d5781dd8cedcf1acb35a770a871c914855b43783e17" +dependencies = [ + "bitflags", + "is-macro", + "num-bigint", + "scoped-tls", + "serde", + "string_enum", + "swc_atoms", + "swc_common", + "unicode-id", +] + +[[package]] +name = "swc_ecma_parser" +version = "0.122.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d96fdbe0817bb029318a064e5543840ab38c0616122b31b910b3a5cda250cf2" +dependencies = [ + "either", + "enum_kind", + "lexical", + "num-bigint", + "serde", + "smallvec", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "tracing", + "typed-arena", +] + +[[package]] +name = "swc_ecma_visit" +version = "0.80.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c3c5ca0a76f58b8b40e3733e4c67c47a6875c318e40ad11d535a26e44609b6" +dependencies = [ + "num-bigint", + "swc_atoms", + "swc_common", + "swc_ecma_ast", + "swc_visit", + "tracing", +] + +[[package]] +name = "swc_eq_ignore_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c20468634668c2bbab581947bb8c75c97158d5a6959f4ba33df20983b20b4f6" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_macros_common" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4be988307882648d9bc7c71a6a73322b7520ef0211e920489a98f8391d8caa2" +dependencies = [ + "pmutil", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "swc_visit" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "470a1963cf182fdcbbac46e3a7fd2caf7329da0e568d3668202da9501c880e16" +dependencies = [ + "either", + "swc_visit_macros", +] + +[[package]] +name = "swc_visit_macros" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6098b717cfd4c85f5cddec734af191dbce461c39975ed567c32ac6d0c6d61a6d" +dependencies = [ + "Inflector", + "pmutil", + "proc-macro2", + "quote", + "swc_macros_common", + "syn", +] + [[package]] name = "symbolic" version = "11.0.0" @@ -3762,6 +4223,7 @@ dependencies = [ "symbolic-demangle", "symbolic-il2cpp", "symbolic-ppdb", + "symbolic-sourcemapcache", "symbolic-symcache", ] @@ -3860,6 +4322,21 @@ dependencies = [ "watto", ] +[[package]] +name = "symbolic-sourcemapcache" +version = "11.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021e438cc37fccc68f64738a11b257f23a827f806ad9227d3728df83875c0196" +dependencies = [ + "itertools", + "js-source-scopes", + "sourcemap", + "symbolic-common", + "thiserror", + "tracing", + "watto", +] + [[package]] name = "symbolic-symcache" version = "11.0.0" @@ -3952,6 +4429,7 @@ dependencies = [ "serde_json", "serde_yaml", "sha-1", + "sourcemap", "symbolic", "symbolicator-sources", "symbolicator-test", @@ -4020,7 +4498,7 @@ name = "symbolicli" version = "0.6.0" dependencies = [ "anyhow", - "clap 4.1.1", + "clap 4.1.4", "dirs", "prettytable-rs", "reqwest", @@ -4070,9 +4548,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "synstructure" @@ -4230,15 +4708,15 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.24.2" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb" +checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" dependencies = [ "autocfg", "bytes", @@ -4249,7 +4727,7 @@ dependencies = [ "pin-project-lite", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -4322,9 +4800,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] @@ -4474,6 +4952,10 @@ name = "triomphe" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1ee9bd9239c339d714d657fac840c6d2a4f9c45f4f9ec7b0975113458be78db" +dependencies = [ + "serde", + "stable_deref_trait", +] [[package]] name = "trust-dns-proto" @@ -4526,6 +5008,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + [[package]] name = "typenum" version = "1.16.0" @@ -4558,9 +5046,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" + +[[package]] +name = "unicode-id" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "d70b6494226b36008c8366c288d77190b3fad2eb4c10533139c1c1f461127f1a" [[package]] name = "unicode-ident" @@ -4579,9 +5073,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" @@ -4609,9 +5103,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "ureq" -version = "2.6.1" +version = "2.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733b5ad78377302af52c0dbcb2623d78fe50e4b3bf215948ff29e9ee031d8566" +checksum = "338b31dd1314f68f3aabf3ed57ab922df95ffcd902476ca7ba3c4ce7b908c46d" dependencies = [ "base64 0.13.1", "log", @@ -4640,9 +5134,9 @@ checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" [[package]] name = "uuid" -version = "1.2.2" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" +checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79" dependencies = [ "getrandom", "serde", @@ -4713,9 +5207,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4723,9 +5217,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", "log", @@ -4738,9 +5232,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.33" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" dependencies = [ "cfg-if", "js-sys", @@ -4750,9 +5244,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4760,9 +5254,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", @@ -4773,9 +5267,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "wasm-split" @@ -4837,9 +5331,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", @@ -4875,9 +5369,9 @@ dependencies = [ [[package]] name = "which" -version = "4.3.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ "either", "libc", @@ -4936,6 +5430,30 @@ dependencies = [ "windows_x86_64_msvc", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" @@ -5044,9 +5562,9 @@ checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" [[package]] name = "zip" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537ce7411d25e54e8ae21a7ce0b15840e7bfcff15b51d697ec3266cc76bdf080" +checksum = "0445d0fbc924bb93539b4316c11afb121ea39296f99a3c4c9edad09e3658cdef" dependencies = [ "byteorder", "bzip2", @@ -5057,18 +5575,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.12.2+zstd.1.5.2" +version = "0.12.3+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9262a83dc741c0b0ffec209881b45dbc232c21b02a2b9cb1adb93266e41303d" +checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.2+zstd.1.5.2" +version = "6.0.3+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cf39f730b440bab43da8fb5faf5f254574462f73f260f85f7987f32154ff17" +checksum = "68e4a3f57d13d0ab7e478665c60f35e2a613dcd527851c2c7287ce5c787e134a" dependencies = [ "libc", "zstd-sys", @@ -5076,9 +5594,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.5+zstd.1.5.2" +version = "2.0.6+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc50ffce891ad571e9f9afe5039c4837bede781ac4bb13052ed7ae695518596" +checksum = "68a3f9792c0c3dc6c165840a75f47ae1f4da402c2d006881129579f6597e801b" dependencies = [ "cc", "libc", diff --git a/crates/symbolicator-service/Cargo.toml b/crates/symbolicator-service/Cargo.toml index 403512545..1da83dc36 100644 --- a/crates/symbolicator-service/Cargo.toml +++ b/crates/symbolicator-service/Cargo.toml @@ -37,7 +37,8 @@ sentry = { version = "0.29.2", features = ["tracing"] } serde = { version = "1.0.137", features = ["derive", "rc"] } serde_json = "1.0.81" serde_yaml = "0.9.14" -symbolic = { version = "11.0.0", features = ["cfi", "common-serde", "debuginfo", "demangle", "symcache", "il2cpp", "ppdb"] } +symbolic = { version = "11.0.0", features = ["cfi", "common-serde", "debuginfo", "demangle", "sourcemapcache", "symcache", "il2cpp", "ppdb"] } +sourcemap = "6.2.1" symbolicator-sources = { path = "../symbolicator-sources" } tempfile = "3.2.0" thiserror = "1.0.31" diff --git a/crates/symbolicator-service/src/services/download/mod.rs b/crates/symbolicator-service/src/services/download/mod.rs index 58b35d42e..e6c19402b 100644 --- a/crates/symbolicator-service/src/services/download/mod.rs +++ b/crates/symbolicator-service/src/services/download/mod.rs @@ -20,11 +20,13 @@ pub use symbolicator_sources::{ SourceFilters, SourceLocation, }; use symbolicator_sources::{ - FilesystemRemoteFile, GcsRemoteFile, HttpRemoteFile, S3RemoteFile, SourceLocationIter, + FilesystemRemoteFile, GcsRemoteFile, HttpRemoteFile, S3RemoteFile, SentrySourceConfig, + SourceLocationIter, }; use crate::caching::{CacheEntry, CacheError}; use crate::config::{CacheConfigs, Config, InMemoryCacheConfig}; +use crate::services::download::sentry::SearchArtifactResult; use crate::utils::futures::{m, measure, CancelOnDrop}; use crate::utils::gcs::GcsError; use crate::utils::sentry::ConfigureScope; @@ -33,7 +35,7 @@ mod filesystem; mod gcs; mod http; mod s3; -mod sentry; +pub mod sentry; impl ConfigureScope for RemoteFile { fn to_scope(&self, scope: &mut ::sentry::Scope) { @@ -267,6 +269,26 @@ impl DownloadService { } remote_files } + + pub async fn list_artifacts( + &self, + source: Arc, + ) -> Vec { + let mut remote_artifacts = vec![]; + let job = self.sentry.list_artifacts(source.clone()); + let timeout = Duration::from_secs(30); + let job = tokio::time::timeout(timeout, job); + let job = measure("service.download.list_artifacts", m::timed_result, job); + let sentry_files = job.await.map_err(|_| CacheError::Timeout(timeout)); + match sentry_files { + Ok(Ok(files)) => remote_artifacts.extend(files), + Ok(Err(error)) | Err(error) => { + let error: &dyn std::error::Error = &error; + tracing::error!(error, "Failed to fetch artifacts list"); + } + } + remote_artifacts + } } /// Try to run a future up to 3 times with 20 millisecond delays on failure. diff --git a/crates/symbolicator-service/src/services/download/sentry.rs b/crates/symbolicator-service/src/services/download/sentry.rs index 35a45072c..20e8f0570 100644 --- a/crates/symbolicator-service/src/services/download/sentry.rs +++ b/crates/symbolicator-service/src/services/download/sentry.rs @@ -2,16 +2,19 @@ //! //! This allows to fetch files which were directly uploaded to Sentry itself. +use std::collections::BTreeMap; use std::fmt; use std::path::Path; use std::sync::Arc; use std::time::Duration; use sentry::SentryFutureExt; +use serde::de::DeserializeOwned; +use serde::Deserialize; use url::Url; use symbolicator_sources::{ - ObjectId, RemoteFile, SentryFileId, SentryRemoteFile, SentrySourceConfig, + ObjectId, RemoteFile, SentryFileId, SentryFileType, SentryRemoteFile, SentrySourceConfig, }; use super::{FileType, USER_AGENT}; @@ -19,10 +22,19 @@ use crate::caching::{CacheEntry, CacheError}; use crate::config::Config; use crate::utils::futures::CancelOnDrop; -#[derive(Clone, Debug, serde::Deserialize)] +#[derive(Clone, Debug, Deserialize)] struct SearchResult { - id: SentryFileId, - // TODO: Add more fields + pub id: SentryFileId, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct SearchArtifactResult { + pub id: SentryFileId, + pub name: String, + pub sha1: String, + pub dist: Option, + #[serde(default)] + pub headers: BTreeMap, } #[derive(Clone, Debug, PartialEq, Eq, Hash)] @@ -66,10 +78,13 @@ impl SentryDownloader { } /// Make a request to sentry, parse the result as a JSON SearchResult list. - async fn fetch_sentry_json( + async fn fetch_sentry_json( client: &reqwest::Client, query: &SearchQuery, - ) -> CacheEntry> { + ) -> CacheEntry> + where + T: DeserializeOwned, + { let mut request = client .get(query.index_url.clone()) .bearer_auth(&query.token) @@ -174,18 +189,52 @@ impl SentryDownloader { let search = self.cached_sentry_search(query).await?; let file_ids = search .into_iter() - .map(|search_result| SentryRemoteFile::new(source.clone(), search_result.id).into()) + .map(|search_result| { + SentryRemoteFile::new(source.clone(), search_result.id, SentryFileType::DebugFile) + .into() + }) .collect(); Ok(file_ids) } + pub async fn list_artifacts( + &self, + source: Arc, + ) -> CacheEntry> { + let query = SearchQuery { + index_url: source.url.clone(), + token: source.token.clone(), + }; + + tracing::debug!( + "Fetching list of Sentry artifacts from {}", + &query.index_url + ); + + let entries = { + let client = self.client.clone(); + let query = query.clone(); + let future = + async move { super::retry(|| Self::fetch_sentry_json(&client, &query)).await }; + + let future = + CancelOnDrop::new(self.runtime.spawn(future.bind_hub(sentry::Hub::current()))); + + future.await.map_err(|_| CacheError::InternalError)?? + }; + + Ok(entries) + } + /// Downloads a source hosted on Sentry. pub async fn download_source( &self, file_source: SentryRemoteFile, destination: &Path, ) -> CacheEntry { + tracing::debug!("Fetching Sentry artifact from {}", file_source.url()); + let request = self .client .get(file_source.url()) @@ -217,7 +266,11 @@ mod tests { url: Url::parse("https://example.net/endpoint/").unwrap(), token: "token".into(), }; - let file_source = SentryRemoteFile::new(Arc::new(source), SentryFileId("abc123".into())); + let file_source = SentryRemoteFile::new( + Arc::new(source), + SentryFileId("abc123".into()), + SentryFileType::DebugFile, + ); let url = file_source.url(); assert_eq!(url.as_str(), "https://example.net/endpoint/?id=abc123"); } @@ -229,7 +282,11 @@ mod tests { url: Url::parse("https://example.net/endpoint/").unwrap(), token: "token".into(), }; - let file_source = SentryRemoteFile::new(Arc::new(source), SentryFileId("abc123".into())); + let file_source = SentryRemoteFile::new( + Arc::new(source), + SentryFileId("abc123".into()), + SentryFileType::DebugFile, + ); let uri = file_source.uri(); assert_eq!( uri, diff --git a/crates/symbolicator-service/src/services/mod.rs b/crates/symbolicator-service/src/services/mod.rs index e22500b20..b4cec4365 100644 --- a/crates/symbolicator-service/src/services/mod.rs +++ b/crates/symbolicator-service/src/services/mod.rs @@ -23,6 +23,7 @@ pub mod il2cpp; mod minidump; pub mod objects; pub mod ppdb_caches; +pub mod sourcemap; pub mod symbolication; pub mod symcaches; @@ -32,6 +33,7 @@ use self::download::DownloadService; use self::il2cpp::Il2cppService; use self::objects::ObjectsActor; use self::ppdb_caches::PortablePdbCacheActor; +use self::sourcemap::SourceMapService; use self::symbolication::SymbolicationActor; use self::symcaches::SymCacheActor; pub use fetch_file::fetch_file; @@ -58,7 +60,7 @@ pub fn create_service( let bitcode = BitcodeService::new(caches.auxdifs, shared_cache.clone(), downloader.clone()); - let il2cpp = Il2cppService::new(caches.il2cpp, shared_cache.clone(), downloader); + let il2cpp = Il2cppService::new(caches.il2cpp, shared_cache.clone(), downloader.clone()); let symcaches = SymCacheActor::new( caches.symcaches, @@ -72,12 +74,15 @@ pub fn create_service( let ppdb_caches = PortablePdbCacheActor::new(caches.ppdb_caches, shared_cache, objects.clone()); + let sourcemaps = SourceMapService::new(downloader); + let symbolication = SymbolicationActor::new( objects.clone(), symcaches, cficaches, ppdb_caches, caches.diagnostics, + sourcemaps, ); Ok((symbolication, objects)) diff --git a/crates/symbolicator-service/src/services/sourcemap.rs b/crates/symbolicator-service/src/services/sourcemap.rs new file mode 100644 index 000000000..7788d53db --- /dev/null +++ b/crates/symbolicator-service/src/services/sourcemap.rs @@ -0,0 +1,51 @@ +//! Service for retrieving SourceMap artifacts. + +use std::collections::HashMap; +use std::sync::Arc; + +use symbolicator_sources::{SentryFileId, SentryFileType, SentryRemoteFile, SentrySourceConfig}; +use tempfile::NamedTempFile; + +use crate::services::download::sentry::SearchArtifactResult; +use crate::services::download::DownloadService; + +use super::fetch_file; + +#[derive(Debug, Clone)] +pub struct SourceMapService { + download_svc: Arc, +} + +impl SourceMapService { + pub fn new(download_svc: Arc) -> Self { + Self { download_svc } + } + + pub async fn list_artifacts( + &self, + source: Arc, + ) -> HashMap { + self.download_svc + .list_artifacts(source) + .await + .into_iter() + .map(|artifact| (artifact.name.clone(), artifact)) + .collect() + } + + pub async fn fetch_artifact( + &self, + source: Arc, + file_id: SentryFileId, + ) -> Option { + let mut temp_file = NamedTempFile::new().unwrap(); + fetch_file( + self.download_svc.clone(), + SentryRemoteFile::new(source, file_id, SentryFileType::ReleaseArtifact).into(), + &mut temp_file, + ) + .await + .map(|_| temp_file) + .ok() + } +} diff --git a/crates/symbolicator-service/src/services/symbolication/mod.rs b/crates/symbolicator-service/src/services/symbolication/mod.rs index 8cd41b0df..733d3d3a2 100644 --- a/crates/symbolicator-service/src/services/symbolication/mod.rs +++ b/crates/symbolicator-service/src/services/symbolication/mod.rs @@ -4,19 +4,19 @@ use symbolic::common::{split_path, DebugId, InstructionInfo, Language, Name}; use symbolic::demangle::{Demangle, DemangleOptions}; use symbolic::ppdb::PortablePdbCache; use symbolic::symcache::SymCache; -use symbolicator_sources::ObjectId; +use symbolicator_sources::{ObjectId, SentrySourceConfig}; use symbolicator_sources::{ObjectType, SourceConfig}; use crate::caching::{Cache, CacheError}; use crate::services::cficaches::CfiCacheActor; use crate::services::objects::ObjectsActor; use crate::services::ppdb_caches::PortablePdbCacheActor; +use crate::services::sourcemap::SourceMapService; use crate::services::symcaches::SymCacheActor; -use crate::types::RawObjectInfo; use crate::types::{ CompleteObjectInfo, CompleteStacktrace, CompletedSymbolicationResponse, FrameStatus, - FrameTrust, ObjectFileStatus, RawFrame, RawStacktrace, Registers, Scope, Signal, - SymbolicatedFrame, + FrameTrust, JsProcessingRawStacktrace, ObjectFileStatus, RawFrame, RawObjectInfo, + RawStacktrace, Registers, Scope, Signal, SymbolicatedFrame, }; use crate::utils::hex::HexValue; @@ -25,6 +25,7 @@ use module_lookup::{CacheFileEntry, CacheLookupResult, ModuleLookup}; mod apple; mod module_lookup; mod process_minidump; +pub mod sourcemap; fn object_id_from_object_info(object_info: &RawObjectInfo) -> ObjectId { ObjectId { @@ -98,6 +99,7 @@ pub struct SymbolicationActor { cficaches: CfiCacheActor, ppdb_caches: PortablePdbCacheActor, diagnostics_cache: Cache, + sourcemaps: SourceMapService, } impl SymbolicationActor { @@ -107,6 +109,7 @@ impl SymbolicationActor { cficaches: CfiCacheActor, ppdb_caches: PortablePdbCacheActor, diagnostics_cache: Cache, + sourcemaps: SourceMapService, ) -> Self { SymbolicationActor { objects, @@ -114,6 +117,7 @@ impl SymbolicationActor { cficaches, ppdb_caches, diagnostics_cache, + sourcemaps, } } @@ -221,6 +225,13 @@ pub struct SymbolicateStacktraces { pub modules: Vec, } +#[derive(Debug, Clone)] +pub struct JsProcessingSymbolicateStacktraces { + pub source: Arc, + pub stacktraces: Vec, + pub dist: Option, +} + fn symbolicate_frame( caches: &ModuleLookup, registers: &Registers, diff --git a/crates/symbolicator-service/src/services/symbolication/sourcemap.rs b/crates/symbolicator-service/src/services/symbolication/sourcemap.rs new file mode 100644 index 000000000..f59ddc6a0 --- /dev/null +++ b/crates/symbolicator-service/src/services/symbolication/sourcemap.rs @@ -0,0 +1,320 @@ +use std::{ + collections::{HashMap, HashSet}, + io::BufReader, +}; + +use reqwest::Url; +use sourcemap::locate_sourcemap_reference; +use symbolic::{ + common::{ByteView, SelfCell}, + sourcemapcache::{ScopeLookupResult, SourceMapCache, SourceMapCacheWriter, SourcePosition}, +}; +use tempfile::NamedTempFile; +use url::Position; + +use crate::{ + services::download::sentry::SearchArtifactResult, + types::{ + CompleteJsStacktrace, FrameStatus, JsProcessingCompletedSymbolicationResponse, + JsProcessingRawFrame, JsProcessingRawStacktrace, JsProcessingSymbolicatedFrame, + }, +}; + +use super::{JsProcessingSymbolicateStacktraces, SymbolicationActor}; + +// TODO(sourcemap): Use our generic caching solution for all Artifacts. +// TODO(sourcemap): Rename all `JsProcessing_` and `js_processing_` prefixed names to something we agree on. + +pub type OwnedSourceMapCache = SelfCell, SourceMapCache<'static>>; + +fn smcache_from_files( + source: &mut NamedTempFile, + sourcemap: &mut NamedTempFile, +) -> OwnedSourceMapCache { + use std::io::Read; + + let mut source_buf = String::new(); + source.as_file_mut().read_to_string(&mut source_buf).ok(); + + let mut sourcemap_buf = String::new(); + sourcemap + .as_file_mut() + .read_to_string(&mut sourcemap_buf) + .ok(); + + let smcache_writer = SourceMapCacheWriter::new(&source_buf, &sourcemap_buf).unwrap(); + let mut smcache_buf = vec![]; + smcache_writer.serialize(&mut smcache_buf).unwrap(); + + let byteview = ByteView::from_vec(smcache_buf); + SelfCell::try_new::(byteview, |data| unsafe { + SourceMapCache::parse(&*data) + }) + .unwrap() +} + +// TODO(sourcemap): Move this and related functions to its own file, similar to how `ModuleLookup` works. +impl SymbolicationActor { + // TODO(sourcemap): Handle 3rd party servers fetching (payload should decide about it, as it's user-configurable in the UI) + async fn collect_stacktrace_artifacts( + &self, + request: &JsProcessingSymbolicateStacktraces, + ) -> HashMap { + // TODO(sourcemap): Fetch all files concurrently using futures join + let mut unique_abs_paths = HashSet::new(); + for stacktrace in &request.stacktraces { + for frame in &stacktrace.frames { + unique_abs_paths.insert(frame.abs_path.clone()); + } + } + + let mut collected_artifacts = HashMap::new(); + let release_archive = self.sourcemaps.list_artifacts(request.source.clone()).await; + + for abs_path in unique_abs_paths { + let Ok(abs_path_url) = Url::parse(&abs_path) else { + continue + }; + + let mut source_file = None; + let mut source_artifact = None; + + for candidate in get_release_file_candidate_urls(&abs_path_url) { + if let Some(sa) = release_archive.get(&candidate) { + if let Some(sf) = self + .sourcemaps + .fetch_artifact(request.source.clone(), sa.id.clone()) + .await + { + source_file = Some(sf); + source_artifact = Some(sa.to_owned()); + break; + } + } + } + + // TODO(sourcemap): Report missing source error + let (Some(mut source_file), Some(source_artifact)) = (source_file, source_artifact) else { + continue; + }; + + let Some(sourcemap_url) = resolve_sourcemap_url(&abs_path_url, &source_artifact, &source_file) else { + continue; + }; + + let mut sourcemap_file = None; + for candidate in get_release_file_candidate_urls(&sourcemap_url) { + if let Some(sourcemap_artifact) = release_archive.get(&candidate) { + if let Some(sf) = self + .sourcemaps + .fetch_artifact(request.source.clone(), sourcemap_artifact.id.clone()) + .await + { + sourcemap_file = Some(sf); + break; + } + } + } + + // TODO(sourcemap): Report missing source error + let Some(mut sourcemap_file) = sourcemap_file else { + continue; + }; + + collected_artifacts.insert( + abs_path, + smcache_from_files(&mut source_file, &mut sourcemap_file), + ); + } + + collected_artifacts + } + + #[tracing::instrument(skip_all)] + pub async fn js_processing_symbolicate( + &self, + request: JsProcessingSymbolicateStacktraces, + ) -> Result { + let artifacts = self.collect_stacktrace_artifacts(&request).await; + + let stacktraces: Vec<_> = request + .stacktraces + .into_iter() + .map(|trace| js_processing_symbolicate_stacktrace(trace, &artifacts)) + .collect(); + + Ok(JsProcessingCompletedSymbolicationResponse { stacktraces }) + } +} + +fn js_processing_symbolicate_stacktrace( + stacktrace: JsProcessingRawStacktrace, + artifacts: &HashMap, +) -> CompleteJsStacktrace { + let mut symbolicated_frames = vec![]; + let unsymbolicated_frames_iter = stacktrace.frames.into_iter(); + + for mut frame in unsymbolicated_frames_iter { + match js_processing_symbolicate_frame(&mut frame, artifacts) { + Ok(frame) => symbolicated_frames.push(frame), + Err(_status) => { + symbolicated_frames.push(JsProcessingSymbolicatedFrame { + status: FrameStatus::Missing, + raw: frame, + }); + } + } + } + + CompleteJsStacktrace { + frames: symbolicated_frames, + } +} + +fn js_processing_symbolicate_frame( + frame: &mut JsProcessingRawFrame, + artifacts: &HashMap, +) -> Result { + if let Some(smcache) = artifacts.get(&frame.abs_path) { + // TODO(sourcemap): Report invalid source location error + let token = smcache + .get() + .lookup(SourcePosition::new( + frame.lineno.unwrap() - 1, + frame.colno.unwrap() - 1, + )) + .unwrap(); + + let mut result = JsProcessingSymbolicatedFrame { + status: FrameStatus::Symbolicated, + raw: JsProcessingRawFrame { + function: match token.scope() { + ScopeLookupResult::NamedScope(name) => Some(name.to_string()), + ScopeLookupResult::AnonymousScope => Some("".to_string()), + ScopeLookupResult::Unknown => Some("".to_string()), + }, + filename: token.name().map(ToString::to_string), + abs_path: token.file_name().unwrap_or("").to_string(), + lineno: Some(token.line()), + colno: Some(token.column()), + pre_context: vec![], + context_line: None, + post_context: vec![], + }, + }; + + if let Some(file) = token.file() { + let current_line = token.line(); + + result.raw.context_line = token.line_contents().map(ToString::to_string); + + let pre_line = current_line.saturating_sub(5); + result.raw.pre_context = (pre_line..current_line) + .filter_map(|line| file.line(line as usize)) + .map(|v| v.to_string()) + .collect(); + + let post_line = current_line.saturating_add(5); + result.raw.post_context = (current_line + 1..=post_line) + .filter_map(|line| file.line(line as usize)) + .map(|v| v.to_string()) + .collect(); + } + + Ok(result) + } else { + Err(FrameStatus::Missing) + } +} + +// Transforms a full absolute url into 2 or 4 generalized options. Based on `ReleaseFile.normalize`. +// https://github.com/getsentry/sentry/blob/master/src/sentry/models/releasefile.py +fn get_release_file_candidate_urls(url: &Url) -> Vec { + let mut urls = vec![]; + + // Absolute without fragment + urls.push(url[..Position::AfterQuery].to_string()); + + // Absolute without query + if url.query().is_some() { + urls.push(url[..Position::AfterPath].to_string()) + } + + // Relative without fragment + urls.push(format!( + "~{}", + &url[Position::BeforePath..Position::AfterQuery] + )); + + // Relative without query + if url.query().is_some() { + urls.push(format!( + "~{}", + &url[Position::BeforePath..Position::AfterPath] + )); + } + + urls +} + +// Joins together frames `abs_path` and discovered sourcemap reference. +fn resolve_sourcemap_url( + abs_path: &Url, + source_artifact: &SearchArtifactResult, + source_file: &NamedTempFile, +) -> Option { + if let Some(header) = source_artifact.headers.get("Sourcemap") { + abs_path.join(header).ok() + } else if let Some(header) = source_artifact.headers.get("X-SourceMap") { + abs_path.join(header).ok() + } else { + let sm_ref = locate_sourcemap_reference(BufReader::new(source_file.as_file())).ok()??; + abs_path.join(sm_ref.get_url()).ok() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_release_file_candidate_urls() { + let url = "https://example.com/assets/bundle.min.js".parse().unwrap(); + let expected = vec![ + "https://example.com/assets/bundle.min.js", + "~/assets/bundle.min.js", + ]; + assert_eq!(get_release_file_candidate_urls(&url), expected); + + let url = "https://example.com/assets/bundle.min.js?foo=1&bar=baz" + .parse() + .unwrap(); + let expected = vec![ + "https://example.com/assets/bundle.min.js?foo=1&bar=baz", + "https://example.com/assets/bundle.min.js", + "~/assets/bundle.min.js?foo=1&bar=baz", + "~/assets/bundle.min.js", + ]; + assert_eq!(get_release_file_candidate_urls(&url), expected); + + let url = "https://example.com/assets/bundle.min.js#wat" + .parse() + .unwrap(); + let expected = vec![ + "https://example.com/assets/bundle.min.js", + "~/assets/bundle.min.js", + ]; + assert_eq!(get_release_file_candidate_urls(&url), expected); + + let url = "https://example.com/assets/bundle.min.js?foo=1&bar=baz#wat" + .parse() + .unwrap(); + let expected = vec![ + "https://example.com/assets/bundle.min.js?foo=1&bar=baz", + "https://example.com/assets/bundle.min.js", + "~/assets/bundle.min.js?foo=1&bar=baz", + "~/assets/bundle.min.js", + ]; + assert_eq!(get_release_file_candidate_urls(&url), expected); + } +} diff --git a/crates/symbolicator-service/src/types/mod.rs b/crates/symbolicator-service/src/types/mod.rs index 55b9e8cde..5a7496263 100644 --- a/crates/symbolicator-service/src/types/mod.rs +++ b/crates/symbolicator-service/src/types/mod.rs @@ -491,6 +491,28 @@ impl From for CompleteObjectInfo { } } +/// A wrapper around possible completed endpoint responses. +/// +/// This allows us to support multiple independent types of symbolication. +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(untagged)] +pub enum CompletedResponse { + Symbolication(CompletedSymbolicationResponse), + SourceMap(JsProcessingCompletedSymbolicationResponse), +} + +impl From for CompletedResponse { + fn from(response: CompletedSymbolicationResponse) -> Self { + Self::Symbolication(response) + } +} + +impl From for CompletedResponse { + fn from(response: JsProcessingCompletedSymbolicationResponse) -> Self { + Self::SourceMap(response) + } +} + /// The symbolicated crash data. /// /// It contains the symbolicated stack frames, module information as well as other @@ -543,6 +565,11 @@ pub struct CompletedSymbolicationResponse { pub modules: Vec, } +#[derive(Debug, Default, Clone, Deserialize, Serialize)] +pub struct JsProcessingCompletedSymbolicationResponse { + pub stacktraces: Vec, +} + /// Information about the operating system. #[derive(Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] pub struct SystemInfo { @@ -561,3 +588,48 @@ pub struct SystemInfo { /// Device model name pub device_model: String, } + +// TODO: Verify which are required fields +#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq)] +pub struct JsProcessingRawFrame { + #[serde(skip_serializing_if = "Option::is_none")] + pub function: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub filename: Option, + + pub abs_path: String, + + #[serde(skip_serializing_if = "Option::is_none")] + pub lineno: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub colno: Option, + + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub pre_context: Vec, + + #[serde(skip_serializing_if = "Option::is_none")] + pub context_line: Option, + + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub post_context: Vec, +} + +#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)] +pub struct JsProcessingRawStacktrace { + pub frames: Vec, +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize)] +pub struct JsProcessingSymbolicatedFrame { + pub status: FrameStatus, + + #[serde(flatten)] + pub raw: JsProcessingRawFrame, +} + +#[derive(Debug, Default, Clone, Deserialize, Serialize)] +pub struct CompleteJsStacktrace { + pub frames: Vec, +} diff --git a/crates/symbolicator-sources/src/sources/sentry.rs b/crates/symbolicator-sources/src/sources/sentry.rs index dc84a1a3f..23cff3483 100644 --- a/crates/symbolicator-sources/src/sources/sentry.rs +++ b/crates/symbolicator-sources/src/sources/sentry.rs @@ -25,6 +25,7 @@ pub struct SentryRemoteFile { /// The underlying [`SentrySourceConfig`]. pub source: Arc, pub(crate) file_id: SentryFileId, + pub(crate) r#type: SentryFileType, } impl From for RemoteFile { @@ -35,20 +36,47 @@ impl From for RemoteFile { impl SentryRemoteFile { /// Creates a new [`SentryRemoteFile`]. - pub fn new(source: Arc, file_id: SentryFileId) -> Self { - Self { source, file_id } + pub fn new( + source: Arc, + file_id: SentryFileId, + r#type: SentryFileType, + ) -> Self { + Self { + source, + file_id, + r#type, + } } /// Gives a synthetic [`RemoteFileUri`] for this file. pub fn uri(&self) -> RemoteFileUri { - format!("sentry://project_debug_file/{}", self.file_id).into() + match self.r#type { + SentryFileType::DebugFile => { + format!("sentry://project_debug_file/{}", self.file_id).into() + } + SentryFileType::ReleaseArtifact => { + format!("sentry://project_release_artifact/{}", self.file_id).into() + } + } } /// Returns the URL from which to download this object file. pub fn url(&self) -> Url { - let mut url = self.source.url.clone(); - url.query_pairs_mut().append_pair("id", &self.file_id.0); - url + match self.r#type { + SentryFileType::DebugFile => { + let mut url = self.source.url.clone(); + url.query_pairs_mut().append_pair("id", &self.file_id.0); + url + } + SentryFileType::ReleaseArtifact => { + let mut url = self.source.url.clone(); + url = url + .join(&format!("{}/", &self.file_id.to_string())) + .unwrap(); + url.query_pairs_mut().append_pair("download", "1"); + url + } + } } } @@ -61,3 +89,12 @@ impl fmt::Display for SentryFileId { write!(f, "{}", self.0) } } + +/// Available file types stored on Sentry servers. +#[derive(Debug, Clone)] +pub enum SentryFileType { + /// Native Debug Information File + DebugFile, + /// JavaScript Release Artifact (SourceCode/SourceMap) + ReleaseArtifact, +} diff --git a/crates/symbolicator/src/endpoints/mod.rs b/crates/symbolicator/src/endpoints/mod.rs index 17e72ecbf..fd956ef3d 100644 --- a/crates/symbolicator/src/endpoints/mod.rs +++ b/crates/symbolicator/src/endpoints/mod.rs @@ -13,6 +13,7 @@ mod minidump; mod multipart; mod proxy; mod requests; +mod sourcemap; mod symbolicate; pub use error::ResponseError; @@ -22,6 +23,7 @@ use self::minidump::handle_minidump_request as minidump; use applecrashreport::handle_apple_crash_report_request as applecrashreport; use proxy::proxy_symstore_request as proxy; use requests::poll_request as requests; +use sourcemap::handle_sourcemap_request as sourcemap; use symbolicate::symbolicate_frames as symbolicate; pub async fn healthcheck() -> &'static str { @@ -43,6 +45,8 @@ pub fn create_app(service: RequestService) -> Router { .route("/requests/:request_id", get(requests)) .route("/applecrashreport", post(applecrashreport)) .route("/minidump", post(minidump)) + // TODO(sourcemap): Verify whether this is the endpoint name we actually want to use. + .route("/sourcemap", post(sourcemap)) .route("/symbolicate", symbolicate_route) .with_state(service) .layer(layer) diff --git a/crates/symbolicator/src/endpoints/sourcemap.rs b/crates/symbolicator/src/endpoints/sourcemap.rs new file mode 100644 index 000000000..4702d0638 --- /dev/null +++ b/crates/symbolicator/src/endpoints/sourcemap.rs @@ -0,0 +1,51 @@ +use std::sync::Arc; + +use axum::extract; +use axum::response::Json; +use serde::{Deserialize, Serialize}; +use symbolicator_service::services::symbolication::JsProcessingSymbolicateStacktraces; +use symbolicator_sources::SentrySourceConfig; + +use crate::endpoints::symbolicate::SymbolicationRequestQueryParams; +use crate::service::{JsProcessingRawStacktrace, RequestService, SymbolicationResponse}; +use crate::utils::sentry::ConfigureScope; + +use super::ResponseError; + +#[derive(Serialize, Deserialize)] +pub struct SourcemapRequestBody { + #[serde(default)] + pub source: Option, + #[serde(default)] + pub stacktraces: Vec, + #[serde(default)] + pub dist: Option, +} + +pub async fn handle_sourcemap_request( + extract::State(service): extract::State, + extract::Query(params): extract::Query, + extract::Json(body): extract::Json, +) -> Result, ResponseError> { + sentry::start_session(); + + params.configure_scope(); + + let SourcemapRequestBody { + source, + stacktraces, + dist, + } = body; + + let request_id = + service.js_processing_symbolicate_stacktraces(JsProcessingSymbolicateStacktraces { + source: Arc::new(source.unwrap()), + stacktraces, + dist, + })?; + + match service.get_response(request_id, params.timeout).await { + Some(response) => Ok(Json(response)), + None => Err("symbolication request did not start".into()), + } +} diff --git a/crates/symbolicator/src/service.rs b/crates/symbolicator/src/service.rs index 208da4a86..56bfc7a46 100644 --- a/crates/symbolicator/src/service.rs +++ b/crates/symbolicator/src/service.rs @@ -33,7 +33,7 @@ use symbolicator_service::config::Config; use symbolicator_service::metric; use symbolicator_service::services::objects::ObjectsActor; use symbolicator_service::services::symbolication::SymbolicationActor; -use symbolicator_service::types::CompletedSymbolicationResponse; +use symbolicator_service::types::{CompletedResponse, CompletedSymbolicationResponse}; use symbolicator_service::utils::futures::CallOnDrop; use symbolicator_service::utils::futures::{m, measure}; use symbolicator_sources::SourceConfig; @@ -41,8 +41,12 @@ use symbolicator_sources::SourceConfig; pub use symbolicator_service::services::objects::{ FindObject, FindResult, ObjectHandle, ObjectMetaHandle, ObjectPurpose, }; -pub use symbolicator_service::services::symbolication::{StacktraceOrigin, SymbolicateStacktraces}; -pub use symbolicator_service::types::{RawObjectInfo, RawStacktrace, Scope, Signal}; +pub use symbolicator_service::services::symbolication::{ + JsProcessingSymbolicateStacktraces, StacktraceOrigin, SymbolicateStacktraces, +}; +pub use symbolicator_service::types::{ + JsProcessingRawStacktrace, RawObjectInfo, RawStacktrace, Scope, Signal, +}; /// Symbolication task identifier. #[derive(Debug, Clone, Copy, Serialize, Ord, PartialOrd, Eq, PartialEq)] @@ -91,7 +95,7 @@ pub enum SymbolicationResponse { /// An indication when the next poll would be suitable. retry_after: usize, }, - Completed(Box), + Completed(Box), Failed { message: String, }, @@ -258,10 +262,34 @@ impl RequestService { sentry::configure_scope(|scope| scope.set_span(Some(transaction.clone().into()))); let res = slf.symbolication.symbolicate(request).await; transaction.finish(); - res + res.map(Into::into) }) } + pub fn js_processing_symbolicate_stacktraces( + &self, + request: JsProcessingSymbolicateStacktraces, + ) -> Result { + let slf = self.inner.clone(); + let span = sentry::configure_scope(|scope| scope.get_span()); + let ctx = sentry::TransactionContext::continue_from_span( + "js_processing_symbolicate_stacktraces", + "js_processing_symbolicate_stacktraces", + span, + ); + self.create_symbolication_request( + "js_processing_symbolicate", + RequestOptions::default(), + async move { + let transaction = sentry::start_transaction(ctx); + sentry::configure_scope(|scope| scope.set_span(Some(transaction.clone().into()))); + let res = slf.symbolication.js_processing_symbolicate(request).await; + transaction.finish(); + res.map(Into::into) + }, + ) + } + /// Creates a new request to process a minidump. /// /// Returns an `Err` if the [`RequestService`] is already processing the @@ -288,7 +316,7 @@ impl RequestService { .process_minidump(scope, minidump_file, sources) .await; transaction.finish(); - res + res.map(Into::into) }) } @@ -318,7 +346,7 @@ impl RequestService { .process_apple_crash_report(scope, apple_crash_report, sources) .await; transaction.finish(); - res + res.map(Into::into) }) } @@ -361,7 +389,7 @@ impl RequestService { f: F, ) -> Result where - F: Future> + Send + 'static, + F: Future> + Send + 'static, { let (sender, receiver) = oneshot::channel(); @@ -413,7 +441,9 @@ impl RequestService { let response = match result { Ok(mut response) => { if !options.dif_candidates { - clear_dif_candidates(&mut response); + if let CompletedResponse::Symbolication(ref mut res) = response { + clear_dif_candidates(res) + } } sentry::end_session_with_status(SessionStatus::Exited); SymbolicationResponse::Completed(Box::new(response))