From 9161340d1d029ac2241c7dd731460353492843b5 Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Tue, 3 Sep 2024 16:14:56 -0400 Subject: [PATCH 01/68] add publish config to make package public (#20) --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4eb55fa6..9cc95786 100644 --- a/package.json +++ b/package.json @@ -22,5 +22,8 @@ "bugs": { "url": "https://github.com/DataDog/libdatadog-nodejs/issues" }, - "homepage": "https://github.com/DataDog/libdatadog-nodejs#readme" + "homepage": "https://github.com/DataDog/libdatadog-nodejs#readme", + "publishConfig": { + "access": "public" + } } From 0c81664fcb162cbca3f9fc0063bd14ccd8ea4e62 Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Tue, 3 Sep 2024 17:31:01 -0400 Subject: [PATCH 02/68] add missing build step before release (#24) --- .github/workflows/build.yml | 1 + .github/workflows/release.yml | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 69903b13..1701873d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,6 +15,7 @@ jobs: min-node-version: 14 rust: true only: linux-arm64,linux-x64,linuxmusl-arm64,linuxmusl-x64 + package-size: runs-on: ubuntu-latest needs: build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 56955405..8687e120 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,16 +10,27 @@ concurrency: cancel-in-progress: true jobs: + build: + uses: Datadog/action-prebuildify/.github/workflows/build.yml@main + with: + package-manager: 'npm' + cache: false + min-node-version: 14 + rust: true + only: linux-arm64,linux-x64,linuxmusl-arm64,linuxmusl-x64 + publish: runs-on: ubuntu-latest + needs: build environment: npm env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} outputs: pkgjson: ${{ steps.pkg.outputs.json }} steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + - uses: actions/setup-node@v4 with: registry-url: 'https://registry.npmjs.org' - run: npm publish From 96d5bb1425c73e89411ed63a0c95ee3356d42eac Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Tue, 3 Sep 2024 17:31:19 -0400 Subject: [PATCH 03/68] add write permission to publish job for git tagging (#22) --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8687e120..62231d80 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,6 +23,8 @@ jobs: runs-on: ubuntu-latest needs: build environment: npm + permissions: + - contents: write env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} outputs: From ac0a33dc454e13c718576c623779ad65037f38d4 Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Wed, 4 Sep 2024 08:36:51 -0400 Subject: [PATCH 04/68] fix invalid yaml for publish job permissions (#26) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 62231d80..50c64267 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: needs: build environment: npm permissions: - - contents: write + contents: write env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} outputs: From cfe9709ed4c3d1f12b084c4a12125a004672c434 Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Wed, 4 Sep 2024 09:51:12 -0400 Subject: [PATCH 05/68] fix concurrency deadlock in release job (#28) --- .github/workflows/release.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 50c64267..a8fce2c3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,10 +5,6 @@ on: branches: - v0.x -concurrency: - group: ${{ github.workflow }}-${{ github.ref || github.run_id }} - cancel-in-progress: true - jobs: build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main From 5ff0387750211196828148f66ad45af759bbc74a Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Tue, 17 Sep 2024 18:20:15 -0400 Subject: [PATCH 06/68] add crash report test for the receiver (#30) --- .github/workflows/build.yml | 4 +- .github/workflows/release.yml | 3 +- Cargo.lock | 55 +- crates/crashtracker/Cargo.toml | 3 +- crates/crashtracker/src/bin/receiver.rs | 2 + crates/crashtracker/src/lib.rs | 27 +- load.js | 11 +- package-lock.json | 8 +- test/crashtracker.js | 30 - test/crashtracker/.gitignore | 2 + test/crashtracker/Cargo.lock | 264 +++++++++ test/crashtracker/Cargo.toml | 15 + test/crashtracker/app.js | 40 ++ test/crashtracker/index.js | 64 ++ test/crashtracker/package-lock.json | 750 ++++++++++++++++++++++++ test/crashtracker/package.json | 14 + test/crashtracker/src/lib.rs | 8 + 17 files changed, 1219 insertions(+), 81 deletions(-) delete mode 100644 test/crashtracker.js create mode 100644 test/crashtracker/.gitignore create mode 100644 test/crashtracker/Cargo.lock create mode 100644 test/crashtracker/Cargo.toml create mode 100644 test/crashtracker/app.js create mode 100644 test/crashtracker/index.js create mode 100644 test/crashtracker/package-lock.json create mode 100644 test/crashtracker/package.json create mode 100644 test/crashtracker/src/lib.rs diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1701873d..b9cd9b28 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,9 +12,9 @@ jobs: with: package-manager: 'npm' cache: false - min-node-version: 14 + min-node-version: 16 rust: true - only: linux-arm64,linux-x64,linuxmusl-arm64,linuxmusl-x64 + only: darwin-arm64,darwin-x64,linux-arm64,linux-x64 package-size: runs-on: ubuntu-latest diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a8fce2c3..a581c8f7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: cache: false min-node-version: 14 rust: true - only: linux-arm64,linux-x64,linuxmusl-arm64,linuxmusl-x64 + only: darwin-arm64,darwin-x64,linux-arm64,linux-x64 publish: runs-on: ubuntu-latest @@ -31,6 +31,7 @@ jobs: - uses: actions/setup-node@v4 with: registry-url: 'https://registry.npmjs.org' + - run: chmod -R +x ./prebuilds - run: npm publish - id: pkg run: | diff --git a/Cargo.lock b/Cargo.lock index 547dde88..54c7653d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" version = "0.7.8" @@ -101,7 +107,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.4", "object", "rustc-demangle", ] @@ -149,13 +155,15 @@ checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "blazesym" -version = "0.2.0-rc.0" -source = "git+https://github.com/libbpf/blazesym.git?rev=v0.2.0-rc.0#2f393f66a448f46ea71889e81a8866799762463d" +version = "0.2.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750f0052cfee86c14cbc31eda95c14271e16347196fd4902df1a52e4411a090" dependencies = [ "cpp_demangle", - "gimli 0.30.0", + "gimli 0.31.0", "libc", - "miniz_oxide", + "memmap2", + "miniz_oxide 0.8.0", "rustc-demangle", ] @@ -299,6 +307,7 @@ dependencies = [ "datadog-crashtracker", "napi", "napi-derive", + "rustls 0.23.12", ] [[package]] @@ -341,7 +350,7 @@ dependencies = [ [[package]] name = "datadog-crashtracker" version = "12.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#16528ffee456f7af5fe9ad80a6294fb5dcd38918" +source = "git+https://github.com/DataDog/libdatadog.git?branch=main#54ed2cfcc583e57b366078b5952793f9e6db0c8f" dependencies = [ "anyhow", "backtrace", @@ -366,7 +375,7 @@ dependencies = [ [[package]] name = "datadog-ddsketch" version = "12.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#16528ffee456f7af5fe9ad80a6294fb5dcd38918" +source = "git+https://github.com/DataDog/libdatadog.git?branch=main#54ed2cfcc583e57b366078b5952793f9e6db0c8f" dependencies = [ "prost", ] @@ -437,7 +446,7 @@ dependencies = [ [[package]] name = "ddcommon" version = "12.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#16528ffee456f7af5fe9ad80a6294fb5dcd38918" +source = "git+https://github.com/DataDog/libdatadog.git?branch=main#54ed2cfcc583e57b366078b5952793f9e6db0c8f" dependencies = [ "anyhow", "futures", @@ -449,6 +458,7 @@ dependencies = [ "hyper-rustls 0.27.2", "hyper-util", "lazy_static", + "libc", "log", "pin-project", "regex", @@ -458,12 +468,13 @@ dependencies = [ "static_assertions", "tokio", "tokio-rustls 0.26.0", + "windows-sys 0.52.0", ] [[package]] name = "ddtelemetry" version = "12.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#16528ffee456f7af5fe9ad80a6294fb5dcd38918" +source = "git+https://github.com/DataDog/libdatadog.git?branch=main#54ed2cfcc583e57b366078b5952793f9e6db0c8f" dependencies = [ "anyhow", "base64 0.22.1", @@ -527,7 +538,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.7.4", ] [[package]] @@ -650,9 +661,9 @@ checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "gimli" -version = "0.30.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e1d97fbe9722ba9bbd0c97051c2956e726562b61f86a25a4360398a40edfc9" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" dependencies = [ "fallible-iterator", "indexmap", @@ -973,6 +984,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -986,6 +1006,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", "simd-adler32", ] @@ -1046,8 +1075,6 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "regex", - "semver", "syn 2.0.72", ] diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index ec398a5b..946d87c4 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -16,4 +16,5 @@ path = "src/bin/receiver.rs" anyhow = "1" datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", branch = "main" } napi = { version = "2", features = ["serde-json"] } -napi-derive = { version = "2" } +napi-derive = { version = "2", default-features = false } +rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } diff --git a/crates/crashtracker/src/bin/receiver.rs b/crates/crashtracker/src/bin/receiver.rs index f84198b5..837e824a 100644 --- a/crates/crashtracker/src/bin/receiver.rs +++ b/crates/crashtracker/src/bin/receiver.rs @@ -3,5 +3,7 @@ fn main() {} #[cfg(unix)] fn main() -> anyhow::Result<()> { + // TODO: remove this line when the receiver default provider is fixed + rustls::crypto::aws_lc_rs::default_provider().install_default().unwrap(); datadog_crashtracker::receiver_entry_point_stdin() } diff --git a/crates/crashtracker/src/lib.rs b/crates/crashtracker/src/lib.rs index f4ed8465..afb07265 100644 --- a/crates/crashtracker/src/lib.rs +++ b/crates/crashtracker/src/lib.rs @@ -1,19 +1,12 @@ -use datadog_crashtracker::CrashtrackerReceiverConfig; use napi::{Env, JsUnknown}; use napi_derive::napi; -use std::{env::temp_dir, fs, path::{self}}; - -#[cfg(unix)] -use std::os::unix::fs::PermissionsExt; #[napi] pub fn init_with_receiver(env: Env, config: JsUnknown, receiver_config: JsUnknown, metadata: JsUnknown) -> napi::Result<()> { let config = env.from_js_value(config)?; - let mut receiver_config = env.from_js_value(receiver_config)?; + let receiver_config = env.from_js_value(receiver_config)?; let metadata = env.from_js_value(metadata)?; - copy_receiver(&mut receiver_config).unwrap(); - datadog_crashtracker::init_with_receiver(config, receiver_config, metadata).unwrap(); Ok(()) @@ -36,21 +29,3 @@ pub fn update_metadata (env: Env, metadata: JsUnknown) -> napi::Result<()> { Ok(()) } - -pub fn copy_receiver (receiver_config: &mut CrashtrackerReceiverConfig) -> Result<(), anyhow::Error> { - let parts: Vec<_> = receiver_config.path_to_receiver_binary.rsplit(path::MAIN_SEPARATOR).collect(); - let dest = temp_dir().join(parts[0]); - - std::fs::copy(&receiver_config.path_to_receiver_binary, &dest)?; - - let mut perms = fs::metadata(&dest)?.permissions(); - - #[cfg(unix)] - perms.set_mode(0o777); - - fs::set_permissions(&dest, perms)?; - - receiver_config.path_to_receiver_binary = dest.to_string_lossy().to_string(); - - Ok(()) -} diff --git a/load.js b/load.js index 6c7b41e3..b808c4fb 100644 --- a/load.js +++ b/load.js @@ -52,10 +52,15 @@ function find (name, binary = false) { } function findFolder (root) { - const folders = readdirSync(path.join(root, 'prebuilds')) + try { + const prebuilds = path.join(root, 'prebuilds') + const folders = readdirSync(prebuilds) - return folders.find(f => f === `${PLATFORM}${LIBC}-${ARCH}`) - || folders.find(f => f === `${PLATFORM}-${ARCH}`) + return folders.find(f => f === `${PLATFORM}${LIBC}-${ARCH}`) + || folders.find(f => f === `${PLATFORM}-${ARCH}`) + } catch (e) { + return null + } } function findFile (root, name, binary = false) { diff --git a/package-lock.json b/package-lock.json index 796ca79f..cb8631e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "libdatadog", - "version": "0.1.0", + "name": "@datadog/libdatadog", + "version": "0.1.0-pre", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "libdatadog", - "version": "0.1.0", + "name": "@datadog/libdatadog", + "version": "0.1.0-pre", "license": "Apache-2.0" } } diff --git a/test/crashtracker.js b/test/crashtracker.js deleted file mode 100644 index 66dedacc..00000000 --- a/test/crashtracker.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const libdatadog = require('..') -const crashtracker = libdatadog.load('crashtracker') - -crashtracker.initWithReceiver({ - additional_files: [], - create_alt_stack: false, - endpoint: { - url: { - scheme: 'http', - authority: 'localhost:8126', - path_and_query: '' - }, - timeout_ms: 3000 - }, - resolve_frames: 'Disabled', - wait_for_receiver: false -}, { - args: [], - env: [], - path_to_receiver_binary: libdatadog.find('crashtracker-receiver', true), - stderr_filename: null, - stdout_filename: null, -}, { - library_name: "dd-trace-js", - library_version: '0.0.0', - family: 'nodejs', - tags: [] -}) diff --git a/test/crashtracker/.gitignore b/test/crashtracker/.gitignore new file mode 100644 index 00000000..be311a70 --- /dev/null +++ b/test/crashtracker/.gitignore @@ -0,0 +1,2 @@ +index.d.ts +index.node diff --git a/test/crashtracker/Cargo.lock b/test/crashtracker/Cargo.lock new file mode 100644 index 00000000..3ed1c9f1 --- /dev/null +++ b/test/crashtracker/Cargo.lock @@ -0,0 +1,264 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "ctor" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "napi" +version = "2.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1277600d452e570cc83cf5f4e8efb389cc21e5cbefadcfba7239f4551e2e3e99" +dependencies = [ + "bitflags", + "ctor", + "napi-derive", + "napi-sys", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "napi-derive" +version = "2.16.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "150d87c4440b9f4815cb454918db498b5aae9a57aa743d20783fe75381181d01" +dependencies = [ + "cfg-if", + "convert_case", + "napi-derive-backend", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "napi-derive-backend" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cd81b794fc1d6051acf8c4f3cb4f82833b0621272a232b4ff0cf3df1dbddb61" +dependencies = [ + "convert_case", + "once_cell", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "napi-sys" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427802e8ec3a734331fec1035594a210ce1ff4dc5bc1950530920ab717964ea3" +dependencies = [ + "libloading", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "segfault" +version = "0.1.0" +dependencies = [ + "napi", + "napi-derive", +] + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/test/crashtracker/Cargo.toml b/test/crashtracker/Cargo.toml new file mode 100644 index 00000000..9e78a15c --- /dev/null +++ b/test/crashtracker/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "segfault" +version = "0.1.0" +edition = "2018" + +[lib] +crate-type = ["cdylib"] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[workspace] + +[dependencies] +napi = { version = "2", features = ["serde-json"] } +napi-derive = { version = "2", default-features = false } diff --git a/test/crashtracker/app.js b/test/crashtracker/app.js new file mode 100644 index 00000000..5c5e9711 --- /dev/null +++ b/test/crashtracker/app.js @@ -0,0 +1,40 @@ +'use strict' + +const os = require('os') +const libdatadog = require('../..') +const crashtracker = libdatadog.load('crashtracker') + +crashtracker.initWithReceiver({ + additional_files: [], + create_alt_stack: false, + endpoint: { + url: { + scheme: 'http', + authority: `127.0.0.1:${process.env.PORT || 8126}`, + path_and_query: '' + }, + timeout_ms: 3000 + }, + resolve_frames: 'EnabledWithInprocessSymbols', + wait_for_receiver: true +}, { + args: [], + env: [], + path_to_receiver_binary: libdatadog.find('crashtracker-receiver', true), + stderr_filename: 'stderr.log', + stdout_filename: 'stdout.log', +}, { + library_name: 'dd-trace-js', + library_version: '6.0.0-pre', + family: 'javascript', + tags: [ + 'language:javascript', + 'runtime:nodejs', + 'runtime-id:8a8fef6433a849b3bc3171198831d102', + 'library_version:6.0.0-pre', + 'is_crash:true', + 'severity:crash' + ] +}) + +require('./index.node').boom() diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js new file mode 100644 index 00000000..4604195c --- /dev/null +++ b/test/crashtracker/index.js @@ -0,0 +1,64 @@ +'use strict' + +const { execSync } = require('child_process') +const { existsSync } = require('fs') + +const cwd = __dirname +const stdio = ['inherit', 'inherit', 'inherit'] +const uid = process.getuid() +const gid = process.getgid() +const opts = { cwd, stdio, uid, gid } + +if (process.env.CI) { + execSync(`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --verbose`, opts) +} + +execSync('npm install', opts) +execSync('npm run --silent build', opts) + +const express = require('express') +const bodyParser = require('body-parser') + +const app = express() + +let timeout = setTimeout(() => { + execSync('cat stdout.log', opts) + execSync('cat stderr.log', opts) + + throw new Error('No crash report received before timing out.') +}, 10000) // TODO: reduce this when the receiver no longer locks up + +app.use(bodyParser.json()) + +app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { + clearTimeout(timeout) + + res.status(200).send() + + server.close(() => { + const stackTrace = JSON.parse(req.body.payload[0].stack_trace) + const boomFrame = stackTrace.find(frame => frame.names[0]?.name.includes('boom')) + + if (!boomFrame) { + throw new Error('Could not find a stack frame for the crashing function.') + } + }) +}) + +const server = app.listen(() => { + const PORT = server.address().port + + try { + execSync('node app', { + ...opts, + env: { + ...process.env, + PORT + } + }) + } catch (e) { + if (e.signal !== 'SIGSEGV' && e.status !== 139) { + throw e + } + } +}) diff --git a/test/crashtracker/package-lock.json b/test/crashtracker/package-lock.json new file mode 100644 index 00000000..8a7e4a0f --- /dev/null +++ b/test/crashtracker/package-lock.json @@ -0,0 +1,750 @@ +{ + "name": "crashtracker", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "body-parser": "^1.20.3", + "express": "^4.19.2" + }, + "devDependencies": { + "@napi-rs/cli": "^2.18.4" + } + }, + "node_modules/@napi-rs/cli": { + "version": "2.18.4", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.4.tgz", + "integrity": "sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==", + "dev": true, + "bin": { + "napi": "scripts/index.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/test/crashtracker/package.json b/test/crashtracker/package.json new file mode 100644 index 00000000..23bd8477 --- /dev/null +++ b/test/crashtracker/package.json @@ -0,0 +1,14 @@ +{ + "private": true, + "main": "index.js", + "scripts": { + "build": "napi build" + }, + "dependencies": { + "body-parser": "^1.20.3", + "express": "^4.19.2" + }, + "devDependencies": { + "@napi-rs/cli": "^2.18.4" + } +} diff --git a/test/crashtracker/src/lib.rs b/test/crashtracker/src/lib.rs new file mode 100644 index 00000000..4b5314b7 --- /dev/null +++ b/test/crashtracker/src/lib.rs @@ -0,0 +1,8 @@ +use napi_derive::napi; + +#[napi] +pub fn boom() -> napi::Result<()> { + unsafe { std::ptr::null_mut::().write(42) }; + + Ok(()) +} From 787c8c5339e1353cba8438991ff97692bc7bbf0b Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Wed, 18 Sep 2024 07:24:27 -0400 Subject: [PATCH 07/68] fix minimum node version for release ci job (#32) --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a581c8f7..82af9be1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ jobs: with: package-manager: 'npm' cache: false - min-node-version: 14 + min-node-version: 16 rust: true only: darwin-arm64,darwin-x64,linux-arm64,linux-x64 From 2bcf2eb037e504978577f4bff037bbb7c55649dc Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Mon, 11 Nov 2024 17:25:08 -0500 Subject: [PATCH 08/68] update crashtracker and use new init function (#36) --- .github/workflows/build.yml | 4 +- .github/workflows/release.yml | 4 +- Cargo.lock | 513 ++++++++++--------- README.md | 6 +- crates/crashtracker/src/lib.rs | 4 +- load.js | 2 +- package-lock.json | 13 - package.json | 10 +- test.js | 9 +- test/crashtracker/.gitignore | 3 +- test/crashtracker/Cargo.lock | 264 ---------- test/crashtracker/Cargo.toml | 15 - test/crashtracker/app.js | 9 +- test/crashtracker/index.js | 43 +- test/crashtracker/package-lock.json | 750 ---------------------------- test/crashtracker/package.json | 7 +- test/crashtracker/src/lib.rs | 8 - test/crashtracker/yarn.lock | 480 ++++++++++++++++++ yarn.lock | 4 + 19 files changed, 787 insertions(+), 1361 deletions(-) delete mode 100644 package-lock.json delete mode 100644 test/crashtracker/Cargo.lock delete mode 100644 test/crashtracker/Cargo.toml delete mode 100644 test/crashtracker/package-lock.json delete mode 100644 test/crashtracker/src/lib.rs create mode 100644 test/crashtracker/yarn.lock create mode 100644 yarn.lock diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b9cd9b28..1c85d4b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ jobs: build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main with: - package-manager: 'npm' + package-manager: 'yarn' cache: false min-node-version: 16 rust: true @@ -27,7 +27,7 @@ jobs: - uses: actions/download-artifact@v4 - name: Setup Node.js uses: actions/setup-node@v4 - - run: yarn + - run: yarn install - name: Compute module size tree and report uses: qard/heaviest-objects-in-the-universe@v1 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 82af9be1..245893b8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,7 +9,7 @@ jobs: build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main with: - package-manager: 'npm' + package-manager: 'yarn' cache: false min-node-version: 16 rust: true @@ -18,7 +18,7 @@ jobs: publish: runs-on: ubuntu-latest needs: build - environment: npm + environment: yarn permissions: contents: write env: diff --git a/Cargo.lock b/Cargo.lock index 54c7653d..da76b41e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,19 +4,13 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli 0.29.0", + "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -25,13 +19,14 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.7.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "getrandom", + "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -43,6 +38,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -60,21 +61,21 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae74d9bd0a7530e8afd1770739ad34b36838829d6ad61818f9230f683f5ad77" +checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -84,9 +85,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.20.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0e249228c6ad2d240c2dc94b714d711629d52bad946075d8e9b2f5391f0703" +checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" dependencies = [ "bindgen", "cc", @@ -99,17 +100,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -126,14 +127,14 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ "bitflags", "cexpr", "clang-sys", - "itertools", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -143,7 +144,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.72", + "syn 2.0.87", "which", ] @@ -160,10 +161,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750f0052cfee86c14cbc31eda95c14271e16347196fd4902df1a52e4411a090" dependencies = [ "cpp_demangle", - "gimli 0.31.0", + "gimli", "libc", "memmap2", - "miniz_oxide 0.8.0", + "miniz_oxide", "rustc-demangle", ] @@ -181,18 +182,19 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "cc" -version = "1.1.8" +version = "1.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549" +checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -236,9 +238,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.50" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" dependencies = [ "cc", ] @@ -256,7 +258,7 @@ name = "collector" version = "0.1.0" source = "git+https://github.com/DataDog/libdatadog.git?branch=rochdev/collector#c0ac24e3f58c7b27d50c7593ca9f465a32ac9682" dependencies = [ - "hyper 0.14.30", + "hyper 0.14.31", "once_cell", "rmp", "rmp-serde", @@ -286,15 +288,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpp_demangle" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" +checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" dependencies = [ "cfg-if", ] @@ -307,7 +309,7 @@ dependencies = [ "datadog-crashtracker", "napi", "napi-derive", - "rustls 0.23.12", + "rustls 0.23.16", ] [[package]] @@ -326,7 +328,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] @@ -341,7 +343,7 @@ dependencies = [ "datadog-trace-utils", "ddcommon 6.0.0", "futures", - "hyper 0.14.30", + "hyper 0.14.31", "log", "rmp-serde", "tokio", @@ -349,17 +351,17 @@ dependencies = [ [[package]] name = "datadog-crashtracker" -version = "12.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#54ed2cfcc583e57b366078b5952793f9e6db0c8f" +version = "13.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?branch=main#fb669524bc0171cead3d8ec997a5571c27e67f4b" dependencies = [ "anyhow", "backtrace", "blazesym", "chrono", - "ddcommon 12.0.0", + "ddcommon 13.1.0", "ddtelemetry", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "libc", "nix", "os_info", @@ -374,8 +376,8 @@ dependencies = [ [[package]] name = "datadog-ddsketch" -version = "12.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#54ed2cfcc583e57b366078b5952793f9e6db0c8f" +version = "13.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?branch=main#fb669524bc0171cead3d8ec997a5571c27e67f4b" dependencies = [ "prost", ] @@ -410,7 +412,7 @@ dependencies = [ "ddcommon 6.0.0", "flate2", "futures", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-rustls 0.23.2", "log", "prost", @@ -430,7 +432,7 @@ dependencies = [ "futures-util", "hex", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-rustls 0.23.2", "lazy_static", "log", @@ -445,8 +447,8 @@ dependencies = [ [[package]] name = "ddcommon" -version = "12.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#54ed2cfcc583e57b366078b5952793f9e6db0c8f" +version = "13.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?branch=main#fb669524bc0171cead3d8ec997a5571c27e67f4b" dependencies = [ "anyhow", "futures", @@ -454,16 +456,16 @@ dependencies = [ "futures-util", "hex", "http 0.2.12", - "hyper 0.14.30", - "hyper-rustls 0.27.2", + "hyper 0.14.31", + "hyper-rustls 0.27.3", "hyper-util", "lazy_static", "libc", "log", "pin-project", "regex", - "rustls 0.23.12", - "rustls-native-certs 0.6.3", + "rustls 0.23.16", + "rustls-native-certs 0.7.3", "serde", "static_assertions", "tokio", @@ -473,17 +475,17 @@ dependencies = [ [[package]] name = "ddtelemetry" -version = "12.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#54ed2cfcc583e57b366078b5952793f9e6db0c8f" +version = "13.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?branch=main#fb669524bc0171cead3d8ec997a5571c27e67f4b" dependencies = [ "anyhow", "base64 0.22.1", "datadog-ddsketch", - "ddcommon 12.0.0", + "ddcommon 13.1.0", "futures", - "hashbrown 0.12.3", + "hashbrown 0.14.5", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "io-lifetimes", "lazy_static", "pin-project", @@ -533,12 +535,12 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "flate2" -version = "1.0.31" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", - "miniz_oxide 0.7.4", + "miniz_oxide", ] [[package]] @@ -555,9 +557,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -570,9 +572,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -580,15 +582,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -597,38 +599,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -655,15 +657,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" - -[[package]] -name = "gimli" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ "fallible-iterator", "indexmap", @@ -678,18 +674,19 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", + "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "hermit-abi" @@ -757,9 +754,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -769,9 +766,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -792,9 +789,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -816,7 +813,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" dependencies = [ "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "rustls 0.20.9", "rustls-native-certs 0.6.3", "tokio", @@ -825,16 +822,16 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", - "rustls 0.23.12", - "rustls-native-certs 0.7.1", + "rustls 0.23.16", + "rustls-native-certs 0.8.0", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -843,29 +840,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.5.0", "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -886,12 +882,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -914,6 +910,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -931,9 +936,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -952,9 +957,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" @@ -986,27 +991,27 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] [[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "memoffset" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] [[package]] -name = "miniz_oxide" -version = "0.7.4" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" @@ -1020,9 +1025,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi", "libc", @@ -1038,9 +1043,9 @@ checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" [[package]] name = "napi" -version = "2.16.9" +version = "2.16.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1277600d452e570cc83cf5f4e8efb389cc21e5cbefadcfba7239f4551e2e3e99" +checksum = "214f07a80874bb96a8433b3cdfc84980d56c7b02e1a0d7ba4ba0db5cef785e2b" dependencies = [ "bitflags", "ctor", @@ -1053,29 +1058,29 @@ dependencies = [ [[package]] name = "napi-derive" -version = "2.16.11" +version = "2.16.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "150d87c4440b9f4815cb454918db498b5aae9a57aa743d20783fe75381181d01" +checksum = "17435f7a00bfdab20b0c27d9c56f58f6499e418252253081bfff448099da31d1" dependencies = [ "cfg-if", "convert_case", "napi-derive-backend", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] name = "napi-derive-backend" -version = "1.0.73" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cd81b794fc1d6051acf8c4f3cb4f82833b0621272a232b4ff0cf3df1dbddb61" +checksum = "967c485e00f0bf3b1bdbe510a38a4606919cf1d34d9a37ad41f25a81aa077abe" dependencies = [ "convert_case", "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] @@ -1108,7 +1113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6813fde79b646e47e7ad75f480aa80ef76a5d9599e2717407961531169ee38b" dependencies = [ "quote", - "syn 2.0.72", + "syn 2.0.87", "syn-mid", ] @@ -1121,6 +1126,7 @@ dependencies = [ "bitflags", "cfg-if", "libc", + "memoffset", ] [[package]] @@ -1144,18 +1150,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.3" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl-probe" @@ -1192,29 +1198,29 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1232,9 +1238,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" dependencies = [ "serde", ] @@ -1250,19 +1256,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -1284,7 +1290,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.5", "proc-macro2", "quote", "syn 1.0.109", @@ -1292,9 +1298,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1331,9 +1337,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1343,9 +1349,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -1354,9 +1360,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "ring" @@ -1424,9 +1430,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ "bitflags", "errno", @@ -1449,9 +1455,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "aws-lc-rs", "once_cell", @@ -1476,12 +1482,25 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.2.0", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" +checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.3", + "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -1498,25 +1517,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" -version = "0.102.6" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "aws-lc-rs", "ring 0.17.8", @@ -1532,11 +1550,11 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1564,9 +1582,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -1610,14 +1628,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.122" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -1705,9 +1723,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.72" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -1722,7 +1740,7 @@ checksum = "b5dc35bb08dd1ca3dfb09dce91fd2d13294d6711c88897d9a9d60acf39bce049" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] @@ -1737,9 +1755,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.39.2" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -1759,7 +1777,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] @@ -1779,16 +1797,16 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.12", + "rustls 0.23.16", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -1797,32 +1815,11 @@ dependencies = [ "tokio", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -1851,15 +1848,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "untrusted" @@ -1875,9 +1872,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", "serde", @@ -1906,34 +1903,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1941,28 +1939,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -2039,6 +2037,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -2178,7 +2185,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.87", ] [[package]] @@ -2186,17 +2193,3 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] diff --git a/README.md b/README.md index bbfd0216..5b32d987 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,6 @@ and installing it directly is not supported at the moment. ## Building -* `npm run build`: Build the default workspaces in debug mode. -* `npm run build-release`: Build the default workspaces in release mode. -* `npm run build-all`: Build all workspaces in debug mode. This is useful when working on a workspace that is not a default member yet. +* `yarn build`: Build the default workspaces in debug mode. +* `yarn build-release`: Build the default workspaces in release mode. +* `yarn build-all`: Build all workspaces in debug mode. This is useful when working on a workspace that is not a default member yet. diff --git a/crates/crashtracker/src/lib.rs b/crates/crashtracker/src/lib.rs index afb07265..6dc97785 100644 --- a/crates/crashtracker/src/lib.rs +++ b/crates/crashtracker/src/lib.rs @@ -2,12 +2,12 @@ use napi::{Env, JsUnknown}; use napi_derive::napi; #[napi] -pub fn init_with_receiver(env: Env, config: JsUnknown, receiver_config: JsUnknown, metadata: JsUnknown) -> napi::Result<()> { +pub fn init(env: Env, config: JsUnknown, receiver_config: JsUnknown, metadata: JsUnknown) -> napi::Result<()> { let config = env.from_js_value(config)?; let receiver_config = env.from_js_value(receiver_config)?; let metadata = env.from_js_value(metadata)?; - datadog_crashtracker::init_with_receiver(config, receiver_config, metadata).unwrap(); + datadog_crashtracker::init(config, receiver_config, metadata).unwrap(); Ok(()) } diff --git a/load.js b/load.js index b808c4fb..6ce11fe4 100644 --- a/load.js +++ b/load.js @@ -8,7 +8,7 @@ const path = require('path') const PLATFORM = os.platform() const ARCH = process.arch -const LIBC = PLATFORM === 'linux' ? existsSync('/etc/alpine-release') ? 'musl' : 'libc' : '' +const LIBC = PLATFORM === 'linux' ? existsSync('/etc/alpine-release') ? 'musl' : 'glibc' : '' const ABI = process.versions.modules const inWebpack = typeof __webpack_require__ === 'function' diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index cb8631e1..00000000 --- a/package-lock.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "@datadog/libdatadog", - "version": "0.1.0-pre", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@datadog/libdatadog", - "version": "0.1.0-pre", - "license": "Apache-2.0" - } - } -} diff --git a/package.json b/package.json index 9cc95786..d5bf9074 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,11 @@ "description": "Node.js binding for libdatadog", "main": "index.js", "scripts": { - "build": "npm run -s build-debug", - "build-debug": "mkdir -p target && npm run -s cargo-build > ./target/out.ndjson && npm run -s copy-artifacts", - "build-release": "mkdir -p target && npm run -s cargo-build-release > ./target/out.ndjson && npm run -s copy-artifacts", - "build-all": "mkdir -p target && npm run -s cargo-build -- --workspace > ./target/out.ndjson && npm run -s copy-artifacts", - "cargo-build-release": "npm run -s cargo-build -- --release", + "build": "yarn -s build-debug", + "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts", + "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts", + "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts", + "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", "test": "node test" diff --git a/test.js b/test.js index c4a5f148..f4514723 100644 --- a/test.js +++ b/test.js @@ -1,7 +1,10 @@ 'use strict' const fs = require('fs') +const { execSync } = require('child_process') -fs.readdirSync('test').forEach(file => { - require('./test/' + file) -}) +fs.readdirSync('test') + .filter(file => file.endsWith('.js') || !file.includes('.')) + .forEach(file => { + require('./test/' + file) + }) diff --git a/test/crashtracker/.gitignore b/test/crashtracker/.gitignore index be311a70..378eac25 100644 --- a/test/crashtracker/.gitignore +++ b/test/crashtracker/.gitignore @@ -1,2 +1 @@ -index.d.ts -index.node +build diff --git a/test/crashtracker/Cargo.lock b/test/crashtracker/Cargo.lock deleted file mode 100644 index 3ed1c9f1..00000000 --- a/test/crashtracker/Cargo.lock +++ /dev/null @@ -1,264 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "ctor" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "libloading" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" -dependencies = [ - "cfg-if", - "windows-targets", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "napi" -version = "2.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1277600d452e570cc83cf5f4e8efb389cc21e5cbefadcfba7239f4551e2e3e99" -dependencies = [ - "bitflags", - "ctor", - "napi-derive", - "napi-sys", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "napi-derive" -version = "2.16.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "150d87c4440b9f4815cb454918db498b5aae9a57aa743d20783fe75381181d01" -dependencies = [ - "cfg-if", - "convert_case", - "napi-derive-backend", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "napi-derive-backend" -version = "1.0.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cd81b794fc1d6051acf8c4f3cb4f82833b0621272a232b4ff0cf3df1dbddb61" -dependencies = [ - "convert_case", - "once_cell", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "napi-sys" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427802e8ec3a734331fec1035594a210ce1ff4dc5bc1950530920ab717964ea3" -dependencies = [ - "libloading", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "segfault" -version = "0.1.0" -dependencies = [ - "napi", - "napi-derive", -] - -[[package]] -name = "serde" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "syn" -version = "2.0.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/test/crashtracker/Cargo.toml b/test/crashtracker/Cargo.toml deleted file mode 100644 index 9e78a15c..00000000 --- a/test/crashtracker/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "segfault" -version = "0.1.0" -edition = "2018" - -[lib] -crate-type = ["cdylib"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[workspace] - -[dependencies] -napi = { version = "2", features = ["serde-json"] } -napi-derive = { version = "2", default-features = false } diff --git a/test/crashtracker/app.js b/test/crashtracker/app.js index 5c5e9711..65ba859a 100644 --- a/test/crashtracker/app.js +++ b/test/crashtracker/app.js @@ -1,12 +1,12 @@ 'use strict' -const os = require('os') const libdatadog = require('../..') const crashtracker = libdatadog.load('crashtracker') -crashtracker.initWithReceiver({ +crashtracker.init({ additional_files: [], - create_alt_stack: false, + create_alt_stack: true, + use_alt_stack: true, endpoint: { url: { scheme: 'http', @@ -15,6 +15,7 @@ crashtracker.initWithReceiver({ }, timeout_ms: 3000 }, + timeout_ms: 3000, resolve_frames: 'EnabledWithInprocessSymbols', wait_for_receiver: true }, { @@ -37,4 +38,4 @@ crashtracker.initWithReceiver({ ] }) -require('./index.node').boom() +require('@datadog/segfaultify').segfaultify() diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index 4604195c..57e7d70a 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -1,7 +1,7 @@ 'use strict' -const { execSync } = require('child_process') -const { existsSync } = require('fs') +const { execSync, exec } = require('child_process') +const { inspect } = require('util') const cwd = __dirname const stdio = ['inherit', 'inherit', 'inherit'] @@ -9,15 +9,11 @@ const uid = process.getuid() const gid = process.getgid() const opts = { cwd, stdio, uid, gid } -if (process.env.CI) { - execSync(`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --verbose`, opts) -} - -execSync('npm install', opts) -execSync('npm run --silent build', opts) +execSync('yarn install', opts) const express = require('express') const bodyParser = require('body-parser') +const { existsSync } = require('fs') const app = express() @@ -37,9 +33,16 @@ app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { server.close(() => { const stackTrace = JSON.parse(req.body.payload[0].stack_trace) - const boomFrame = stackTrace.find(frame => frame.names[0]?.name.includes('boom')) + const boomFrame = stackTrace.find(frame => frame.names?.[0]?.name.toLowerCase().includes('segfaultify')) - if (!boomFrame) { + console.log(inspect(stackTrace, true, 5, true)) + + if (existsSync('/etc/alpine-release')) { + // TODO: Remove this when supported. + console.log('Received crash report. Skipping stack trace test since it is currently unsupported for Alpine.') + } else if (boomFrame) { + console.log('Stack frame for crashing function successfully received by the mock agent.') + } else { throw new Error('Could not find a stack frame for the crashing function.') } }) @@ -48,17 +51,15 @@ app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { const server = app.listen(() => { const PORT = server.address().port - try { - execSync('node app', { - ...opts, - env: { - ...process.env, - PORT - } - }) - } catch (e) { - if (e.signal !== 'SIGSEGV' && e.status !== 139) { + exec('node app', { + ...opts, + env: { + ...process.env, + PORT + } + }, e => { + if (e.signal !== 'SIGSEGV' && e.code !== 139 && e.status !== 139) { throw e } - } + }) }) diff --git a/test/crashtracker/package-lock.json b/test/crashtracker/package-lock.json deleted file mode 100644 index 8a7e4a0f..00000000 --- a/test/crashtracker/package-lock.json +++ /dev/null @@ -1,750 +0,0 @@ -{ - "name": "crashtracker", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "body-parser": "^1.20.3", - "express": "^4.19.2" - }, - "devDependencies": { - "@napi-rs/cli": "^2.18.4" - } - }, - "node_modules/@napi-rs/cli": { - "version": "2.18.4", - "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.18.4.tgz", - "integrity": "sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==", - "dev": true, - "bin": { - "napi": "scripts/index.js" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "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.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.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" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "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.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "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" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - } - } -} diff --git a/test/crashtracker/package.json b/test/crashtracker/package.json index 23bd8477..2f81fde3 100644 --- a/test/crashtracker/package.json +++ b/test/crashtracker/package.json @@ -1,14 +1,9 @@ { "private": true, "main": "index.js", - "scripts": { - "build": "napi build" - }, "dependencies": { + "@datadog/segfaultify": "^0.1.1", "body-parser": "^1.20.3", "express": "^4.19.2" - }, - "devDependencies": { - "@napi-rs/cli": "^2.18.4" } } diff --git a/test/crashtracker/src/lib.rs b/test/crashtracker/src/lib.rs deleted file mode 100644 index 4b5314b7..00000000 --- a/test/crashtracker/src/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -use napi_derive::napi; - -#[napi] -pub fn boom() -> napi::Result<()> { - unsafe { std::ptr::null_mut::().write(42) }; - - Ok(()) -} diff --git a/test/crashtracker/yarn.lock b/test/crashtracker/yarn.lock new file mode 100644 index 00000000..5a70c3a4 --- /dev/null +++ b/test/crashtracker/yarn.lock @@ -0,0 +1,480 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@datadog/segfaultify@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@datadog/segfaultify/-/segfaultify-0.1.1.tgz#bd12d31ad26c5d15dc1b8c32572ceb37dbb12651" + integrity sha512-wYfDBfS9VlsTOF10HkWgu7abTWsoGTFkaHxjiw8V6I2pXbfb+D3KNdjb4H+0jD7vnChs4Jm7Rgetg0j89jrlYw== + dependencies: + node-gyp-build "^3.9.0" + +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" + +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== + +body-parser@1.20.3, body-parser@^1.20.3: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + 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.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + +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, content-type@~1.0.5: + 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.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + +debug@2.6.9: + 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" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +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== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +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== + +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== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +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== + +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== + +express@^4.19.2: + version "4.21.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" + integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.10" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +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== + +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +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" + +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" + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + 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== + +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== + +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + +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== + +mime-db@1.52.0: + 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.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== + +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.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +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== + +node-gyp-build@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" + integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== + +object-inspect@^1.13.1: + version "1.13.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + +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" + +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== + +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + +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" + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +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.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"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== + +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + 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" + +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +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== + +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== + +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" + +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== + +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== + +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== diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..fb57ccd1 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + From 97491c74ee5d4f24b112d4c685a0630695158b66 Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Tue, 12 Nov 2024 11:50:10 -0500 Subject: [PATCH 09/68] update libdatadog to 14.1.0 (#38) --- Cargo.lock | 63 +++++++++++++++++----------------- crates/crashtracker/Cargo.toml | 2 +- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da76b41e..f2b2cd78 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,9 +40,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-tzdata" @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "autocfg" @@ -156,9 +156,9 @@ checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "blazesym" -version = "0.2.0-rc.1" +version = "0.2.0-rc.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750f0052cfee86c14cbc31eda95c14271e16347196fd4902df1a52e4411a090" +checksum = "deb42921128af76c2ced7c723edfb0411695a96d2bfcdda21c3a6543f98b715a" dependencies = [ "cpp_demangle", "gimli", @@ -188,9 +188,9 @@ checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "cc" -version = "1.1.34" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -351,14 +351,14 @@ dependencies = [ [[package]] name = "datadog-crashtracker" -version = "13.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#fb669524bc0171cead3d8ec997a5571c27e67f4b" +version = "14.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.1.0#106fe1aee81c912e3201b7d138d57dabdfed4295" dependencies = [ "anyhow", "backtrace", "blazesym", "chrono", - "ddcommon 13.1.0", + "ddcommon 14.1.0", "ddtelemetry", "http 0.2.12", "hyper 0.14.31", @@ -376,8 +376,8 @@ dependencies = [ [[package]] name = "datadog-ddsketch" -version = "13.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#fb669524bc0171cead3d8ec997a5571c27e67f4b" +version = "14.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.1.0#106fe1aee81c912e3201b7d138d57dabdfed4295" dependencies = [ "prost", ] @@ -447,10 +447,11 @@ dependencies = [ [[package]] name = "ddcommon" -version = "13.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#fb669524bc0171cead3d8ec997a5571c27e67f4b" +version = "14.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.1.0#106fe1aee81c912e3201b7d138d57dabdfed4295" dependencies = [ "anyhow", + "cc", "futures", "futures-core", "futures-util", @@ -475,13 +476,13 @@ dependencies = [ [[package]] name = "ddtelemetry" -version = "13.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=main#fb669524bc0171cead3d8ec997a5571c27e67f4b" +version = "14.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.1.0#106fe1aee81c912e3201b7d138d57dabdfed4295" dependencies = [ "anyhow", "base64 0.22.1", "datadog-ddsketch", - "ddcommon 13.1.0", + "ddcommon 14.1.0", "futures", "hashbrown 0.14.5", "http 0.2.12", @@ -684,9 +685,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "hermit-abi" @@ -887,7 +888,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.1", ] [[package]] @@ -957,9 +958,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libloading" @@ -1349,9 +1350,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1430,9 +1431,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.38" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags", "errno", @@ -1582,9 +1583,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -1755,9 +1756,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index 946d87c4..7b424010 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", branch = "main" } +datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.1.0" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } From 763c4a19b1df72e2c95006f3dab56559c1e9607e Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Tue, 12 Nov 2024 14:26:04 -0500 Subject: [PATCH 10/68] fix release tag and environment (#39) --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 245893b8..9f2982bf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: publish: runs-on: ubuntu-latest needs: build - environment: yarn + environment: npm permissions: contents: write env: @@ -36,7 +36,7 @@ jobs: - id: pkg run: | content=`cat ./package.json | tr '\n' ' '` - echo "::set-output name=json::$content" + echo "json=$content" >> $GITHUB_OUTPUT - run: | git tag v${{ fromJson(steps.pkg.outputs.json).version }} git push origin v${{ fromJson(steps.pkg.outputs.json).version }} From 55dc3bc7844372cb6f2d4740adeb24da9f9f6fef Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Tue, 17 Dec 2024 10:52:43 -0500 Subject: [PATCH 11/68] update libdatadog to 14.3.1 (#42) --- Cargo.lock | 62 ++++++++++++++++++++++++++++------ crates/crashtracker/Cargo.toml | 2 +- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f2b2cd78..c0420601 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -351,14 +351,14 @@ dependencies = [ [[package]] name = "datadog-crashtracker" -version = "14.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.1.0#106fe1aee81c912e3201b7d138d57dabdfed4295" +version = "14.3.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" dependencies = [ "anyhow", "backtrace", "blazesym", "chrono", - "ddcommon 14.1.0", + "ddcommon 14.3.1", "ddtelemetry", "http 0.2.12", "hyper 0.14.31", @@ -368,6 +368,7 @@ dependencies = [ "page_size", "portable-atomic", "rand", + "schemars", "serde", "serde_json", "tokio", @@ -376,8 +377,8 @@ dependencies = [ [[package]] name = "datadog-ddsketch" -version = "14.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.1.0#106fe1aee81c912e3201b7d138d57dabdfed4295" +version = "14.3.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" dependencies = [ "prost", ] @@ -447,8 +448,8 @@ dependencies = [ [[package]] name = "ddcommon" -version = "14.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.1.0#106fe1aee81c912e3201b7d138d57dabdfed4295" +version = "14.3.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" dependencies = [ "anyhow", "cc", @@ -476,13 +477,13 @@ dependencies = [ [[package]] name = "ddtelemetry" -version = "14.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.1.0#106fe1aee81c912e3201b7d138d57dabdfed4295" +version = "14.3.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" dependencies = [ "anyhow", "base64 0.22.1", "datadog-ddsketch", - "ddcommon 14.1.0", + "ddcommon 14.3.1", "futures", "hashbrown 0.14.5", "http 0.2.12", @@ -506,6 +507,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + [[package]] name = "either" version = "1.13.0" @@ -1558,6 +1565,30 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.87", +] + [[package]] name = "sct" version = "0.7.1" @@ -1632,6 +1663,17 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "serde_json" version = "1.0.132" diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index 7b424010..b381f410 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.1.0" } +datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.3.1" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } From de9557133f1c198218ab194faa3698f3f73b1a94 Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Tue, 14 Jan 2025 17:28:23 +0100 Subject: [PATCH 12/68] Add APIs for marking the crash as happened during profiler serialization (#45) --- crates/crashtracker/src/lib.rs | 14 ++++++++++++++ test/crashtracker/app.js | 1 + test/crashtracker/index.js | 7 +++++++ 3 files changed, 22 insertions(+) diff --git a/crates/crashtracker/src/lib.rs b/crates/crashtracker/src/lib.rs index 6dc97785..e6a93245 100644 --- a/crates/crashtracker/src/lib.rs +++ b/crates/crashtracker/src/lib.rs @@ -29,3 +29,17 @@ pub fn update_metadata (env: Env, metadata: JsUnknown) -> napi::Result<()> { Ok(()) } + +#[napi] +pub fn begin_profiler_serializing (_env: Env) -> napi::Result<()> { + let _ = datadog_crashtracker::begin_op(datadog_crashtracker::OpTypes::ProfilerSerializing); + + Ok(()) +} + +#[napi] +pub fn end_profiler_serializing (_env: Env) -> napi::Result<()> { + let _ = datadog_crashtracker::end_op(datadog_crashtracker::OpTypes::ProfilerSerializing); + + Ok(()) +} diff --git a/test/crashtracker/app.js b/test/crashtracker/app.js index 65ba859a..3f03102d 100644 --- a/test/crashtracker/app.js +++ b/test/crashtracker/app.js @@ -38,4 +38,5 @@ crashtracker.init({ ] }) +crashtracker.beginProfilerSerializing() require('@datadog/segfaultify').segfaultify() diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index 57e7d70a..e6b56428 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -45,6 +45,13 @@ app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { } else { throw new Error('Could not find a stack frame for the crashing function.') } + + const tags = req.body.payload[0].tags.split(',') + if (tags.includes('profiler_serializing:1')) { + console.log('Stack trace was marked as happened during profile serialization.') + } else { + throw new Error('Stack trace was not marked as happening during profile serialization.') + } }) }) From ab8cdc0ca52ccffa1e570c2f132c55a4334eb517 Mon Sep 17 00:00:00 2001 From: Baptiste Foy Date: Tue, 18 Feb 2025 15:11:46 +0100 Subject: [PATCH 13/68] upgrade(libdatadog-nodejs): Support library_config (#49) --- .github/actions/build-test-wasm/action.yaml | 31 ++++ .github/workflows/build.yml | 14 ++ .github/workflows/release.yml | 14 ++ Cargo.lock | 164 ++++++++++++++++-- Cargo.toml | 2 +- crates/crashtracker/Cargo.toml | 2 +- crates/library_config/Cargo.toml | 18 ++ crates/library_config/src/lib.rs | 137 +++++++++++++++ load.js | 17 +- package.json | 6 +- test.js | 4 +- test/wasm/library_config/.gitignore | 1 + test/wasm/library_config/README.md | 8 + .../library_config/config_local_phase1.yaml | 2 + .../library_config/config_local_phase2.yaml | 2 + .../library_config/config_managed_phase2.yaml | 9 + test/wasm/library_config/index.js | 57 ++++++ test_wasm.js | 10 ++ 18 files changed, 480 insertions(+), 18 deletions(-) create mode 100644 .github/actions/build-test-wasm/action.yaml create mode 100644 crates/library_config/Cargo.toml create mode 100644 crates/library_config/src/lib.rs create mode 100644 test/wasm/library_config/.gitignore create mode 100644 test/wasm/library_config/README.md create mode 100644 test/wasm/library_config/config_local_phase1.yaml create mode 100644 test/wasm/library_config/config_local_phase2.yaml create mode 100644 test/wasm/library_config/config_managed_phase2.yaml create mode 100644 test/wasm/library_config/index.js create mode 100644 test_wasm.js diff --git a/.github/actions/build-test-wasm/action.yaml b/.github/actions/build-test-wasm/action.yaml new file mode 100644 index 00000000..0effdc1d --- /dev/null +++ b/.github/actions/build-test-wasm/action.yaml @@ -0,0 +1,31 @@ +name: 'Build/Test WASM' +description: 'A simple composite GitHub Action sets-up WASM; then test & build relevant crates' +inputs: + cate: + description: 'The crate name. Must be in ./crates' + required: true +runs: + using: 'composite' + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + - run: yarn install + shell: bash + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + shell: bash + - name: Build WASM + run: | + mkdir -p ./prebuilds/${{ inputs.crate }} + wasm-pack build --target nodejs ./crates/${{ inputs.crate }} --out-dir ../../prebuilds/${{ inputs.crate }} + shell: bash + - name: Test WASM + run: node test_wasm.js + shell: bash + - uses: actions/upload-artifact@v4 + with: + name: prebuilds-wasm + if-no-files-found: ignore + path: ./prebuilds/* diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1c85d4b4..e534dc50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,8 +7,22 @@ on: - main jobs: + build-test-wasm: + runs-on: ubuntu-latest + strategy: + matrix: + crate: + - library_config + steps: + - uses: actions/checkout@v4 + - name: 'Use composite action' + uses: ./.github/actions/build-test-wasm + with: + crate: '${{ matrix.crate }}' + build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main + needs: build-test-wasm with: package-manager: 'yarn' cache: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9f2982bf..d9b1a7a4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,8 +6,22 @@ on: - v0.x jobs: + build-test-wasm: + runs-on: ubuntu-latest + strategy: + matrix: + crate: + - library_config + steps: + - uses: actions/checkout@v4 + - name: 'Use composite action' + uses: ./.github/actions/build-test-wasm + with: + crate: '${{ matrix.crate }}' + build: uses: Datadog/action-prebuildify/.github/workflows/build.yml@main + needs: build-test-wasm with: package-manager: 'yarn' cache: false diff --git a/Cargo.lock b/Cargo.lock index c0420601..5e2ff174 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -267,6 +267,16 @@ dependencies = [ "tokio", ] +[[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", + "wasm-bindgen", +] + [[package]] name = "convert_case" version = "0.6.0" @@ -351,14 +361,14 @@ dependencies = [ [[package]] name = "datadog-crashtracker" -version = "14.3.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" +version = "15.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "anyhow", "backtrace", "blazesym", "chrono", - "ddcommon 14.3.1", + "ddcommon 15.0.0", "ddtelemetry", "http 0.2.12", "hyper 0.14.31", @@ -377,12 +387,22 @@ dependencies = [ [[package]] name = "datadog-ddsketch" -version = "14.3.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" +version = "15.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "prost", ] +[[package]] +name = "datadog-library-config" +version = "0.0.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" +dependencies = [ + "anyhow", + "serde", + "serde_yaml", +] + [[package]] name = "datadog-trace-normalization" version = "6.0.0" @@ -448,8 +468,8 @@ dependencies = [ [[package]] name = "ddcommon" -version = "14.3.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" +version = "15.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "anyhow", "cc", @@ -477,13 +497,13 @@ dependencies = [ [[package]] name = "ddtelemetry" -version = "14.3.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v14.3.1#48240f2588665a03c2061879345566ec7e70fabf" +version = "15.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" dependencies = [ "anyhow", "base64 0.22.1", "datadog-ddsketch", - "ddcommon 14.3.1", + "ddcommon 15.0.0", "futures", "hashbrown 0.14.5", "http 0.2.12", @@ -979,6 +999,18 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "library-config" +version = "0.1.0" +dependencies = [ + "anyhow", + "datadog-library-config", + "serde", + "serde-wasm-bindgen", + "wasm-bindgen", + "wasm-bindgen-test", +] + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -1015,6 +1047,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "minicov" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" +dependencies = [ + "cc", + "walkdir", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1556,6 +1598,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.26" @@ -1589,6 +1640,12 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "sct" version = "0.7.1" @@ -1643,6 +1700,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_bytes" version = "0.11.15" @@ -1686,6 +1754,19 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1901,6 +1982,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.7.1" @@ -1929,6 +2016,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -1970,6 +2067,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.95" @@ -1999,6 +2108,32 @@ version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +[[package]] +name = "wasm-bindgen-test" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "minicov", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "web-sys" version = "0.3.72" @@ -2047,6 +2182,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 7731b6ce..b8ba21e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ default-members = [ "crates/crashtracker" ] members = [ - "crates/*" + "crates/*", ] [profile.release] diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index b381f410..b63261f4 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v14.3.1" } +datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v15.0.0" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } diff --git a/crates/library_config/Cargo.toml b/crates/library_config/Cargo.toml new file mode 100644 index 00000000..94f0badf --- /dev/null +++ b/crates/library_config/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "library-config" +version = "0.1.0" +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +anyhow = "1" +datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v16.0.3" } + +wasm-bindgen = "0.2.84" +serde = { version = "1.0", features = ["derive"] } +serde-wasm-bindgen = "0.4" + +[dev-dependencies] +wasm-bindgen-test = "0.3.34" diff --git a/crates/library_config/src/lib.rs b/crates/library_config/src/lib.rs new file mode 100644 index 00000000..61c0712b --- /dev/null +++ b/crates/library_config/src/lib.rs @@ -0,0 +1,137 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub struct JsConfigurator { + configurator: Box, + envp: Vec, + args: Vec, +} + +#[wasm_bindgen] +pub struct ConfigEntry { + name: String, + value: String, + source: String, + config_id: String, +} + +#[wasm_bindgen] +impl ConfigEntry { + #[wasm_bindgen(constructor)] + pub fn new(name: String, value: String, source: String, config_id: String) -> ConfigEntry { + ConfigEntry { + name, + value, + source, + config_id, + } + } + #[wasm_bindgen(getter)] + pub fn name(&self) -> String { + self.name.clone() + } + #[wasm_bindgen(getter)] + pub fn value(&self) -> String { + self.value.clone() + } + #[wasm_bindgen(getter)] + pub fn source(&self) -> String { + self.source.clone() + } + #[wasm_bindgen(getter)] + pub fn config_id(&self) -> String { + self.config_id.clone() + } +} + +#[wasm_bindgen] +impl JsConfigurator { + #[wasm_bindgen(constructor)] + pub fn new() -> Self { + JsConfigurator { + configurator: Box::new(datadog_library_config::Configurator::new(false)), // No debug log as WASM can't write to stdout + envp: Vec::new(), + args: Vec::new(), + } + } + + #[wasm_bindgen] + pub fn set_envp(&mut self, envp: Box<[JsValue]>) -> Result<(), JsValue> { + self.envp = envp.iter().filter_map(|val| val.as_string()).collect(); + Ok(()) + } + + #[wasm_bindgen] + pub fn set_args(&mut self, args: Box<[JsValue]>) -> Result<(), JsValue> { + self.args = args.iter().filter_map(|val| val.as_string()).collect(); + Ok(()) + } + + #[wasm_bindgen] + pub fn get_config_local_path(&self, target: String) -> Result { + let target_enum = match target.as_str() { + "linux" => datadog_library_config::Target::Linux, + "win32" => datadog_library_config::Target::Windows, + "darwin" => datadog_library_config::Target::Macos, + _ => return Err(JsValue::from_str("Unsupported target")), + }; + Ok( + datadog_library_config::Configurator::local_stable_configuration_path(target_enum) + .to_string(), + ) + } + + #[wasm_bindgen] + pub fn get_config_managed_path(&self, target: String) -> Result { + let target_enum = match target.as_str() { + "linux" => datadog_library_config::Target::Linux, + "win32" => datadog_library_config::Target::Windows, + "darwin" => datadog_library_config::Target::Macos, + _ => return Err(JsValue::from_str("Unsupported target")), + }; + Ok( + datadog_library_config::Configurator::fleet_stable_configuration_path(target_enum) + .to_string(), + ) + } + + #[wasm_bindgen] + pub fn get_configuration( + &self, + config_string_local: String, + config_string_managed: String, + ) -> Result, JsValue> { + let envp: Vec> = self.envp.iter().map(|s| s.as_bytes().to_vec()).collect(); + + let args: Vec> = self.args.iter().map(|s| s.as_bytes().to_vec()).collect(); + + let res_config = self.configurator.get_config_from_bytes( + config_string_local.as_bytes(), + config_string_managed.as_bytes(), + datadog_library_config::ProcessInfo { + envp: envp, + args: args, + language: b"nodejs".to_vec(), + }, + ); + + match res_config { + Ok(config) => { + let config_entries: Vec = config + .into_iter() + .map(|c| ConfigEntry { + name: c.name.to_str().into(), + value: c.value, + source: c.source.to_str().into(), + config_id: c.config_id.unwrap_or_default(), + }) + .collect(); + Ok(config_entries) + } + Err(e) => Err(JsValue::from_str(&format!( + "Failed to get configuration: {:?}", + e + ))), + } + } +} diff --git a/load.js b/load.js index 6ce11fe4..21970c3e 100644 --- a/load.js +++ b/load.js @@ -24,12 +24,23 @@ function maybeLoad (name) { function load (name) { const filename = find(name) + const filenameWASM = findWASM(name) - if (!filename) { - throw new Error(`Could not find a ${name} binary for ${PLATFORM}${LIBC}-${ARCH}.`) + if (filename) { + return runtimeRequire(filename) + } else if (filenameWASM) { + return runtimeRequire(filenameWASM) } + throw new Error(`Could not find a ${name} binary for ${PLATFORM}${LIBC}-${ARCH} nor a ${name} WASM module.`) +} - return runtimeRequire(filename) +function findWASM (name) { + const root = __dirname + const prebuilds = path.join(root, 'prebuilds') + const folders = readdirSync(prebuilds) + if (folders.find(f => f === name)) { + return path.join(prebuilds, name, `${name}.js`) + } } function find (name, binary = false) { diff --git a/package.json b/package.json index d5bf9074..897c058a 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,12 @@ "description": "Node.js binding for libdatadog", "main": "index.js", "scripts": { - "build": "yarn -s build-debug", + "install-wasm-pack": "curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh", + "build": "yarn -s build-debug && yarn -s build-wasm", "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts", "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts", - "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts", + "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", + "build-wasm": "yarn -s install-wasm-pack && wasm-pack build --target nodejs ./crates/library_config --out-dir ../../prebuilds/library_config", "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", diff --git a/test.js b/test.js index f4514723..822f1940 100644 --- a/test.js +++ b/test.js @@ -6,5 +6,7 @@ const { execSync } = require('child_process') fs.readdirSync('test') .filter(file => file.endsWith('.js') || !file.includes('.')) .forEach(file => { - require('./test/' + file) + if (!file.includes('wasm')) { + require('./test/' + file) + } }) diff --git a/test/wasm/library_config/.gitignore b/test/wasm/library_config/.gitignore new file mode 100644 index 00000000..5fff1d9c --- /dev/null +++ b/test/wasm/library_config/.gitignore @@ -0,0 +1 @@ +pkg diff --git a/test/wasm/library_config/README.md b/test/wasm/library_config/README.md new file mode 100644 index 00000000..ca98e968 --- /dev/null +++ b/test/wasm/library_config/README.md @@ -0,0 +1,8 @@ +# Libconfig example + +## How to run +From repository root +```bash +yarn build-wasm +node test/wasm/library_config/index.js +``` diff --git a/test/wasm/library_config/config_local_phase1.yaml b/test/wasm/library_config/config_local_phase1.yaml new file mode 100644 index 00000000..f9c6b621 --- /dev/null +++ b/test/wasm/library_config/config_local_phase1.yaml @@ -0,0 +1,2 @@ +apm_configuration_default: + DD_RUNTIME_METRICS_ENABLED: true diff --git a/test/wasm/library_config/config_local_phase2.yaml b/test/wasm/library_config/config_local_phase2.yaml new file mode 100644 index 00000000..f9c6b621 --- /dev/null +++ b/test/wasm/library_config/config_local_phase2.yaml @@ -0,0 +1,2 @@ +apm_configuration_default: + DD_RUNTIME_METRICS_ENABLED: true diff --git a/test/wasm/library_config/config_managed_phase2.yaml b/test/wasm/library_config/config_managed_phase2.yaml new file mode 100644 index 00000000..28c3302e --- /dev/null +++ b/test/wasm/library_config/config_managed_phase2.yaml @@ -0,0 +1,9 @@ +rules: + - selectors: + - origin: language + matches: + - nodejs + operator: equals + configuration: + DD_SERVICE: my-service_butremote +config_id: abc diff --git a/test/wasm/library_config/index.js b/test/wasm/library_config/index.js new file mode 100644 index 00000000..64a60f84 --- /dev/null +++ b/test/wasm/library_config/index.js @@ -0,0 +1,57 @@ +const path = require('path'); +const fs = require('fs'); +const loader = require('../../../load.js'); +const assert = require('assert'); + +const libconfig = loader.load('library_config'); +assert(libconfig !== undefined); + +// Test 1: phase 1 (host selection) +function test_host_wide() { + const rawConfigLocal = fs.readFileSync(path.join(__dirname, 'config_local_phase1.yaml')); + let configurator = new libconfig.JsConfigurator(); + + configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}=${value}`)) + configurator.set_args(process.argv) + + let values = configurator.get_configuration(rawConfigLocal.toString(), "") + values.forEach((value, key, map) => { + console.log(`(phase 1) name: ${value.name}, value: ${value.value}, source: ${value.source}, config_id: ${value.config_id}`) + }); + + assert.strictEqual(values.length, 1) + assert.strictEqual(values[0].name, 'DD_RUNTIME_METRICS_ENABLED') + assert.strictEqual(values[0].value, 'true') + assert.strictEqual(values[0].source, 'local_stable_config') +} + +// Test 2: managed > local, phase 2 (service selection) +function test_service_selector() { + const rawConfigLocal = fs.readFileSync(path.join(__dirname, 'config_local_phase2.yaml')); + const rawConfigManaged = fs.readFileSync(path.join(__dirname, 'config_managed_phase2.yaml')); + let configurator = new libconfig.JsConfigurator(); + + configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}=${value}`)) + configurator.set_args(process.argv) + + values = configurator.get_configuration(rawConfigLocal.toString(), rawConfigManaged.toString()) + values.forEach((value, key, map) => { + console.log(`(phase 2) name: ${value.name}, value: ${value.value}, source: ${value.source}, config_id: ${value.config_id}`) + }); + + assert.strictEqual(values.length, 2) + assert.strictEqual(values[0].name, 'DD_RUNTIME_METRICS_ENABLED') + assert.strictEqual(values[0].value, 'true') + assert.strictEqual(values[0].source, 'local_stable_config') + + if (process.platform == 'linux') { + assert.strictEqual(configurator.get_config_local_path(process.platform), "/etc/datadog-agent/application_monitoring.yaml"); + } else if (process.platform == 'darwin') { + assert.strictEqual(configurator.get_config_local_path(process.platform), "/opt/datadog-agent/etc/application_monitoring.yaml"); + } else if (process.platform == 'win32') { + assert.strictEqual(configurator.get_config_local_path(process.platform), "C:\\ProgramData\\Datadog\\application_monitoring.yaml"); + } +} + +test_host_wide(); +test_service_selector(); diff --git a/test_wasm.js b/test_wasm.js new file mode 100644 index 00000000..762dd038 --- /dev/null +++ b/test_wasm.js @@ -0,0 +1,10 @@ +'use strict' + +const fs = require('fs') +const { execSync } = require('child_process') + +fs.readdirSync('test/wasm') + .filter(file => file.endsWith('.js') || !file.includes('.')) + .forEach(file => { + require('./test/wasm/' + file) + }) From 7b2798cf9270b06a5b6c4348c3a668534bc05da8 Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Wed, 28 May 2025 16:18:16 +0200 Subject: [PATCH 14/68] Add a crate for wasm zstd implementation (#52) * Handle wasm-pack's dash-to-underscore filename transformation * Add a crate for wasm zstd implementation * Only run tests for a single crate * Fix WASM builds on macOS --- .github/actions/build-test-wasm/action.yaml | 4 +- .github/workflows/build.yml | 1 + .github/workflows/release.yml | 1 + Cargo.lock | 115 +++++++++++++------- crates/datadog-js-zstd/Cargo.toml | 15 +++ crates/datadog-js-zstd/src/lib.rs | 12 ++ load.js | 2 +- package.json | 2 +- scripts/build-wasm.js | 46 ++++++++ test/wasm/datadog-js-zstd/index.js | 50 +++++++++ test_wasm.js | 6 +- 11 files changed, 208 insertions(+), 46 deletions(-) create mode 100644 crates/datadog-js-zstd/Cargo.toml create mode 100644 crates/datadog-js-zstd/src/lib.rs create mode 100644 scripts/build-wasm.js create mode 100644 test/wasm/datadog-js-zstd/index.js diff --git a/.github/actions/build-test-wasm/action.yaml b/.github/actions/build-test-wasm/action.yaml index 0effdc1d..595c1249 100644 --- a/.github/actions/build-test-wasm/action.yaml +++ b/.github/actions/build-test-wasm/action.yaml @@ -22,10 +22,10 @@ runs: wasm-pack build --target nodejs ./crates/${{ inputs.crate }} --out-dir ../../prebuilds/${{ inputs.crate }} shell: bash - name: Test WASM - run: node test_wasm.js + run: node test_wasm.js ${{ inputs.crate }} shell: bash - uses: actions/upload-artifact@v4 with: - name: prebuilds-wasm + name: prebuilds-wasm-${{ inputs.crate }} if-no-files-found: ignore path: ./prebuilds/* diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e534dc50..0533478a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,6 +13,7 @@ jobs: matrix: crate: - library_config + - datadog-js-zstd steps: - uses: actions/checkout@v4 - name: 'Use composite action' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d9b1a7a4..eb820ee3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,6 +12,7 @@ jobs: matrix: crate: - library_config + - datadog-js-zstd steps: - uses: actions/checkout@v4 - name: 'Use composite action' diff --git a/Cargo.lock b/Cargo.lock index 5e2ff174..00faea76 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -267,16 +267,6 @@ dependencies = [ "tokio", ] -[[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", - "wasm-bindgen", -] - [[package]] name = "convert_case" version = "0.6.0" @@ -393,6 +383,16 @@ dependencies = [ "prost", ] +[[package]] +name = "datadog-js-zstd" +version = "0.1.0" +dependencies = [ + "js-sys", + "wasm-bindgen", + "wasm-bindgen-test", + "zstd", +] + [[package]] name = "datadog-library-config" version = "0.0.1" @@ -964,10 +964,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1286,6 +1287,12 @@ dependencies = [ "neon", ] +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + [[package]] name = "portable-atomic" version = "1.9.0" @@ -1592,6 +1599,12 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + [[package]] name = "ryu" version = "1.0.18" @@ -1640,12 +1653,6 @@ dependencies = [ "syn 2.0.87", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "sct" version = "0.7.1" @@ -2043,24 +2050,24 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn 2.0.87", @@ -2069,21 +2076,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2091,9 +2099,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -2104,20 +2112,21 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-bindgen-test" -version = "0.3.45" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" +checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" dependencies = [ - "console_error_panic_hook", "js-sys", "minicov", - "scoped-tls", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test-macro", @@ -2125,9 +2134,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.45" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" +checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", @@ -2136,9 +2145,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -2380,3 +2389,31 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/crates/datadog-js-zstd/Cargo.toml b/crates/datadog-js-zstd/Cargo.toml new file mode 100644 index 00000000..308740fa --- /dev/null +++ b/crates/datadog-js-zstd/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "datadog-js-zstd" +version = "0.1.0" +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +wasm-bindgen = "0.2.100" +zstd = "0.13.3" +js-sys = "0.3.77" + +[dev-dependencies] +wasm-bindgen-test = "0.3.50" diff --git a/crates/datadog-js-zstd/src/lib.rs b/crates/datadog-js-zstd/src/lib.rs new file mode 100644 index 00000000..4896301b --- /dev/null +++ b/crates/datadog-js-zstd/src/lib.rs @@ -0,0 +1,12 @@ +use wasm_bindgen::prelude::*; +use js_sys::Uint8Array; + +#[wasm_bindgen] +pub fn zstd_compress( + data: Uint8Array, + level: i32, +) -> Uint8Array { + let vecdata = data.to_vec(); + let compressed_data = zstd::encode_all(&vecdata[..], level).expect("Failed to compress data"); + Uint8Array::from(compressed_data.as_slice()) +} diff --git a/load.js b/load.js index 21970c3e..334e6099 100644 --- a/load.js +++ b/load.js @@ -39,7 +39,7 @@ function findWASM (name) { const prebuilds = path.join(root, 'prebuilds') const folders = readdirSync(prebuilds) if (folders.find(f => f === name)) { - return path.join(prebuilds, name, `${name}.js`) + return path.join(prebuilds, name, `${name.replaceAll('-', '_')}.js`) } } diff --git a/package.json b/package.json index 897c058a..13201f7c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts", "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts", "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", - "build-wasm": "yarn -s install-wasm-pack && wasm-pack build --target nodejs ./crates/library_config --out-dir ../../prebuilds/library_config", + "build-wasm": "yarn -s install-wasm-pack && node scripts/build-wasm.js library_config && node scripts/build-wasm.js datadog-js-zstd", "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", diff --git a/scripts/build-wasm.js b/scripts/build-wasm.js new file mode 100644 index 00000000..ae5bcddf --- /dev/null +++ b/scripts/build-wasm.js @@ -0,0 +1,46 @@ +// This script builds a WebAssembly module using wasm-pack. It is essentially invoking +// wasm-pack build. All the special handling is for macOS, because Apple's Clang version suffers +// from some issues that prevent it from compiling at least the zstd crate. +// See https://github.com/gyscos/zstd-rs/issues/302 +// This is solved by requiring the homebrew version of LLVM to be installed and available in the +// PATH. Unfortunately, this version then suffers from a different issue that requires wasm-opt to +// be disabled. +// See https://github.com/WebAssembly/wasi-sdk/issues/254 +// See https://github.com/llvm/llvm-project/issues/64909 +// Our releases are built on Linux, and fortunately no special handling is required there. This +// script only allows development to happen on macOS. + +const os = require('os'); +const childProcess = require('child_process'); + +const isMacOS = os.platform() === 'darwin'; +const noWasmOpt = isMacOS ? '--no-opt' : ''; +const library = process.argv[2]; + +const env = { + ...process.env, +}; + +if (isMacOS) { + const homebrewDir = env.HOMEBREW_DIR ?? '/opt/homebrew'; + const llvmDir = `${homebrewDir}/opt/llvm/`; + const llvmBinDir = `${llvmDir}/bin`; + + try { + childProcess.execSync(`${llvmBinDir}/llvm-config --version`); + } catch (error) { + console.error(`‼️ LLVM not found in ${llvmDir}.\n‼️ Please install LLVM using Homebrew:\n📝 brew install llvm`); + process.exit(1); + } + + if (!env.PATH.includes(llvmBinDir)) { + // Add LLVM to PATH if not already included + env.PATH = `${llvmBinDir}:${env.PATH}`; + } +} + +childProcess.execSync( + `wasm-pack build ${noWasmOpt} --target nodejs ./crates/${library} --out-dir ../../prebuilds/${library}`, { + env + } +); diff --git a/test/wasm/datadog-js-zstd/index.js b/test/wasm/datadog-js-zstd/index.js new file mode 100644 index 00000000..fd7a4e81 --- /dev/null +++ b/test/wasm/datadog-js-zstd/index.js @@ -0,0 +1,50 @@ +const loader = require('../../../load.js'); +const assert = require('assert'); + +const zstd = loader.load('datadog-js-zstd'); +assert(zstd !== undefined); + +// Create some compressible data +const SAMPLE_SIZE = 512; +const SAMPLE_COUNT = 1024; +const DATA_SIZE = SAMPLE_COUNT * 4 * SAMPLE_SIZE; + +const samples = [] +for (let i = 0; i < SAMPLE_COUNT; i++) { + const sample = new Array(SAMPLE_SIZE); + for (let j = 0; j < SAMPLE_SIZE; j++) { + sample[j] = (Math.random() * 256) | 0; + } + samples.push(sample); +} +const data = new Array(DATA_SIZE); +for (let i = 0; i < DATA_SIZE; i+= SAMPLE_SIZE) { + data.push(...samples[Math.random() * SAMPLE_COUNT | 0]); +} +// Introduce some irregularities +for (let i = 0; i < SAMPLE_COUNT; i++) { + data[Math.random() * DATA_SIZE | 0] = 0; +} +const dataArr = new Uint8Array(data); +const compressed3 = zstd.zstd_compress(dataArr, 3) +ensureCompressed(compressed3); + +// Test that 0 means default compression level +const compressed0 = zstd.zstd_compress(dataArr, 0) +ensureCompressed(compressed3); +assert(compressed0.length == compressed3.length); + +// Test that compression levels are correctly passed on. +// Level 18 should produce a smaller output than level 3. +// We can go all the way up to 22, but it is significantly slower. +const compressed18 = zstd.zstd_compress(dataArr, 18) +ensureCompressed(compressed18); +assert(compressed18.length < compressed3.length); + +function ensureCompressed(compressed) { + assert(compressed.length > 4); + assert.equal(compressed[0], 0x28); + assert.equal(compressed[1], 0xb5); + assert.equal(compressed[2], 0x2f); + assert.equal(compressed[3], 0xfd); +} diff --git a/test_wasm.js b/test_wasm.js index 762dd038..66cc869c 100644 --- a/test_wasm.js +++ b/test_wasm.js @@ -1,10 +1,10 @@ 'use strict' const fs = require('fs') -const { execSync } = require('child_process') -fs.readdirSync('test/wasm') +const crateTestsDir = `./test/wasm/${process.argv[2]}` +fs.readdirSync(crateTestsDir) .filter(file => file.endsWith('.js') || !file.includes('.')) .forEach(file => { - require('./test/wasm/' + file) + require(`${crateTestsDir}/${file}`) }) From 83baa89ce64a5b4bdc3fe877ed460401ccd294c9 Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Mon, 2 Jun 2025 13:38:27 +0200 Subject: [PATCH 15/68] deps(library_config): bump to v18.1.0 (#51) --- Cargo.lock | 22 +++++++++++++++++++--- crates/library_config/Cargo.toml | 11 +++++++---- crates/library_config/src/lib.rs | 2 +- rust-toolchain.toml | 2 +- test/wasm/library_config/index.js | 9 ++++++--- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 00faea76..31d03a84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -395,10 +395,14 @@ dependencies = [ [[package]] name = "datadog-library-config" -version = "0.0.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" +version = "0.0.2" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v18.1.0#5fdc3357f0070d5ad11dcaf89014b7479d32104f" dependencies = [ "anyhow", + "memfd", + "rand", + "rmp", + "rmp-serde", "serde", "serde_yaml", ] @@ -679,8 +683,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -1002,10 +1008,11 @@ dependencies = [ [[package]] name = "library-config" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", "datadog-library-config", + "getrandom", "serde", "serde-wasm-bindgen", "wasm-bindgen", @@ -1030,6 +1037,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memfd" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix", +] + [[package]] name = "memmap2" version = "0.9.5" diff --git a/crates/library_config/Cargo.toml b/crates/library_config/Cargo.toml index 94f0badf..a88f20fc 100644 --- a/crates/library_config/Cargo.toml +++ b/crates/library_config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "library-config" -version = "0.1.0" +version = "0.2.0" edition = "2018" [lib] @@ -8,11 +8,14 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" -datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v16.0.3" } +datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v18.1.0" } -wasm-bindgen = "0.2.84" +wasm-bindgen = "0.2.100" serde = { version = "1.0", features = ["derive"] } serde-wasm-bindgen = "0.4" [dev-dependencies] -wasm-bindgen-test = "0.3.34" +wasm-bindgen-test = "0.3.50" + +[target.'cfg(target_arch = "wasm32")'.dependencies] +getrandom = { version = "0.2", features = ["js"] } diff --git a/crates/library_config/src/lib.rs b/crates/library_config/src/lib.rs index 61c0712b..c993fbc9 100644 --- a/crates/library_config/src/lib.rs +++ b/crates/library_config/src/lib.rs @@ -120,7 +120,7 @@ impl JsConfigurator { let config_entries: Vec = config .into_iter() .map(|c| ConfigEntry { - name: c.name.to_str().into(), + name: c.name.to_string().into(), value: c.value, source: c.source.to_str().into(), config_id: c.config_id.unwrap_or_default(), diff --git a/rust-toolchain.toml b/rust-toolchain.toml index e25453f5..1917f74a 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.80.0" +channel = "1.78.0" profile = "minimal" components = ["clippy", "rustfmt", "rust-src"] diff --git a/test/wasm/library_config/index.js b/test/wasm/library_config/index.js index 64a60f84..e5b55ecf 100644 --- a/test/wasm/library_config/index.js +++ b/test/wasm/library_config/index.js @@ -40,9 +40,12 @@ function test_service_selector() { }); assert.strictEqual(values.length, 2) - assert.strictEqual(values[0].name, 'DD_RUNTIME_METRICS_ENABLED') - assert.strictEqual(values[0].value, 'true') - assert.strictEqual(values[0].source, 'local_stable_config') + assert.strictEqual(values[0].name, 'DD_SERVICE') + assert.strictEqual(values[0].value, 'my-service_butremote') + assert.strictEqual(values[0].source, 'fleet_stable_config') + assert.strictEqual(values[1].name, 'DD_RUNTIME_METRICS_ENABLED') + assert.strictEqual(values[1].value, 'true') + assert.strictEqual(values[1].source, 'local_stable_config') if (process.platform == 'linux') { assert.strictEqual(configurator.get_config_local_path(process.platform), "/etc/datadog-agent/application_monitoring.yaml"); From a7b36c913f4fa48c19d46a488a4e46c153f5d4b4 Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Wed, 11 Jun 2025 21:30:48 +0200 Subject: [PATCH 16/68] feat: add bindings for process/service discovery (#53) --- Cargo.lock | 10 +++++++ Cargo.toml | 3 +- crates/process_discovery/Cargo.toml | 14 +++++++++ crates/process_discovery/src/lib.rs | 44 +++++++++++++++++++++++++++++ test/process_discovery.js | 40 ++++++++++++++++++++++++++ 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 crates/process_discovery/Cargo.toml create mode 100644 crates/process_discovery/src/lib.rs create mode 100644 test/process_discovery.js diff --git a/Cargo.lock b/Cargo.lock index 31d03a84..2bac370a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1346,6 +1346,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "process-discovery" +version = "0.1.0" +dependencies = [ + "anyhow", + "datadog-library-config", + "napi", + "napi-derive", +] + [[package]] name = "prost" version = "0.11.9" diff --git a/Cargo.toml b/Cargo.toml index b8ba21e5..45083635 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] default-members = [ - "crates/crashtracker" + "crates/crashtracker", + "crates/process_discovery", ] members = [ "crates/*", diff --git a/crates/process_discovery/Cargo.toml b/crates/process_discovery/Cargo.toml new file mode 100644 index 00000000..1f59cd23 --- /dev/null +++ b/crates/process_discovery/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "process-discovery" +version = "0.1.0" +edition = "2018" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +anyhow = "1" +datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v18.1.0" } + +napi = { version = "2" } +napi-derive = { version = "2", default-features = false } diff --git a/crates/process_discovery/src/lib.rs b/crates/process_discovery/src/lib.rs new file mode 100644 index 00000000..c5cfac1f --- /dev/null +++ b/crates/process_discovery/src/lib.rs @@ -0,0 +1,44 @@ +use napi::{Error, Status}; +use napi_derive::napi; + +use datadog_library_config::tracer_metadata; + +#[napi] +pub struct NapiAnonymousFileHandle { + _internal: tracer_metadata::AnonymousFileHandle, +} + +#[napi] +impl NapiAnonymousFileHandle {} + +#[napi(constructor)] +pub struct TracerMetadata { + pub runtime_id: Option, + pub tracer_version: String, + pub hostname: String, + pub service_name: Option, + pub service_env: Option, + pub service_version: Option, +} + +#[napi] +pub fn store_metadata(data: &TracerMetadata) -> napi::Result { + let res = tracer_metadata::store_tracer_metadata(&tracer_metadata::TracerMetadata{ + schema_version: 1, + runtime_id: data.runtime_id.clone(), + tracer_language: String::from("nodejs"), + tracer_version: data.tracer_version.clone(), + hostname: data.hostname.clone(), + service_name: data.service_name.clone(), + service_env: data.service_env.clone(), + service_version: data.service_version.clone(), + }); + + match res { + Ok(handle) => Ok(NapiAnonymousFileHandle{ _internal: handle }), + Err(e) => { + let err_msg = format!("Failed to store the tracer configuration: {:?}", e); + Err(Error::new(Status::GenericFailure, err_msg)) + } + } +} diff --git a/test/process_discovery.js b/test/process_discovery.js new file mode 100644 index 00000000..501723bb --- /dev/null +++ b/test/process_discovery.js @@ -0,0 +1,40 @@ +'use strict' + +const assert = require('assert'); +const fs = require('fs'); +const process = require('process'); + +const libdatadog = require('..') +const process_discovery = libdatadog.load('process-discovery') +assert(process_discovery !== undefined) + +const metadata = new process_discovery.TracerMetadata( + "7938685c-19dd-490f-b9b3-8aae4c22f897", + "1.0.0", + "my_hostname", + "my_svc", + "my_env", + "my_version" + ) + +const cfg_handle = process_discovery.storeMetadata(metadata) +assert(cfg_handle !== undefined) + +if (process.platform === "linux") { + const contains_datadog_memfd = (fds) => { + for (const fd in fds) { + try { + const fd_name = fs.readlinkSync(`/proc/${process.pid}/fd/${fd}`); + if (fd_name.indexOf("datadog-tracer-info-") !== -1) { + return true; + } + } catch { + continue; + } + } + return false + }; + + const fds = fs.readdirSync(`/proc/${process.pid}/fd`) + assert(contains_datadog_memfd(fds)) +} From 61df46ef964b4926a36bfdb8570f46587c90615b Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Fri, 13 Jun 2025 11:26:16 +0200 Subject: [PATCH 17/68] deps(crashtracker) Update libdatadog for crashtracker to 16.0.3 (#54) --- Cargo.lock | 714 ++++++++++++++++++++------------- crates/crashtracker/Cargo.toml | 5 +- test/crashtracker/index.js | 10 +- 3 files changed, 453 insertions(+), 276 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2bac370a..c355805d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "once_cell", @@ -40,9 +40,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "autocfg" @@ -73,29 +73,25 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.10.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" +checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" dependencies = [ "aws-lc-sys", - "mirai-annotations", - "paste", "zeroize", ] [[package]] name = "aws-lc-sys" -version = "0.22.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" +checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", - "libc", - "paste", ] [[package]] @@ -144,15 +140,15 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.87", + "syn 2.0.101", "which", ] [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "blazesym" @@ -170,9 +166,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" @@ -182,15 +178,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" dependencies = [ "jobserver", "libc", @@ -214,15 +210,15 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -238,9 +234,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.51" +version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" dependencies = [ "cc", ] @@ -258,7 +254,7 @@ name = "collector" version = "0.1.0" source = "git+https://github.com/DataDog/libdatadog.git?branch=rochdev/collector#c0ac24e3f58c7b27d50c7593ca9f465a32ac9682" dependencies = [ - "hyper 0.14.31", + "hyper 0.14.32", "once_cell", "rmp", "rmp-serde", @@ -286,6 +282,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -303,13 +309,14 @@ dependencies = [ [[package]] name = "crashtracker" -version = "0.1.0" +version = "0.2.0" dependencies = [ "anyhow", + "backtrace", "datadog-crashtracker", "napi", "napi-derive", - "rustls 0.23.16", + "rustls 0.23.27", ] [[package]] @@ -323,12 +330,12 @@ dependencies = [ [[package]] name = "ctor" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] @@ -343,7 +350,7 @@ dependencies = [ "datadog-trace-utils", "ddcommon 6.0.0", "futures", - "hyper 0.14.31", + "hyper 0.14.32", "log", "rmp-serde", "tokio", @@ -351,17 +358,17 @@ dependencies = [ [[package]] name = "datadog-crashtracker" -version = "15.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" +version = "16.0.3" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" dependencies = [ "anyhow", "backtrace", "blazesym", "chrono", - "ddcommon 15.0.0", + "ddcommon 16.0.3", "ddtelemetry", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "libc", "nix", "os_info", @@ -377,8 +384,8 @@ dependencies = [ [[package]] name = "datadog-ddsketch" -version = "15.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" +version = "16.0.3" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" dependencies = [ "prost", ] @@ -437,7 +444,7 @@ dependencies = [ "ddcommon 6.0.0", "flate2", "futures", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-rustls 0.23.2", "log", "prost", @@ -457,7 +464,7 @@ dependencies = [ "futures-util", "hex", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "hyper-rustls 0.23.2", "lazy_static", "log", @@ -472,8 +479,8 @@ dependencies = [ [[package]] name = "ddcommon" -version = "15.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" +version = "16.0.3" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" dependencies = [ "anyhow", "cc", @@ -482,36 +489,36 @@ dependencies = [ "futures-util", "hex", "http 0.2.12", - "hyper 0.14.31", - "hyper-rustls 0.27.3", + "hyper 0.14.32", + "hyper-rustls 0.27.6", "hyper-util", "lazy_static", "libc", "log", "pin-project", "regex", - "rustls 0.23.16", + "rustls 0.23.27", "rustls-native-certs 0.7.3", "serde", "static_assertions", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.2", "windows-sys 0.52.0", ] [[package]] name = "ddtelemetry" -version = "15.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v15.0.0#0ef49864317b0728648b2b7f26fe2f1deeeeebc4" +version = "16.0.3" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" dependencies = [ "anyhow", "base64 0.22.1", "datadog-ddsketch", - "ddcommon 15.0.0", + "ddcommon 16.0.3", "futures", "hashbrown 0.14.5", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "io-lifetimes", "lazy_static", "pin-project", @@ -533,30 +540,30 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -567,9 +574,9 @@ checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] name = "flate2" -version = "1.0.34" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide", @@ -643,7 +650,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] @@ -678,17 +685,29 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.31.1" @@ -702,9 +721,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "hashbrown" @@ -718,9 +737,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" [[package]] name = "hermit-abi" @@ -736,11 +755,11 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -756,9 +775,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -783,14 +802,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.3.1", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -800,9 +819,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -823,14 +842,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.3.1", "http-body 1.0.1", "httparse", "itoa", @@ -847,7 +866,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" dependencies = [ "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "rustls 0.20.9", "rustls-native-certs 0.6.3", "tokio", @@ -856,34 +875,35 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "futures-util", - "http 1.1.0", - "hyper 1.5.0", + "http 1.3.1", + "hyper 1.6.0", "hyper-util", - "rustls 0.23.16", - "rustls-native-certs 0.8.0", + "rustls 0.23.27", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.0", + "tokio-rustls 0.26.2", "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" dependencies = [ "bytes", "futures-channel", + "futures-core", "futures-util", - "http 1.1.0", + "http 1.3.1", "http-body 1.0.1", - "hyper 1.5.0", + "hyper 1.6.0", + "libc", "pin-project-lite", "socket2", "tokio", @@ -893,14 +913,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -916,12 +937,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.3", ] [[package]] @@ -955,16 +976,17 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] @@ -992,18 +1014,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.162" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.53.0", ] [[package]] @@ -1012,24 +1034,44 @@ version = "0.2.0" dependencies = [ "anyhow", "datadog-library-config", - "getrandom", + "getrandom 0.2.16", "serde", "serde-wasm-bindgen", "wasm-bindgen", "wasm-bindgen-test", ] +[[package]] +name = "linkme" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b1703c00b2a6a70738920544aa51652532cacddfec2e162d2e29eae01e665c" +dependencies = [ + "linkme-impl", +] + +[[package]] +name = "linkme-impl" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04d55ca5d5a14363da83bf3c33874b8feaa34653e760d5216d7ef9829c88001a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "memchr" @@ -1082,9 +1124,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", "simd-adler32", @@ -1092,27 +1134,20 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ - "hermit-abi", "libc", - "wasi", - "windows-sys 0.52.0", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - [[package]] name = "napi" -version = "2.16.13" +version = "2.16.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "214f07a80874bb96a8433b3cdfc84980d56c7b02e1a0d7ba4ba0db5cef785e2b" +checksum = "55740c4ae1d8696773c78fdafd5d0e5fe9bc9f1b071c7ba493ba5c413a9184f3" dependencies = [ "bitflags", "ctor", @@ -1125,29 +1160,29 @@ dependencies = [ [[package]] name = "napi-derive" -version = "2.16.12" +version = "2.16.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17435f7a00bfdab20b0c27d9c56f58f6499e418252253081bfff448099da31d1" +checksum = "7cbe2585d8ac223f7d34f13701434b9d5f4eb9c332cccce8dee57ea18ab8ab0c" dependencies = [ "cfg-if", "convert_case", "napi-derive-backend", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] name = "napi-derive-backend" -version = "1.0.74" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "967c485e00f0bf3b1bdbe510a38a4606919cf1d34d9a37ad41f25a81aa077abe" +checksum = "1639aaa9eeb76e91c6ae66da8ce3e89e921cd3885e99ec85f4abacae72fc91bf" dependencies = [ "convert_case", "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] @@ -1161,11 +1196,13 @@ dependencies = [ [[package]] name = "neon" -version = "1.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d75440242411c87dc39847b0e33e961ec1f10326a9d8ecf9c1ea64a3b3c13dc" +checksum = "74c1d298c79e60a3f5a1e638ace1f9c1229d2a97bd3a9e40a63b67c8efa0f1e1" dependencies = [ + "either", "libloading", + "linkme", "neon-macros", "once_cell", "semver", @@ -1175,13 +1212,13 @@ dependencies = [ [[package]] name = "neon-macros" -version = "1.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6813fde79b646e47e7ad75f480aa80ef76a5d9599e2717407961531169ee38b" +checksum = "c39e43767817fc963f90f400600967a2b2403602c6440685d09a6bc4e02b70b1" dependencies = [ + "proc-macro2", "quote", - "syn 2.0.87", - "syn-mid", + "syn 2.0.101", ] [[package]] @@ -1217,30 +1254,30 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "os_info" -version = "3.8.2" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" +checksum = "41fc863e2ca13dc2d5c34fb22ea4a588248ac14db929616ba65c45f21744b1e9" dependencies = [ "log", "serde", @@ -1265,29 +1302,29 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1311,37 +1348,37 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" dependencies = [ "serde", ] [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -1381,13 +1418,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -1415,7 +1458,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", ] [[package]] @@ -1456,7 +1499,7 @@ dependencies = [ "cc", "libc", "once_cell", - "spin 0.5.2", + "spin", "untrusted 0.7.1", "web-sys", "winapi", @@ -1464,15 +1507,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.16", "libc", - "spin 0.9.8", "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -1513,15 +1555,15 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.40" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1538,13 +1580,13 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "aws-lc-rs", "once_cell", - "ring 0.17.8", + "ring 0.17.14", "rustls-pki-types", "rustls-webpki", "subtle", @@ -1560,7 +1602,7 @@ dependencies = [ "openssl-probe", "rustls-pemfile 1.0.4", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -1573,20 +1615,19 @@ dependencies = [ "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.2.0", ] [[package]] @@ -1609,18 +1650,21 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "aws-lc-rs", - "ring 0.17.8", + "ring 0.17.14", "rustls-pki-types", "untrusted 0.9.0", ] @@ -1633,9 +1677,9 @@ checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -1648,18 +1692,18 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "schemars" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", "schemars_derive", @@ -1669,14 +1713,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] @@ -1685,7 +1729,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -1696,7 +1740,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -1704,9 +1761,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -1714,9 +1771,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "send_wrapper" @@ -1746,9 +1803,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" dependencies = [ "serde", ] @@ -1761,7 +1818,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] @@ -1772,14 +1829,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -1823,15 +1880,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1843,12 +1900,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1880,26 +1931,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "syn-mid" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5dc35bb08dd1ca3dfb09dce91fd2d13294d6711c88897d9a9d60acf39bce049" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "sys-info" version = "0.9.1" @@ -1912,9 +1952,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.1" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -1928,13 +1968,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] @@ -1950,20 +1990,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.16", - "rustls-pki-types", + "rustls 0.23.27", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -1980,9 +2019,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-core", @@ -1990,9 +2029,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -2005,9 +2044,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-segmentation" @@ -2035,12 +2074,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uuid" -version = "1.11.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ - "getrandom", + "getrandom 0.3.3", + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -2074,6 +2115,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -2096,7 +2146,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -2131,7 +2181,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2166,7 +2216,7 @@ checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] @@ -2185,7 +2235,7 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.8", + "ring 0.17.14", "untrusted 0.9.0", ] @@ -2234,11 +2284,61 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", ] [[package]] @@ -2292,13 +2392,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -2311,6 +2427,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -2323,6 +2445,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -2335,12 +2463,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -2353,6 +2493,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2365,6 +2511,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -2377,6 +2529,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -2389,25 +2547,39 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.101", ] [[package]] diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index b63261f4..15966b36 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crashtracker" -version = "0.1.0" +version = "0.2.0" edition = "2018" [lib] @@ -14,7 +14,8 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v15.0.0" } +datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v16.0.3" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } +backtrace = { version = "=0.3.74" } # Can be removed when libdatadog is updated to 18.1.0 or later diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index e6b56428..dc974739 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -13,10 +13,14 @@ execSync('yarn install', opts) const express = require('express') const bodyParser = require('body-parser') -const { existsSync } = require('fs') +const { existsSync, rmSync } = require('fs') +const path = require('path') const app = express() +rmSync(path.join(cwd, 'stdout.log'), { force: true }) +rmSync(path.join(cwd, 'stderr.log'), { force: true }) + let timeout = setTimeout(() => { execSync('cat stdout.log', opts) execSync('cat stderr.log', opts) @@ -32,8 +36,8 @@ app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { res.status(200).send() server.close(() => { - const stackTrace = JSON.parse(req.body.payload[0].stack_trace) - const boomFrame = stackTrace.find(frame => frame.names?.[0]?.name.toLowerCase().includes('segfaultify')) + const stackTrace = JSON.parse(req.body.payload[0].stack_trace).frames + const boomFrame = stackTrace.find(frame => frame.function?.toLowerCase().includes('segfaultify')) console.log(inspect(stackTrace, true, 5, true)) From bd08cd11e4fffd7d894aac6b56aa56dcb09daede Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Thu, 5 Feb 2026 04:28:17 +0100 Subject: [PATCH 18/68] Remove unused crates (#58) --- crates/collector/Cargo.toml | 17 -------- crates/collector/src/lib.rs | 55 -------------------------- crates/pipeline/Cargo.toml | 17 -------- crates/pipeline/src/lib.rs | 77 ------------------------------------- 4 files changed, 166 deletions(-) delete mode 100644 crates/collector/Cargo.toml delete mode 100644 crates/collector/src/lib.rs delete mode 100644 crates/pipeline/Cargo.toml delete mode 100644 crates/pipeline/src/lib.rs diff --git a/crates/collector/Cargo.toml b/crates/collector/Cargo.toml deleted file mode 100644 index 1c8f255b..00000000 --- a/crates/collector/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "collector" -version = "0.1.0" -edition = "2018" - -[lib] -crate-type = ["cdylib"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -collector = { git = "https://github.com/DataDog/libdatadog.git", branch = "rochdev/collector" } - -[dependencies.neon] -version = "1.0.0" -default-features = false -features = ["napi-6"] diff --git a/crates/collector/src/lib.rs b/crates/collector/src/lib.rs deleted file mode 100644 index fb1ef9c8..00000000 --- a/crates/collector/src/lib.rs +++ /dev/null @@ -1,55 +0,0 @@ -use neon::prelude::*; -use neon::thread::LocalKey; -use neon::types::buffer::TypedArray; -use collector::runtime::RUNTIME; -use collector::collector::Collector; - -// TODO: Use a single collector for all worker threads. -static COLLECTORS: LocalKey = LocalKey::new(); - -#[neon::main] -fn main (mut cx: ModuleContext) -> NeonResult<()> { - register(&mut cx) -} - -fn register (cx: &mut ModuleContext) -> NeonResult<()> { - COLLECTORS.get_or_init(cx, || Collector::new()); - - cx.export_function("send_events", send_events)?; - cx.export_function("receive_events", receive_events)?; - - Ok(()) -} - -fn send_events(mut cx: FunctionContext) -> JsResult { - let payload = cx.argument::(0).unwrap().as_slice(&mut cx).to_vec(); - let collector = COLLECTORS.get(&mut cx).unwrap(); - - collector.write(payload.as_slice()); - - Ok(cx.undefined()) -} - -// TODO: Do we need an unsubscribe? -fn receive_events(mut cx: FunctionContext) -> JsResult { - let collector = COLLECTORS.get(&mut cx).unwrap(); - let mut cb = cx.argument::(0)?.root(&mut cx); - let ch = cx.channel(); - let mut rx = collector.subscribe(); - - RUNTIME.spawn_blocking(move || { - while let Ok(payload) = rx.blocking_recv() { - cb = ch.send(move |mut cx| { - let buf = JsBuffer::from_slice(&mut cx, payload.as_slice()).unwrap(); - let this = cx.undefined(); - let args = vec![buf.upcast()]; - - cb.to_inner(&mut cx).call(&mut cx, this, args).unwrap(); - - Ok(cb) - }).join().unwrap(); - } - }); - - Ok(cx.undefined()) -} diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml deleted file mode 100644 index e98036d8..00000000 --- a/crates/pipeline/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "pipeline" -version = "0.1.0" -edition = "2018" - -[lib] -crate-type = ["cdylib"] - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", branch = "julio/nodejs-integration" } - -[dependencies.neon] -version = "1.0.0" -default-features = false -features = ["napi-6"] diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs deleted file mode 100644 index 652d5c22..00000000 --- a/crates/pipeline/src/lib.rs +++ /dev/null @@ -1,77 +0,0 @@ -use std::borrow::BorrowMut; -use std::sync::Mutex; -use std::cell::OnceCell; -use neon::prelude::*; -use neon::types::buffer::TypedArray; -use data_pipeline::trace_exporter::TraceExporter; -use data_pipeline::trace_exporter::TraceExporterBuilder; - -static EXPORTER: Mutex> = Mutex::new(OnceCell::new()); - -#[neon::main] -fn main (mut cx: ModuleContext) -> NeonResult<()> { - register(&mut cx) -} - -fn register (cx: &mut ModuleContext) -> NeonResult<()> { - cx.export_function("init_trace_exporter", init_trace_exporter)?; - cx.export_function("send_traces", send_traces)?; - - Ok(()) -} - -fn trace_exporter_init( - host: &str, - port: u16, - timeout: u64, - tracer_version: &str, - lang: &str, - lang_version: &str, - lang_interpreter: &str) { - - EXPORTER.lock().unwrap().get_or_init(|| { - TraceExporterBuilder::default() - .set_host(host) - .set_port(port) - .set_tracer_version(tracer_version) - .set_language(lang) - .set_language_version(lang_version) - .set_language_interpreter(lang_interpreter) - .set_timeout(timeout) - .build() - .unwrap() - - }); -} - -fn init_trace_exporter(mut cx: FunctionContext) -> JsResult{ - let host = cx.argument::(0)?.value(cx.borrow_mut()); - let port = cx.argument::(1)?.value(cx.borrow_mut()); - let timeout = cx.argument::(2)?.value(cx.borrow_mut()); - let tracer_version = cx.argument::(3)?.value(cx.borrow_mut()); - let lang = cx.argument::(4)?.value(cx.borrow_mut()); - let lang_version = cx.argument::(5)?.value(cx.borrow_mut()); - let lang_interpreter = cx.argument::(5)?.value(cx.borrow_mut()); - - trace_exporter_init( - &host, - port as u16, - timeout as u64, - &tracer_version, - &lang, - &lang_version, - &lang_interpreter); - - Ok(cx.undefined()) -} - -fn send_traces(mut cx: FunctionContext) -> JsResult { - let trace_count = cx.argument::(1)?.value(cx.borrow_mut()); - let data = cx.argument::(0)?.as_slice(cx.borrow_mut()); - - let response = EXPORTER.lock().unwrap().get().unwrap().send(data, trace_count as usize); - - Ok(cx.string(response.unwrap_or("Error sending traces".to_string()))) -} - - From b9305f5b2baf4ba3b3d462e983e5949fb6bd97d3 Mon Sep 17 00:00:00 2001 From: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:56:10 -0500 Subject: [PATCH 19/68] [crashtracking]: upgrade libdatadog for crashtracking to 26.0.0 (#61) * Upgrade to v26 and fix compat issues + serialization workaround * Serde + napi demo * remove demo code; keep commit for history * clean up * members being weird * Remove crypto init and make test resilient * Include pre-test script in build.yml Add pre-test script to build workflow for artifact handling * Remove crypto init * Revert build yml file --- Cargo.lock | 975 +++++++++--------------- crates/crashtracker/Cargo.toml | 3 +- crates/crashtracker/src/bin/receiver.rs | 4 +- crates/crashtracker/src/lib.rs | 43 +- rust-toolchain.toml | 2 +- test/crashtracker/app.js | 6 +- test/crashtracker/index.js | 18 +- test/crashtracker/package-lock.json | 791 +++++++++++++++++++ test/crashtracker/yarn.lock | 138 ++-- 9 files changed, 1271 insertions(+), 709 deletions(-) create mode 100644 test/crashtracker/package-lock.json diff --git a/Cargo.lock b/Cargo.lock index c355805d..39df17da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -8,7 +8,7 @@ version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "gimli", + "gimli 0.31.1", ] [[package]] @@ -17,18 +17,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -109,12 +97,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -130,7 +112,7 @@ dependencies = [ "bitflags", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools", "lazy_static", "lazycell", "log", @@ -140,7 +122,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.101", + "syn", "which", ] @@ -152,12 +134,12 @@ checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "blazesym" -version = "0.2.0-rc.2" +version = "0.2.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb42921128af76c2ced7c723edfb0411695a96d2bfcdda21c3a6543f98b715a" +checksum = "95824d1dd4f20b4a4dfa63b72954e81914a718357231468180b30314e85057fa" dependencies = [ - "cpp_demangle", - "gimli", + "cpp_demangle 0.4.4", + "gimli 0.32.3", "libc", "memmap2", "miniz_oxide", @@ -208,6 +190,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.41" @@ -242,25 +230,23 @@ dependencies = [ ] [[package]] -name = "collector" -version = "0.1.0" +name = "const_format" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ - "collector 0.1.0 (git+https://github.com/DataDog/libdatadog.git?branch=rochdev/collector)", - "neon", + "const_format_proc_macros", ] [[package]] -name = "collector" -version = "0.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=rochdev/collector#c0ac24e3f58c7b27d50c7593ca9f465a32ac9682" +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ - "hyper 0.14.32", - "once_cell", - "rmp", - "rmp-serde", - "serde", - "serde_json", - "tokio", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] @@ -272,16 +258,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation" version = "0.10.1" @@ -307,25 +283,24 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cpp_demangle" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0667304c32ea56cb4cd6d2d7c0cfe9a2f8041229db8c033af7f8d69492429def" +dependencies = [ + "cfg-if", +] + [[package]] name = "crashtracker" version = "0.2.0" dependencies = [ "anyhow", - "backtrace", - "datadog-crashtracker", + "libdd-crashtracker", "napi", "napi-derive", - "rustls 0.23.27", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", + "rustls", ] [[package]] @@ -335,59 +310,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.101", -] - -[[package]] -name = "data-pipeline" -version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=julio/nodejs-integration#bf883f325a716a3b28661224d496d31a3157abdf" -dependencies = [ - "anyhow", - "bytes", - "datadog-trace-normalization", - "datadog-trace-protobuf", - "datadog-trace-utils", - "ddcommon 6.0.0", - "futures", - "hyper 0.14.32", - "log", - "rmp-serde", - "tokio", -] - -[[package]] -name = "datadog-crashtracker" -version = "16.0.3" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" -dependencies = [ - "anyhow", - "backtrace", - "blazesym", - "chrono", - "ddcommon 16.0.3", - "ddtelemetry", - "http 0.2.12", - "hyper 0.14.32", - "libc", - "nix", - "os_info", - "page_size", - "portable-atomic", - "rand", - "schemars", - "serde", - "serde_json", - "tokio", - "uuid", -] - -[[package]] -name = "datadog-ddsketch" -version = "16.0.3" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" -dependencies = [ - "prost", + "syn", ] [[package]] @@ -415,120 +338,11 @@ dependencies = [ ] [[package]] -name = "datadog-trace-normalization" -version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=julio/nodejs-integration#bf883f325a716a3b28661224d496d31a3157abdf" -dependencies = [ - "anyhow", - "datadog-trace-protobuf", -] - -[[package]] -name = "datadog-trace-protobuf" -version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=julio/nodejs-integration#bf883f325a716a3b28661224d496d31a3157abdf" -dependencies = [ - "prost", - "serde", - "serde_bytes", -] - -[[package]] -name = "datadog-trace-utils" -version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=julio/nodejs-integration#bf883f325a716a3b28661224d496d31a3157abdf" -dependencies = [ - "anyhow", - "datadog-trace-normalization", - "datadog-trace-protobuf", - "ddcommon 6.0.0", - "flate2", - "futures", - "hyper 0.14.32", - "hyper-rustls 0.23.2", - "log", - "prost", - "rmp-serde", - "serde", - "serde_json", -] - -[[package]] -name = "ddcommon" -version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?branch=julio/nodejs-integration#bf883f325a716a3b28661224d496d31a3157abdf" -dependencies = [ - "anyhow", - "futures", - "futures-core", - "futures-util", - "hex", - "http 0.2.12", - "hyper 0.14.32", - "hyper-rustls 0.23.2", - "lazy_static", - "log", - "pin-project", - "regex", - "rustls 0.20.9", - "rustls-native-certs 0.6.3", - "serde", - "tokio", - "tokio-rustls 0.23.4", -] - -[[package]] -name = "ddcommon" -version = "16.0.3" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" -dependencies = [ - "anyhow", - "cc", - "futures", - "futures-core", - "futures-util", - "hex", - "http 0.2.12", - "hyper 0.14.32", - "hyper-rustls 0.27.6", - "hyper-util", - "lazy_static", - "libc", - "log", - "pin-project", - "regex", - "rustls 0.23.27", - "rustls-native-certs 0.7.3", - "serde", - "static_assertions", - "tokio", - "tokio-rustls 0.26.2", - "windows-sys 0.52.0", -] - -[[package]] -name = "ddtelemetry" -version = "16.0.3" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v16.0.3#ce8c536ddef78a49142fe4a6c77ab0a1263c1018" +name = "debugid" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" dependencies = [ - "anyhow", - "base64 0.22.1", - "datadog-ddsketch", - "ddcommon 16.0.3", - "futures", - "hashbrown 0.14.5", - "http 0.2.12", - "hyper 0.14.32", - "io-lifetimes", - "lazy_static", - "pin-project", - "regex", - "serde", - "serde_json", - "sys-info", - "tokio", - "tokio-util", - "tracing", "uuid", ] @@ -572,22 +386,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" -[[package]] -name = "flate2" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "fs_extra" version = "1.3.0" @@ -650,7 +460,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -713,6 +523,12 @@ name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" dependencies = [ "fallible-iterator", "indexmap", @@ -727,26 +543,15 @@ checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ - "ahash", "allocator-api2", + "equivalent", + "foldhash", ] -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hex" version = "0.4.3" @@ -762,17 +567,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.3.1" @@ -786,23 +580,25 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 0.2.12", - "pin-project-lite", + "http", ] [[package]] -name = "http-body" -version = "1.0.1" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "http 1.3.1", + "futures-core", + "http", + "http-body", + "pin-project-lite", ] [[package]] @@ -811,35 +607,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.6.0" @@ -849,8 +616,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.3.1", - "http-body 1.0.1", + "http", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -859,34 +626,20 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" -dependencies = [ - "http 0.2.12", - "hyper 0.14.32", - "rustls 0.20.9", - "rustls-native-certs 0.6.3", - "tokio", - "tokio-rustls 0.23.4", -] - [[package]] name = "hyper-rustls" version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" dependencies = [ - "http 1.3.1", - "hyper 1.6.0", + "http", + "hyper", "hyper-util", - "rustls 0.23.27", - "rustls-native-certs 0.8.1", + "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls", "tower-service", ] @@ -900,9 +653,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "http 1.3.1", - "http-body 1.0.1", - "hyper 1.6.0", + "http", + "http-body", + "hyper", "libc", "pin-project-lite", "socket2", @@ -923,7 +676,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core", + "windows-core 0.61.2", ] [[package]] @@ -942,27 +695,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.3", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", + "hashbrown", ] [[package]] @@ -1001,22 +734,121 @@ dependencies = [ ] [[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.180" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" + +[[package]] +name = "libdd-common" +version = "1.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v26.0.0#9aa79d219d0fa74ce667c4013005008f69052786" +dependencies = [ + "anyhow", + "cc", + "const_format", + "futures", + "futures-core", + "futures-util", + "hex", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "libc", + "nix", + "pin-project", + "regex", + "rustls", + "rustls-native-certs", + "serde", + "static_assertions", + "thiserror", + "tokio", + "tokio-rustls", + "tower-service", + "windows-sys 0.52.0", +] + +[[package]] +name = "libdd-crashtracker" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v26.0.0#9aa79d219d0fa74ce667c4013005008f69052786" +dependencies = [ + "anyhow", + "backtrace", + "blazesym", + "cc", + "chrono", + "http", + "libc", + "libdd-common", + "libdd-telemetry", + "nix", + "num-derive", + "num-traits", + "os_info", + "page_size", + "portable-atomic", + "rand", + "schemars", + "serde", + "serde_json", + "symbolic-common", + "symbolic-demangle", + "thiserror", + "tokio", + "uuid", + "windows 0.59.0", +] + +[[package]] +name = "libdd-ddsketch" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v26.0.0#9aa79d219d0fa74ce667c4013005008f69052786" +dependencies = [ + "prost", +] [[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +name = "libdd-telemetry" +version = "2.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v26.0.0#9aa79d219d0fa74ce667c4013005008f69052786" +dependencies = [ + "anyhow", + "base64", + "futures", + "hashbrown", + "http", + "http-body-util", + "hyper", + "hyper-util", + "libc", + "libdd-common", + "libdd-ddsketch", + "serde", + "serde_json", + "sys-info", + "tokio", + "tokio-util", + "tracing", + "uuid", + "winver", +] [[package]] name = "libloading" @@ -1041,26 +873,6 @@ dependencies = [ "wasm-bindgen-test", ] -[[package]] -name = "linkme" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b1703c00b2a6a70738920544aa51652532cacddfec2e162d2e29eae01e665c" -dependencies = [ - "linkme-impl", -] - -[[package]] -name = "linkme-impl" -version = "0.3.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d55ca5d5a14363da83bf3c33874b8feaa34653e760d5216d7ef9829c88001a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -1108,9 +920,9 @@ dependencies = [ [[package]] name = "minicov" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" +checksum = "4869b6a491569605d66d3952bcdf03df789e5b536e5f0cf7758a7f08a55ae24d" dependencies = [ "cc", "walkdir", @@ -1143,6 +955,16 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "msvc-demangler" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeff6bd154a309b2ada5639b2661ca6ae4599b34e8487dc276d2cd637da2d76" +dependencies = [ + "bitflags", + "itoa", +] + [[package]] name = "napi" version = "2.16.17" @@ -1169,7 +991,7 @@ dependencies = [ "napi-derive-backend", "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1182,7 +1004,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1194,41 +1016,15 @@ dependencies = [ "libloading", ] -[[package]] -name = "neon" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c1d298c79e60a3f5a1e638ace1f9c1229d2a97bd3a9e40a63b67c8efa0f1e1" -dependencies = [ - "either", - "libloading", - "linkme", - "neon-macros", - "once_cell", - "semver", - "send_wrapper", - "smallvec", -] - -[[package]] -name = "neon-macros" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39e43767817fc963f90f400600967a2b2403602c6440685d09a6bc4e02b70b1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "nix" -version = "0.27.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags", "cfg-if", + "cfg_aliases", "libc", "memoffset", ] @@ -1243,6 +1039,17 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1317,7 +1124,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1332,14 +1139,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pipeline" -version = "0.1.0" -dependencies = [ - "data-pipeline", - "neon", -] - [[package]] name = "pkg-config" version = "0.3.32" @@ -1371,7 +1170,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" dependencies = [ "proc-macro2", - "syn 2.0.101", + "syn", ] [[package]] @@ -1395,9 +1194,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.11.9" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" dependencies = [ "bytes", "prost-derive", @@ -1405,15 +1204,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.11.9" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -1490,21 +1289,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - [[package]] name = "ring" version = "0.17.14" @@ -1515,7 +1299,7 @@ dependencies = [ "cfg-if", "getrandom 0.2.16", "libc", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] @@ -1566,18 +1350,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "rustls" -version = "0.20.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99" -dependencies = [ - "log", - "ring 0.16.20", - "sct", - "webpki", -] - [[package]] name = "rustls" version = "0.23.27" @@ -1586,38 +1358,13 @@ checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "aws-lc-rs", "once_cell", - "ring 0.17.14", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework 2.11.1", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile 2.2.0", - "rustls-pki-types", - "schannel", - "security-framework 2.11.1", -] - [[package]] name = "rustls-native-certs" version = "0.8.1" @@ -1627,25 +1374,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.2.0", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", + "security-framework", ] [[package]] @@ -1664,9 +1393,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "aws-lc-rs", - "ring 0.17.14", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -1720,30 +1449,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.101", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", + "syn", ] [[package]] @@ -1753,7 +1459,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ "bitflags", - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -1769,18 +1475,6 @@ dependencies = [ "libc", ] -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - [[package]] name = "serde" version = "1.0.197" @@ -1801,15 +1495,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "serde_bytes" -version = "0.11.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" -dependencies = [ - "serde", -] - [[package]] name = "serde_derive" version = "1.0.197" @@ -1818,7 +1503,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1829,7 +1514,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1894,12 +1579,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1919,14 +1598,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] -name = "syn" -version = "1.0.109" +name = "symbolic-common" +version = "12.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "751a2823d606b5d0a7616499e4130a516ebd01a44f39811be2b9600936509c23" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "debugid", + "memmap2", + "stable_deref_trait", + "uuid", +] + +[[package]] +name = "symbolic-demangle" +version = "12.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79b237cfbe320601dd24b4ac817a5b68bb28f5508e33f08d42be0682cadc8ac9" +dependencies = [ + "cpp_demangle 0.5.1", + "msvc-demangler", + "rustc-demangle", + "symbolic-common", ] [[package]] @@ -1950,6 +1642,26 @@ dependencies = [ "libc", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tokio" version = "1.45.1" @@ -1974,18 +1686,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", -] - -[[package]] -name = "tokio-rustls" -version = "0.23.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" -dependencies = [ - "rustls 0.20.9", - "tokio", - "webpki", + "syn", ] [[package]] @@ -1994,7 +1695,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.27", + "rustls", "tokio", ] @@ -2055,16 +1756,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] -name = "unsafe-libyaml" -version = "0.2.11" +name = "unicode-xid" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] -name = "untrusted" -version = "0.7.1" +name = "unsafe-libyaml" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" @@ -2084,12 +1785,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - [[package]] name = "walkdir" version = "2.5.0" @@ -2146,7 +1841,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn", "wasm-bindgen-shared", ] @@ -2181,7 +1876,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2216,7 +1911,7 @@ checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -2229,16 +1924,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - [[package]] name = "which" version = "4.4.2" @@ -2269,9 +1954,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys 0.59.0", ] @@ -2282,17 +1967,60 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" +dependencies = [ + "windows-core 0.59.0", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-core" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" +dependencies = [ + "windows-implement 0.59.0", + "windows-interface", + "windows-result", + "windows-strings 0.3.1", + "windows-targets 0.53.0", +] + [[package]] name = "windows-core" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement", + "windows-implement 0.60.0", "windows-interface", "windows-link", "windows-result", - "windows-strings", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-implement" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2303,7 +2031,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -2314,7 +2042,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -2334,20 +2062,20 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ "windows-link", ] [[package]] -name = "windows-sys" -version = "0.48.0" +name = "windows-strings" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-targets 0.48.5", + "windows-link", ] [[package]] @@ -2553,6 +2281,15 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +[[package]] +name = "winver" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e0e7162b9e282fd75a0a832cce93994bdb21208d848a418cd05a5fdd9b9ab33" +dependencies = [ + "windows 0.48.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" @@ -2579,7 +2316,7 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -2608,9 +2345,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index 15966b36..c1f7002d 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,8 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -datadog-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v16.0.3" } +libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v26.0.0" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } -backtrace = { version = "=0.3.74" } # Can be removed when libdatadog is updated to 18.1.0 or later diff --git a/crates/crashtracker/src/bin/receiver.rs b/crates/crashtracker/src/bin/receiver.rs index 837e824a..4d39342f 100644 --- a/crates/crashtracker/src/bin/receiver.rs +++ b/crates/crashtracker/src/bin/receiver.rs @@ -3,7 +3,5 @@ fn main() {} #[cfg(unix)] fn main() -> anyhow::Result<()> { - // TODO: remove this line when the receiver default provider is fixed - rustls::crypto::aws_lc_rs::default_provider().install_default().unwrap(); - datadog_crashtracker::receiver_entry_point_stdin() + libdd_crashtracker::receiver_entry_point_stdin() } diff --git a/crates/crashtracker/src/lib.rs b/crates/crashtracker/src/lib.rs index e6a93245..a908776b 100644 --- a/crates/crashtracker/src/lib.rs +++ b/crates/crashtracker/src/lib.rs @@ -1,22 +1,51 @@ use napi::{Env, JsUnknown}; use napi_derive::napi; +/// Ensures that if signals is empty, default signals are applied. +/// This is necessary because NAPI deserialization bypasses the +/// CrashtrackerConfiguration::new() constructor where the default +/// signals logic exists. +fn apply_default_signals( + config: libdd_crashtracker::CrashtrackerConfiguration, +) -> libdd_crashtracker::CrashtrackerConfiguration { + if config.signals().is_empty() { + libdd_crashtracker::CrashtrackerConfiguration::new( + config.additional_files().clone(), + config.create_alt_stack(), + config.use_alt_stack(), + config.endpoint().clone(), + config.resolve_frames(), + vec![], // Empty vec will be replaced with default_signals() in new() in libdatadog + Some(config.timeout()), + config.unix_socket_path().clone(), + config.demangle_names(), + ) + .unwrap() + } else { + config + } +} + #[napi] pub fn init(env: Env, config: JsUnknown, receiver_config: JsUnknown, metadata: JsUnknown) -> napi::Result<()> { - let config = env.from_js_value(config)?; + let config: libdd_crashtracker::CrashtrackerConfiguration = env.from_js_value(config)?; let receiver_config = env.from_js_value(receiver_config)?; let metadata = env.from_js_value(metadata)?; - datadog_crashtracker::init(config, receiver_config, metadata).unwrap(); + let config = apply_default_signals(config); + + libdd_crashtracker::init(config, receiver_config, metadata).unwrap(); Ok(()) } #[napi] pub fn update_config (env: Env, config: JsUnknown) -> napi::Result<()> { - let config = env.from_js_value(config)?; + let config: libdd_crashtracker::CrashtrackerConfiguration = env.from_js_value(config)?; + + let config = apply_default_signals(config); - datadog_crashtracker::update_config(config).unwrap(); + libdd_crashtracker::update_config(config).unwrap(); Ok(()) } @@ -25,21 +54,21 @@ pub fn update_config (env: Env, config: JsUnknown) -> napi::Result<()> { pub fn update_metadata (env: Env, metadata: JsUnknown) -> napi::Result<()> { let metadata = env.from_js_value(metadata)?; - datadog_crashtracker::update_metadata(metadata).unwrap(); + libdd_crashtracker::update_metadata(metadata).unwrap(); Ok(()) } #[napi] pub fn begin_profiler_serializing (_env: Env) -> napi::Result<()> { - let _ = datadog_crashtracker::begin_op(datadog_crashtracker::OpTypes::ProfilerSerializing); + let _ = libdd_crashtracker::begin_op(libdd_crashtracker::OpTypes::ProfilerSerializing); Ok(()) } #[napi] pub fn end_profiler_serializing (_env: Env) -> napi::Result<()> { - let _ = datadog_crashtracker::end_op(datadog_crashtracker::OpTypes::ProfilerSerializing); + let _ = libdd_crashtracker::end_op(libdd_crashtracker::OpTypes::ProfilerSerializing); Ok(()) } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 1917f74a..1c3b513d 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.78.0" +channel = "1.84.1" profile = "minimal" components = ["clippy", "rustfmt", "rust-src"] diff --git a/test/crashtracker/app.js b/test/crashtracker/app.js index 3f03102d..5ec4b860 100644 --- a/test/crashtracker/app.js +++ b/test/crashtracker/app.js @@ -15,9 +15,11 @@ crashtracker.init({ }, timeout_ms: 3000 }, - timeout_ms: 3000, + timeout: { secs: 3, nanos: 0 }, resolve_frames: 'EnabledWithInprocessSymbols', - wait_for_receiver: true + wait_for_receiver: true, + demangle_names: false, + signals: [] }, { args: [], env: [], diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index dc974739..958ad97b 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -31,15 +31,22 @@ let timeout = setTimeout(() => { app.use(bodyParser.json()) app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { - clearTimeout(timeout) - res.status(200).send() + const payload = req.body.payload[0] + const tags = payload.tags ? payload.tags.split(',') : [] + + // Only process crash reports (not pings) + if (!tags.some(tag => tag === 'is_crash:true')) { + return + } + + clearTimeout(timeout) + server.close(() => { - const stackTrace = JSON.parse(req.body.payload[0].stack_trace).frames - const boomFrame = stackTrace.find(frame => frame.function?.toLowerCase().includes('segfaultify')) + const stackTrace = JSON.parse(payload.message).error.stack.frames - console.log(inspect(stackTrace, true, 5, true)) + const boomFrame = stackTrace.find(frame => frame.function?.toLowerCase().includes('segfaultify')) if (existsSync('/etc/alpine-release')) { // TODO: Remove this when supported. @@ -50,7 +57,6 @@ app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { throw new Error('Could not find a stack frame for the crashing function.') } - const tags = req.body.payload[0].tags.split(',') if (tags.includes('profiler_serializing:1')) { console.log('Stack trace was marked as happened during profile serialization.') } else { diff --git a/test/crashtracker/package-lock.json b/test/crashtracker/package-lock.json new file mode 100644 index 00000000..e5566b77 --- /dev/null +++ b/test/crashtracker/package-lock.json @@ -0,0 +1,791 @@ +{ + "name": "crashtracker", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@datadog/segfaultify": "^0.1.1", + "body-parser": "^1.20.3", + "express": "^4.19.2" + } + }, + "node_modules/@datadog/segfaultify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@datadog/segfaultify/-/segfaultify-0.1.1.tgz", + "integrity": "sha512-wYfDBfS9VlsTOF10HkWgu7abTWsoGTFkaHxjiw8V6I2pXbfb+D3KNdjb4H+0jD7vnChs4Jm7Rgetg0j89jrlYw==", + "license": "Apache-2.0", + "dependencies": { + "node-gyp-build": "^3.9.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-gyp-build": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz", + "integrity": "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/test/crashtracker/yarn.lock b/test/crashtracker/yarn.lock index 5a70c3a4..3579edb4 100644 --- a/test/crashtracker/yarn.lock +++ b/test/crashtracker/yarn.lock @@ -4,14 +4,14 @@ "@datadog/segfaultify@^0.1.1": version "0.1.1" - resolved "https://registry.yarnpkg.com/@datadog/segfaultify/-/segfaultify-0.1.1.tgz#bd12d31ad26c5d15dc1b8c32572ceb37dbb12651" + resolved "https://registry.npmjs.org/@datadog/segfaultify/-/segfaultify-0.1.1.tgz" integrity sha512-wYfDBfS9VlsTOF10HkWgu7abTWsoGTFkaHxjiw8V6I2pXbfb+D3KNdjb4H+0jD7vnChs4Jm7Rgetg0j89jrlYw== dependencies: node-gyp-build "^3.9.0" accepts@~1.3.8: version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: mime-types "~2.1.34" @@ -19,12 +19,12 @@ accepts@~1.3.8: array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -body-parser@1.20.3, body-parser@^1.20.3: +body-parser@^1.20.3, body-parser@1.20.3: version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" @@ -42,12 +42,12 @@ body-parser@1.20.3, body-parser@^1.20.3: bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -58,36 +58,36 @@ call-bind@^1.0.7: content-disposition@0.5.4: version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: safe-buffer "5.2.1" content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" 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" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz" integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== debug@2.6.9: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -96,54 +96,54 @@ define-data-property@^1.1.4: depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== destroy@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== ee-first@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== encodeurl@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encodeurl@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== etag@~1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== express@^4.19.2: version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" + resolved "https://registry.npmjs.org/express/-/express-4.21.1.tgz" integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== dependencies: accepts "~1.3.8" @@ -180,7 +180,7 @@ express@^4.19.2: finalhandler@1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz" integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" @@ -193,22 +193,22 @@ finalhandler@1.3.1: forwarded@0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fresh@0.5.2: version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -219,38 +219,38 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== hasown@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -261,98 +261,98 @@ http-errors@2.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" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" inherits@2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== media-typer@0.3.0: version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== methods@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 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" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" 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" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== node-gyp-build@^3.9.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz" integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== object-inspect@^1.13.1: version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz" integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== on-finished@2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== path-to-regexp@0.1.10: version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz" integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: forwarded "0.2.0" @@ -360,19 +360,19 @@ proxy-addr@~2.0.7: qs@6.13.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: side-channel "^1.0.6" range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== raw-body@2.5.2: version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -382,17 +382,17 @@ raw-body@2.5.2: safe-buffer@5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== send@0.19.0: version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" @@ -411,7 +411,7 @@ send@0.19.0: serve-static@1.16.2: version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: encodeurl "~2.0.0" @@ -421,7 +421,7 @@ serve-static@1.16.2: set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -433,12 +433,12 @@ set-function-length@^1.2.1: setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== side-channel@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -448,33 +448,33 @@ side-channel@^1.0.6: statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" mime-types "~2.1.24" -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== vary@~1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== From a99d229c751aa88ef81c5c45578f273dc6bef30c Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Thu, 12 Feb 2026 14:56:34 +0100 Subject: [PATCH 20/68] Align with how library filenames are generated in Cargo 1.79+ (#63) * Align with how library filenames are generated in Cargo 1.79+ * Unrelated fix that makes our tests fail --- load.js | 9 +++++++-- test/wasm/library_config/index.js | 12 ++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/load.js b/load.js index 334e6099..930845db 100644 --- a/load.js +++ b/load.js @@ -45,7 +45,12 @@ function findWASM (name) { function find (name, binary = false) { const root = __dirname - const filename = binary ? name : `${name}.node` + + // see https://github.com/rust-lang/cargo/issues/12780 + // Only apply hyphen-to-underscore conversion for .node libraries, not binaries + const transformedName = binary ? name : name.replaceAll('-', '_') + + const filename = binary ? transformedName : `${transformedName}.node` const build = `${root}/build/Release/${filename}` if (existsSync(build)) return build @@ -55,7 +60,7 @@ function find (name, binary = false) { if (!folder) return const prebuildFolder = path.join(root, 'prebuilds', folder) - const file = findFile(prebuildFolder, name, binary) + const file = findFile(prebuildFolder, transformedName, binary) if (!file) return diff --git a/test/wasm/library_config/index.js b/test/wasm/library_config/index.js index e5b55ecf..71aaac1b 100644 --- a/test/wasm/library_config/index.js +++ b/test/wasm/library_config/index.js @@ -40,12 +40,12 @@ function test_service_selector() { }); assert.strictEqual(values.length, 2) - assert.strictEqual(values[0].name, 'DD_SERVICE') - assert.strictEqual(values[0].value, 'my-service_butremote') - assert.strictEqual(values[0].source, 'fleet_stable_config') - assert.strictEqual(values[1].name, 'DD_RUNTIME_METRICS_ENABLED') - assert.strictEqual(values[1].value, 'true') - assert.strictEqual(values[1].source, 'local_stable_config') + assert.strictEqual(values[0].name, 'DD_RUNTIME_METRICS_ENABLED') + assert.strictEqual(values[0].value, 'true') + assert.strictEqual(values[0].source, 'local_stable_config') + assert.strictEqual(values[1].name, 'DD_SERVICE') + assert.strictEqual(values[1].value, 'my-service_butremote') + assert.strictEqual(values[1].source, 'fleet_stable_config') if (process.platform == 'linux') { assert.strictEqual(configurator.get_config_local_path(process.platform), "/etc/datadog-agent/application_monitoring.yaml"); From 4f169669b813bc73ca544fcff84d9d80c8da4d13 Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Thu, 12 Feb 2026 18:19:09 +0100 Subject: [PATCH 21/68] Add CODEOWNERS (#64) * Add CODEOWNERS, with dd-trace-js and libdatadog teams --- .github/CODEOWNERS | 1 + test/wasm/library_config/index.js | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..dc8bb6aa --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @DataDog/dd-trace-js @DataDog/libdatadog diff --git a/test/wasm/library_config/index.js b/test/wasm/library_config/index.js index 71aaac1b..02c0343f 100644 --- a/test/wasm/library_config/index.js +++ b/test/wasm/library_config/index.js @@ -40,6 +40,8 @@ function test_service_selector() { }); assert.strictEqual(values.length, 2) + // We can't rely on ordering, so sort it by name to make it deterministic + values.sort((a, b) => a.name.localeCompare(b.name)) assert.strictEqual(values[0].name, 'DD_RUNTIME_METRICS_ENABLED') assert.strictEqual(values[0].value, 'true') assert.strictEqual(values[0].source, 'local_stable_config') From f8b339bc16c9040c9a1a8ca684bf71e4ad8f7b26 Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Thu, 12 Feb 2026 18:19:28 +0100 Subject: [PATCH 22/68] Enable releasing through OIDC (#65) --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eb820ee3..c6b9ea68 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,9 +35,8 @@ jobs: needs: build environment: npm permissions: + id-token: write # Required for OIDC contents: write - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} outputs: pkgjson: ${{ steps.pkg.outputs.json }} steps: @@ -45,6 +44,7 @@ jobs: - uses: actions/download-artifact@v4 - uses: actions/setup-node@v4 with: + node-version: '24' registry-url: 'https://registry.npmjs.org' - run: chmod -R +x ./prebuilds - run: npm publish From 07d525919d89ffefcda890b509abea9668a0c226 Mon Sep 17 00:00:00 2001 From: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:14:47 -0500 Subject: [PATCH 23/68] Bump libdd-crashtracker to v27.0.0 (#66) --- Cargo.lock | 238 +++++++++++++++++++++++++++++++-- crates/crashtracker/Cargo.toml | 2 +- test/crashtracker/index.js | 8 +- 3 files changed, 229 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 39df17da..09fab518 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,6 +146,15 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + [[package]] name = "bumpalo" version = "3.17.0" @@ -206,7 +215,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -346,6 +355,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags", + "objc2", +] + [[package]] name = "dunce" version = "1.0.5" @@ -754,7 +773,7 @@ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libdd-common" version = "1.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v26.0.0#9aa79d219d0fa74ce667c4013005008f69052786" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" dependencies = [ "anyhow", "cc", @@ -770,7 +789,7 @@ dependencies = [ "hyper-rustls", "hyper-util", "libc", - "nix", + "nix 0.29.0", "pin-project", "regex", "rustls", @@ -787,7 +806,7 @@ dependencies = [ [[package]] name = "libdd-crashtracker" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v26.0.0#9aa79d219d0fa74ce667c4013005008f69052786" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" dependencies = [ "anyhow", "backtrace", @@ -798,7 +817,7 @@ dependencies = [ "libc", "libdd-common", "libdd-telemetry", - "nix", + "nix 0.29.0", "num-derive", "num-traits", "os_info", @@ -819,7 +838,7 @@ dependencies = [ [[package]] name = "libdd-ddsketch" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v26.0.0#9aa79d219d0fa74ce667c4013005008f69052786" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" dependencies = [ "prost", ] @@ -827,7 +846,7 @@ dependencies = [ [[package]] name = "libdd-telemetry" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v26.0.0#9aa79d219d0fa74ce667c4013005008f69052786" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" dependencies = [ "anyhow", "base64", @@ -1029,6 +1048,18 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nom" version = "7.1.3" @@ -1059,6 +1090,165 @@ dependencies = [ "autocfg", ] +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + [[package]] name = "object" version = "0.36.7" @@ -1082,13 +1272,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "os_info" -version = "3.11.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fc863e2ca13dc2d5c34fb22ea4a588248ac14db929616ba65c45f21744b1e9" +checksum = "e4022a17595a00d6a369236fdae483f0de7f0a339960a53118b818238e132224" dependencies = [ + "android_system_properties", "log", + "nix 0.30.1", + "objc2", + "objc2-foundation", + "objc2-ui-kit", "serde", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -2007,7 +2202,7 @@ checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement 0.60.0", "windows-interface", - "windows-link", + "windows-link 0.1.1", "windows-result", "windows-strings 0.4.2", ] @@ -2051,13 +2246,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-result" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -2066,7 +2267,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -2075,7 +2276,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -2096,6 +2297,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-targets" version = "0.48.5" diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index c1f7002d..85c806bc 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v26.0.0" } +libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v27.0.0" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index 958ad97b..92454d87 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -33,18 +33,18 @@ app.use(bodyParser.json()) app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { res.status(200).send() - const payload = req.body.payload[0] - const tags = payload.tags ? payload.tags.split(',') : [] + const logPayload = req.body.payload.logs[0] + const tags = logPayload.tags ? logPayload.tags.split(',') : [] // Only process crash reports (not pings) - if (!tags.some(tag => tag === 'is_crash:true')) { + if (!logPayload.is_crash) { return } clearTimeout(timeout) server.close(() => { - const stackTrace = JSON.parse(payload.message).error.stack.frames + const stackTrace = JSON.parse(logPayload.message).error.stack.frames const boomFrame = stackTrace.find(frame => frame.function?.toLowerCase().includes('segfaultify')) From 4a8ecc28ade0f800d1ec174bffeda92b835b6e0d Mon Sep 17 00:00:00 2001 From: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> Date: Wed, 25 Feb 2026 11:16:15 -0500 Subject: [PATCH 24/68] chore(crashtracking): bump libdd-crashtracker to v28.0.1 (#72) * bump libdd-crashtracker to v28 * v28.0.1 --- Cargo.lock | 11 +++++------ crates/crashtracker/Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 09fab518..f95516ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -773,9 +773,10 @@ checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "libdd-common" version = "1.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v28.0.1#647c8ff924070d4e79494ec852d312ff0301fd8a" dependencies = [ "anyhow", + "bytes", "cc", "const_format", "futures", @@ -806,7 +807,7 @@ dependencies = [ [[package]] name = "libdd-crashtracker" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v28.0.1#647c8ff924070d4e79494ec852d312ff0301fd8a" dependencies = [ "anyhow", "backtrace", @@ -838,7 +839,7 @@ dependencies = [ [[package]] name = "libdd-ddsketch" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v28.0.1#647c8ff924070d4e79494ec852d312ff0301fd8a" dependencies = [ "prost", ] @@ -846,7 +847,7 @@ dependencies = [ [[package]] name = "libdd-telemetry" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v28.0.1#647c8ff924070d4e79494ec852d312ff0301fd8a" dependencies = [ "anyhow", "base64", @@ -854,8 +855,6 @@ dependencies = [ "hashbrown", "http", "http-body-util", - "hyper", - "hyper-util", "libc", "libdd-common", "libdd-ddsketch", diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index 85c806bc..62877bfb 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v27.0.0" } +libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v28.0.1" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } From ebcf8e0edcad230c67b628a22942c8305f1977c3 Mon Sep 17 00:00:00 2001 From: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> Date: Mon, 2 Mar 2026 11:17:11 -0500 Subject: [PATCH 25/68] feat(crashtracking): add unhandled exception libdatadog binding (#73) * Add unhandled exception libdatadog binding * Use process.on() in the test * uncaughtException -> uncaughtExceptionMonitor * Handle unhandled promise rejections and add test scenarios * We only need uncaughtExceptionMonitor * Clean test cases * Assert library --- crates/crashtracker/src/lib.rs | 21 +- .../crashtracker/src/unhandled_exception.rs | 236 ++++++++++++++++++ test/crashtracker/app-seg-fault.js | 9 + .../app-uncaught-exception-non-error.js | 14 ++ test/crashtracker/app-uncaught-exception.js | 18 ++ .../app-unhandled-rejection-non-error.js | 14 ++ test/crashtracker/app-unhandled-rejection.js | 18 ++ test/crashtracker/app.js | 44 ---- test/crashtracker/index.js | 114 ++++++--- test/crashtracker/test_utils.js | 45 ++++ 10 files changed, 451 insertions(+), 82 deletions(-) create mode 100644 crates/crashtracker/src/unhandled_exception.rs create mode 100644 test/crashtracker/app-seg-fault.js create mode 100644 test/crashtracker/app-uncaught-exception-non-error.js create mode 100644 test/crashtracker/app-uncaught-exception.js create mode 100644 test/crashtracker/app-unhandled-rejection-non-error.js create mode 100644 test/crashtracker/app-unhandled-rejection.js delete mode 100644 test/crashtracker/app.js create mode 100644 test/crashtracker/test_utils.js diff --git a/crates/crashtracker/src/lib.rs b/crates/crashtracker/src/lib.rs index a908776b..28366af0 100644 --- a/crates/crashtracker/src/lib.rs +++ b/crates/crashtracker/src/lib.rs @@ -1,9 +1,11 @@ use napi::{Env, JsUnknown}; use napi_derive::napi; +mod unhandled_exception; + /// Ensures that if signals is empty, default signals are applied. /// This is necessary because NAPI deserialization bypasses the -/// CrashtrackerConfiguration::new() constructor where the default +/// CrashtrackerConfiguration::new() constructor where the default /// signals logic exists. fn apply_default_signals( config: libdd_crashtracker::CrashtrackerConfiguration, @@ -15,7 +17,7 @@ fn apply_default_signals( config.use_alt_stack(), config.endpoint().clone(), config.resolve_frames(), - vec![], // Empty vec will be replaced with default_signals() in new() in libdatadog + vec![], // Empty vec will be replaced with default_signals() in new() in libdatadog Some(config.timeout()), config.unix_socket_path().clone(), config.demangle_names(), @@ -27,7 +29,12 @@ fn apply_default_signals( } #[napi] -pub fn init(env: Env, config: JsUnknown, receiver_config: JsUnknown, metadata: JsUnknown) -> napi::Result<()> { +pub fn init( + env: Env, + config: JsUnknown, + receiver_config: JsUnknown, + metadata: JsUnknown, +) -> napi::Result<()> { let config: libdd_crashtracker::CrashtrackerConfiguration = env.from_js_value(config)?; let receiver_config = env.from_js_value(receiver_config)?; let metadata = env.from_js_value(metadata)?; @@ -40,7 +47,7 @@ pub fn init(env: Env, config: JsUnknown, receiver_config: JsUnknown, metadata: J } #[napi] -pub fn update_config (env: Env, config: JsUnknown) -> napi::Result<()> { +pub fn update_config(env: Env, config: JsUnknown) -> napi::Result<()> { let config: libdd_crashtracker::CrashtrackerConfiguration = env.from_js_value(config)?; let config = apply_default_signals(config); @@ -51,7 +58,7 @@ pub fn update_config (env: Env, config: JsUnknown) -> napi::Result<()> { } #[napi] -pub fn update_metadata (env: Env, metadata: JsUnknown) -> napi::Result<()> { +pub fn update_metadata(env: Env, metadata: JsUnknown) -> napi::Result<()> { let metadata = env.from_js_value(metadata)?; libdd_crashtracker::update_metadata(metadata).unwrap(); @@ -60,14 +67,14 @@ pub fn update_metadata (env: Env, metadata: JsUnknown) -> napi::Result<()> { } #[napi] -pub fn begin_profiler_serializing (_env: Env) -> napi::Result<()> { +pub fn begin_profiler_serializing(_env: Env) -> napi::Result<()> { let _ = libdd_crashtracker::begin_op(libdd_crashtracker::OpTypes::ProfilerSerializing); Ok(()) } #[napi] -pub fn end_profiler_serializing (_env: Env) -> napi::Result<()> { +pub fn end_profiler_serializing(_env: Env) -> napi::Result<()> { let _ = libdd_crashtracker::end_op(libdd_crashtracker::OpTypes::ProfilerSerializing); Ok(()) diff --git a/crates/crashtracker/src/unhandled_exception.rs b/crates/crashtracker/src/unhandled_exception.rs new file mode 100644 index 00000000..64dd8fcb --- /dev/null +++ b/crates/crashtracker/src/unhandled_exception.rs @@ -0,0 +1,236 @@ +use napi::{Env, JsFunction, JsObject, JsUnknown}; +use napi_derive::napi; + +fn get_optional_string_property(obj: &JsObject, key: &str) -> napi::Result> { + match obj.get_named_property::(key) { + Ok(val) => { + use napi::ValueType; + if val.get_type()? == ValueType::String { + let s: String = val.coerce_to_string()?.into_utf8()?.as_str()?.to_owned(); + if s.is_empty() { + Ok(None) + } else { + Ok(Some(s)) + } + } else { + Ok(None) + } + } + Err(_) => Ok(None), + } +} + +fn parse_v8_stack(stack: &str) -> libdd_crashtracker::StackTrace { + let mut frames = Vec::new(); + + for line in stack.lines().skip(1) { + let line = line.trim(); + let line = match line.strip_prefix("at ") { + Some(rest) => rest, + None => continue, + }; + + let mut frame = libdd_crashtracker::StackFrame::new(); + + // Formats: + // "functionName (file:line:col)" + // "functionName (file:line)" + // "file:line:col" + // "file:line" + if let Some(paren_start) = line.rfind('(') { + let func_name = line[..paren_start].trim(); + if !func_name.is_empty() { + frame.function = Some(func_name.to_string()); + } + let location = line[paren_start + 1..].trim_end_matches(')'); + parse_location(location, &mut frame); + } else { + parse_location(line, &mut frame); + } + + frames.push(frame); + } + + libdd_crashtracker::StackTrace::from_frames(frames, false) +} + +fn parse_location(location: &str, frame: &mut libdd_crashtracker::StackFrame) { + // location is "file:line:col" or "file:line" or just "native" etc. + // The file portion may contain ":" ("node:internal/...") + // so we split from the right. + let parts: Vec<&str> = location.rsplitn(3, ':').collect(); + match parts.len() { + 3 => { + // col, line, file + frame.column = parts[0].parse().ok(); + frame.line = parts[1].parse().ok(); + frame.file = Some(parts[2].to_string()); + } + 2 => { + if let Ok(line_num) = parts[0].parse::() { + frame.line = Some(line_num); + frame.file = Some(parts[1].to_string()); + } else { + frame.file = Some(location.to_string()); + } + } + _ => { + frame.file = Some(location.to_string()); + } + } +} + +fn is_error_instance(env: &Env, value: &JsUnknown) -> napi::Result { + let global = env.get_global()?; + let error_ctor: JsFunction = global.get_named_property("Error")?; + value.instanceof(error_ctor) +} + +fn stringify_js_value(value: JsUnknown) -> napi::Result { + let s = value.coerce_to_string()?.into_utf8()?; + Ok(s.as_str()?.to_owned()) +} + +fn report_unhandled(env: &Env, error: JsUnknown, fallback_type: &str) -> napi::Result<()> { + let is_error = is_error_instance(env, &error)?; + let (exception_type, exception_message, stacktrace) = if is_error { + let error_obj: JsObject = error.coerce_to_object()?; + let name = get_optional_string_property(&error_obj, "name")?; + let message = get_optional_string_property(&error_obj, "message")?; + let stack_string = get_optional_string_property(&error_obj, "stack")?; + let stacktrace = match &stack_string { + Some(s) => parse_v8_stack(s), + None => libdd_crashtracker::StackTrace::new_incomplete(), + }; + (name, message, stacktrace) + } else { + // This only fires for synchronous `throw `; node already + // wraps non-Error unhandled rejections in an Error object + let message = stringify_js_value(error).ok(); + ( + Some(fallback_type.to_string()), + message, + // libdatadog defines a missing stacktrace as incomplete + libdd_crashtracker::StackTrace::new_incomplete(), + ) + }; + + libdd_crashtracker::report_unhandled_exception( + exception_type.as_deref(), + exception_message.as_deref(), + stacktrace, + ) + .unwrap(); + + Ok(()) +} + +#[napi] +pub fn report_uncaught_exception_monitor( + env: Env, + error: JsUnknown, + origin: String, +) -> napi::Result<()> { + report_unhandled(&env, error, &origin) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_v8_stack_typical_error() { + let stack = "\ +TypeError: Cannot read properties of undefined (reading 'foo') + at Object.method (/app/src/index.js:10:15) + at Module._compile (node:internal/modules/cjs/loader:1234:14) + at /app/src/helper.js:5:3"; + + let trace = parse_v8_stack(stack); + assert_eq!(trace.frames.len(), 3); + assert!(!trace.incomplete); + + assert_eq!(trace.frames[0].function.as_deref(), Some("Object.method")); + assert_eq!(trace.frames[0].file.as_deref(), Some("/app/src/index.js")); + assert_eq!(trace.frames[0].line, Some(10)); + assert_eq!(trace.frames[0].column, Some(15)); + + assert_eq!(trace.frames[1].function.as_deref(), Some("Module._compile")); + assert_eq!( + trace.frames[1].file.as_deref(), + Some("node:internal/modules/cjs/loader") + ); + assert_eq!(trace.frames[1].line, Some(1234)); + assert_eq!(trace.frames[1].column, Some(14)); + + assert_eq!(trace.frames[2].function, None); + assert_eq!(trace.frames[2].file.as_deref(), Some("/app/src/helper.js")); + assert_eq!(trace.frames[2].line, Some(5)); + assert_eq!(trace.frames[2].column, Some(3)); + } + + #[test] + fn test_parse_v8_stack_anonymous_and_native() { + let stack = "\ +Error: boom + at :1:1 + at native"; + + let trace = parse_v8_stack(stack); + assert_eq!(trace.frames.len(), 2); + + assert_eq!(trace.frames[0].file.as_deref(), Some("")); + assert_eq!(trace.frames[0].line, Some(1)); + assert_eq!(trace.frames[0].column, Some(1)); + + assert_eq!(trace.frames[1].file.as_deref(), Some("native")); + assert_eq!(trace.frames[1].line, None); + } + + #[test] + fn test_parse_v8_stack_empty() { + let stack = "Error: something"; + let trace = parse_v8_stack(stack); + assert_eq!(trace.frames.len(), 0); + assert!(!trace.incomplete); + } + + #[test] + fn test_parse_location_file_line_col() { + let mut frame = libdd_crashtracker::StackFrame::new(); + parse_location("/app/index.js:42:7", &mut frame); + assert_eq!(frame.file.as_deref(), Some("/app/index.js")); + assert_eq!(frame.line, Some(42)); + assert_eq!(frame.column, Some(7)); + } + + #[test] + fn test_parse_location_node_internal() { + let mut frame = libdd_crashtracker::StackFrame::new(); + parse_location("node:internal/modules/cjs/loader:1234:14", &mut frame); + assert_eq!( + frame.file.as_deref(), + Some("node:internal/modules/cjs/loader") + ); + assert_eq!(frame.line, Some(1234)); + assert_eq!(frame.column, Some(14)); + } + + #[test] + fn test_parse_location_no_column() { + let mut frame = libdd_crashtracker::StackFrame::new(); + parse_location("/app/index.js:42", &mut frame); + assert_eq!(frame.file.as_deref(), Some("/app/index.js")); + assert_eq!(frame.line, Some(42)); + assert_eq!(frame.column, None); + } + + #[test] + fn test_parse_location_bare_path() { + let mut frame = libdd_crashtracker::StackFrame::new(); + parse_location("native", &mut frame); + assert_eq!(frame.file.as_deref(), Some("native")); + assert_eq!(frame.line, None); + assert_eq!(frame.column, None); + } +} diff --git a/test/crashtracker/app-seg-fault.js b/test/crashtracker/app-seg-fault.js new file mode 100644 index 00000000..a1471f61 --- /dev/null +++ b/test/crashtracker/app-seg-fault.js @@ -0,0 +1,9 @@ +'use strict' + +const libdatadog = require('../..') +const crashtracker = libdatadog.load('crashtracker') +const { initTestCrashtracker } = require('./test_utils') + +initTestCrashtracker() +crashtracker.beginProfilerSerializing() +require('@datadog/segfaultify').segfaultify() diff --git a/test/crashtracker/app-uncaught-exception-non-error.js b/test/crashtracker/app-uncaught-exception-non-error.js new file mode 100644 index 00000000..418fa4a5 --- /dev/null +++ b/test/crashtracker/app-uncaught-exception-non-error.js @@ -0,0 +1,14 @@ +'use strict' + +const libdatadog = require('../..') +const crashtracker = libdatadog.load('crashtracker') +const { initTestCrashtracker } = require('./test_utils') + +initTestCrashtracker() +crashtracker.beginProfilerSerializing() + +process.on('uncaughtExceptionMonitor', (e, origin) => { + crashtracker.reportUncaughtExceptionMonitor(e, origin) +}) + +throw 'a plain string error' diff --git a/test/crashtracker/app-uncaught-exception.js b/test/crashtracker/app-uncaught-exception.js new file mode 100644 index 00000000..bc94be38 --- /dev/null +++ b/test/crashtracker/app-uncaught-exception.js @@ -0,0 +1,18 @@ +'use strict' + +const libdatadog = require('../..') +const crashtracker = libdatadog.load('crashtracker') +const { initTestCrashtracker } = require('./test_utils') + +initTestCrashtracker() +crashtracker.beginProfilerSerializing() + +process.on('uncaughtExceptionMonitor', (e, origin) => { + crashtracker.reportUncaughtExceptionMonitor(e, origin) +}) + +function myFaultyFunction () { + throw new TypeError('something went wrong') +} + +myFaultyFunction() diff --git a/test/crashtracker/app-unhandled-rejection-non-error.js b/test/crashtracker/app-unhandled-rejection-non-error.js new file mode 100644 index 00000000..fc45909d --- /dev/null +++ b/test/crashtracker/app-unhandled-rejection-non-error.js @@ -0,0 +1,14 @@ +'use strict' + +const libdatadog = require('../..') +const crashtracker = libdatadog.load('crashtracker') +const { initTestCrashtracker } = require('./test_utils') + +initTestCrashtracker() +crashtracker.beginProfilerSerializing() + +process.on('uncaughtExceptionMonitor', (e, origin) => { + crashtracker.reportUncaughtExceptionMonitor(e, origin) +}) + +Promise.reject('a plain string rejection') diff --git a/test/crashtracker/app-unhandled-rejection.js b/test/crashtracker/app-unhandled-rejection.js new file mode 100644 index 00000000..963d60ad --- /dev/null +++ b/test/crashtracker/app-unhandled-rejection.js @@ -0,0 +1,18 @@ +'use strict' + +const libdatadog = require('../..') +const crashtracker = libdatadog.load('crashtracker') +const { initTestCrashtracker } = require('./test_utils') + +initTestCrashtracker() +crashtracker.beginProfilerSerializing() + +process.on('uncaughtExceptionMonitor', (e, origin) => { + crashtracker.reportUncaughtExceptionMonitor(e, origin) +}) + +async function myAsyncFaultyFunction () { + throw new Error('async went wrong') +} + +myAsyncFaultyFunction() diff --git a/test/crashtracker/app.js b/test/crashtracker/app.js deleted file mode 100644 index 5ec4b860..00000000 --- a/test/crashtracker/app.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict' - -const libdatadog = require('../..') -const crashtracker = libdatadog.load('crashtracker') - -crashtracker.init({ - additional_files: [], - create_alt_stack: true, - use_alt_stack: true, - endpoint: { - url: { - scheme: 'http', - authority: `127.0.0.1:${process.env.PORT || 8126}`, - path_and_query: '' - }, - timeout_ms: 3000 - }, - timeout: { secs: 3, nanos: 0 }, - resolve_frames: 'EnabledWithInprocessSymbols', - wait_for_receiver: true, - demangle_names: false, - signals: [] -}, { - args: [], - env: [], - path_to_receiver_binary: libdatadog.find('crashtracker-receiver', true), - stderr_filename: 'stderr.log', - stdout_filename: 'stdout.log', -}, { - library_name: 'dd-trace-js', - library_version: '6.0.0-pre', - family: 'javascript', - tags: [ - 'language:javascript', - 'runtime:nodejs', - 'runtime-id:8a8fef6433a849b3bc3171198831d102', - 'library_version:6.0.0-pre', - 'is_crash:true', - 'severity:crash' - ] -}) - -crashtracker.beginProfilerSerializing() -require('@datadog/segfaultify').segfaultify() diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index 92454d87..1118fdb2 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -1,7 +1,6 @@ 'use strict' const { execSync, exec } = require('child_process') -const { inspect } = require('util') const cwd = __dirname const stdio = ['inherit', 'inherit', 'inherit'] @@ -13,6 +12,7 @@ execSync('yarn install', opts) const express = require('express') const bodyParser = require('body-parser') +const assert = require('assert') const { existsSync, rmSync } = require('fs') const path = require('path') @@ -26,7 +26,9 @@ let timeout = setTimeout(() => { execSync('cat stderr.log', opts) throw new Error('No crash report received before timing out.') -}, 10000) // TODO: reduce this when the receiver no longer locks up +}, 10000) + +let currentTest = null app.use(bodyParser.json()) @@ -41,42 +43,92 @@ app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { return } - clearTimeout(timeout) + if (!currentTest) { + throw new Error('Received unexpected crash report with no active test.') + } - server.close(() => { - const stackTrace = JSON.parse(logPayload.message).error.stack.frames + currentTest(logPayload, tags) +}) - const boomFrame = stackTrace.find(frame => frame.function?.toLowerCase().includes('segfaultify')) +let PORT - if (existsSync('/etc/alpine-release')) { - // TODO: Remove this when supported. - console.log('Received crash report. Skipping stack trace test since it is currently unsupported for Alpine.') - } else if (boomFrame) { - console.log('Stack frame for crashing function successfully received by the mock agent.') - } else { - throw new Error('Could not find a stack frame for the crashing function.') - } +function runApp (script) { + return new Promise((resolve) => { + exec(`node ${script}`, { + ...opts, + env: { ...process.env, PORT } + }) - if (tags.includes('profiler_serializing:1')) { - console.log('Stack trace was marked as happened during profile serialization.') - } else { - throw new Error('Stack trace was not marked as happening during profile serialization.') + currentTest = (logPayload, tags) => { + currentTest = null + resolve({ logPayload, tags }) } }) -}) +} -const server = app.listen(() => { - const PORT = server.address().port +async function testSegfault () { + const { logPayload, tags } = await runApp('app-seg-fault') + const stackTrace = JSON.parse(logPayload.message).error.stack.frames + const boomFrame = stackTrace.find(frame => frame.function?.toLowerCase().includes('segfaultify')) - exec('node app', { - ...opts, - env: { - ...process.env, - PORT - } - }, e => { - if (e.signal !== 'SIGSEGV' && e.code !== 139 && e.status !== 139) { - throw e - } + if (existsSync('/etc/alpine-release')) { + console.log('[segfault] Received crash report. Skipping stack trace test since it is currently unsupported for Alpine.') + } else { + assert(boomFrame, '[segfault] Expected stack frame for crashing function not found.') + } + + assert(tags.includes('profiler_serializing:1'), '[segfault] Expected profiler_serializing:1 tag not found.') +} + +async function testUnhandledError (label, script, { expectedType, expectedMessage, expectedFrame }) { + const { logPayload } = await runApp(script) + const crashReport = JSON.parse(logPayload.message) + + assert(crashReport.error.message.includes(expectedType), `[${label}] Expected exception type "${expectedType}" not found in message.`) + assert(crashReport.error.message.includes(expectedMessage), `[${label}] Expected exception message "${expectedMessage}" not found.`) + if (expectedFrame) { + const frame = crashReport.error.stack.frames.find(f => f.function && f.function.includes(expectedFrame)) + assert(frame, `[${label}] Expected stack frame for ${expectedFrame} not found.`) + } +} + +async function testUnhandledNonError (label, script, { expectedFallbackType, expectedValue }) { + const { logPayload } = await runApp(script) + const crashReport = JSON.parse(logPayload.message) + + assert(crashReport.error.message.includes(expectedFallbackType), `[${label}] Expected fallback type "${expectedFallbackType}" not found in message.`) + assert(crashReport.error.message.includes(expectedValue), `[${label}] Expected stringified value "${expectedValue}" not found in message.`) + assert.strictEqual(crashReport.error.stack.frames.length, 0, `[${label}] Expected empty stack trace but got ${crashReport.error.stack.frames.length} frames.`) +} + +const server = app.listen(async () => { + PORT = server.address().port + + + await testSegfault() + await testUnhandledError('uncaught-exception', 'app-uncaught-exception', { + expectedType: 'TypeError', + expectedMessage: 'something went wrong', + expectedFrame: 'myFaultyFunction' }) + await testUnhandledNonError('uncaught-exception-non-error', 'app-uncaught-exception-non-error', { + expectedFallbackType: 'uncaughtException', + expectedValue: 'a plain string error' + }) + await testUnhandledError('unhandled-rejection', 'app-unhandled-rejection', { + expectedType: 'Error', + expectedMessage: 'async went wrong', + expectedFrame: 'myAsyncFaultyFunction' + }) + // Node wraps non-Error rejections in an Error with name 'UnhandledPromiseRejection' + // before passing to uncaughtExceptionMonitor, so this hits the Error path. + // However, this test case rejects with a plain string, so the wrapped Error object has useless + // stack trace + await testUnhandledError('unhandled-rejection-non-error', 'app-unhandled-rejection-non-error', { + expectedType: 'UnhandledPromiseRejection', + expectedMessage: 'a plain string rejection' + }) + + clearTimeout(timeout) + server.close() }) diff --git a/test/crashtracker/test_utils.js b/test/crashtracker/test_utils.js new file mode 100644 index 00000000..8062d9cb --- /dev/null +++ b/test/crashtracker/test_utils.js @@ -0,0 +1,45 @@ +'use strict' + +const libdatadog = require('../..') +const crashtracker = libdatadog.load('crashtracker') + +function initTestCrashtracker () { + crashtracker.init({ + additional_files: [], + create_alt_stack: true, + use_alt_stack: true, + endpoint: { + url: { + scheme: 'http', + authority: `127.0.0.1:${process.env.PORT || 8126}`, + path_and_query: '' + }, + timeout_ms: 3000 + }, + timeout: { secs: 3, nanos: 0 }, + resolve_frames: 'EnabledWithInprocessSymbols', + wait_for_receiver: true, + demangle_names: false, + signals: [] + }, { + args: [], + env: [], + path_to_receiver_binary: libdatadog.find('crashtracker-receiver', true), + stderr_filename: 'stderr.log', + stdout_filename: 'stdout.log', + }, { + library_name: 'dd-trace-js', + library_version: '6.0.0-pre', + family: 'javascript', + tags: [ + 'language:javascript', + 'runtime:nodejs', + 'runtime-id:8a8fef6433a849b3bc3171198831d102', + 'library_version:6.0.0-pre', + 'is_crash:true', + 'severity:crash' + ] + }) +} + +module.exports = { initTestCrashtracker } From e28d6b3e73f919c03447d5cd7e87e62ea34908ac Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Tue, 3 Mar 2026 11:13:09 +0100 Subject: [PATCH 26/68] Fix an unpleasant typo (#69) --- .github/actions/build-test-wasm/action.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/build-test-wasm/action.yaml b/.github/actions/build-test-wasm/action.yaml index 595c1249..246a38ca 100644 --- a/.github/actions/build-test-wasm/action.yaml +++ b/.github/actions/build-test-wasm/action.yaml @@ -1,7 +1,7 @@ name: 'Build/Test WASM' description: 'A simple composite GitHub Action sets-up WASM; then test & build relevant crates' inputs: - cate: + crate: description: 'The crate name. Must be in ./crates' required: true runs: From 4398e0d4b0f4082e7ee437ca0b6e60169e824d0e Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 3 Mar 2026 11:19:10 +0100 Subject: [PATCH 27/68] refactor(test): run tests via shell script instead of test.js (#79) Replace the Node.js test runner (test.js) with scripts/test.sh so tests are discovered and run from bash. The test script runs top-level test/*.js files and index.js in test subdirectories, skipping wasm. --- package.json | 2 +- scripts/test.sh | 22 ++++++++++++++++++++++ test.js | 12 ------------ 3 files changed, 23 insertions(+), 13 deletions(-) create mode 100755 scripts/test.sh delete mode 100644 test.js diff --git a/package.json b/package.json index 13201f7c..64ce2a84 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", - "test": "node test" + "test": "bash scripts/test.sh" }, "author": "Datadog Inc. ", "license": "Apache-2.0", diff --git a/scripts/test.sh b/scripts/test.sh new file mode 100755 index 00000000..864f27be --- /dev/null +++ b/scripts/test.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -e + +run_test() { + echo "Running $1" + node "$1" +} + +# Run top-level test files +for f in test/*.js; do + run_test "$f" +done + +# Run index.js in test subdirectories (except wasm) +for d in test/*/; do + case "$d" in + *wasm*) ;; + *) + [ -f "${d}index.js" ] && run_test "${d}index.js" + ;; + esac +done diff --git a/test.js b/test.js deleted file mode 100644 index 822f1940..00000000 --- a/test.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict' - -const fs = require('fs') -const { execSync } = require('child_process') - -fs.readdirSync('test') - .filter(file => file.endsWith('.js') || !file.includes('.')) - .forEach(file => { - if (!file.includes('wasm')) { - require('./test/' + file) - } - }) From 1c0d40b2b7039411c3689c198d1b85ffea3c7814 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 3 Mar 2026 11:25:15 +0100 Subject: [PATCH 28/68] perf(load): defer findWASM until native binary is missing (#78) Call findWASM only when find() returns no native .node, so we skip unnecessary prebuilds readdir when a native build is available. --- load.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/load.js b/load.js index 930845db..d54660c5 100644 --- a/load.js +++ b/load.js @@ -24,13 +24,15 @@ function maybeLoad (name) { function load (name) { const filename = find(name) - const filenameWASM = findWASM(name) - if (filename) { return runtimeRequire(filename) - } else if (filenameWASM) { + } + + const filenameWASM = findWASM(name) + if (filenameWASM) { return runtimeRequire(filenameWASM) } + throw new Error(`Could not find a ${name} binary for ${PLATFORM}${LIBC}-${ARCH} nor a ${name} WASM module.`) } From 2c55c22890b5b9ea38bd5457c3a69f8615bdb686 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 3 Mar 2026 13:11:45 +0100 Subject: [PATCH 29/68] fix(build): use Homebrew clang for wasm32 C build on macOS (#77) When CC is set (e.g. ccache cc), the wasm32 C/C++ build can use Apple Clang, which does not support wasm32-unknown-unknown, so the datadog-js-zstd WASM build failed. Set CC_wasm32_unknown_unknown and CXX_wasm32_unknown_unknown to Homebrew's clang so crates like zstd-sys always use a wasm32-capable compiler. Add DEVELOPMENT.md with Rust/rustup, macOS LLVM, and yarn setup steps, and move the build/test notes from README into DEVELOPMENT.md. --- DEVELOPMENT.md | 49 +++++++++++++++++++++++++++++++++++++++++++ README.md | 6 ------ scripts/build-wasm.js | 5 +++++ 3 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 DEVELOPMENT.md diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 00000000..4adca209 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,49 @@ +# Development + +## Contributing + +See [`CONTRIBUTING.md`](CONTRIBUTING.md). + +## Development setup + +To build `libdatadog-nodejs` locally (for example, to run tests or try out changes), you need Node.js, Yarn, and Rust. + +**Rust (required for native and WASM builds)** + +The project compiles Rust for both native Node.js addons and WebAssembly. Use [rustup](https://rustup.rs/) (the recommended and supported method): + +1. **Install rustup and Rust** (see https://rustup.rs/ for more options): + + ```bash + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + ``` + +2. **Ensure Rust is on `PATH`** — the rustup installer prints the command for your shell; run it or open a new terminal. + +3. **Add the WebAssembly target** (required for the full build): + + ```bash + rustup target add wasm32-unknown-unknown + ``` + +4. **On macOS only** — the WASM build requires LLVM from Homebrew (Apple's Clang has compatibility issues with some crates). Install it before building: + + ```bash + brew install llvm + ``` + +5. **Install dependencies:** + + ```bash + yarn install + ``` + +## Building + +* `yarn build`: Build the default workspaces in debug mode. +* `yarn build-release`: Build the default workspaces in release mode. +* `yarn build-all`: Build all workspaces in debug mode. This is useful when working on a workspace that is not a default member yet. + +## Run tests + +* `yarn test`: Run the JavaScript test suite diff --git a/README.md b/README.md index 5b32d987..69caebcd 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,3 @@ Node.js bindings for [libdatadog](https://github.com/DataDog/libdatadog). This project is currently meant to be used only by [dd-trace-js](https://github.com/DataDog/dd-trace-js) and installing it directly is not supported at the moment. - -## Building - -* `yarn build`: Build the default workspaces in debug mode. -* `yarn build-release`: Build the default workspaces in release mode. -* `yarn build-all`: Build all workspaces in debug mode. This is useful when working on a workspace that is not a default member yet. diff --git a/scripts/build-wasm.js b/scripts/build-wasm.js index ae5bcddf..51e692eb 100644 --- a/scripts/build-wasm.js +++ b/scripts/build-wasm.js @@ -37,6 +37,11 @@ if (isMacOS) { // Add LLVM to PATH if not already included env.PATH = `${llvmBinDir}:${env.PATH}`; } + + // Force C/C++ code (e.g. zstd-sys) to use Homebrew's clang for wasm32. Otherwise a global + // CC (e.g. ccache cc) can point at Apple Clang, which does not support wasm32-unknown-unknown. + env.CC_wasm32_unknown_unknown = `${llvmBinDir}/clang`; + env.CXX_wasm32_unknown_unknown = `${llvmBinDir}/clang++`; } childProcess.execSync( From e26b6562def28365f4fe551d7c7b81fdbd3cc73b Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 3 Mar 2026 14:52:25 +0100 Subject: [PATCH 30/68] chore(ci): pin actions to SHAs, add Dependabot with cooldown and grouping (#82) Pin all GitHub Actions to full commit SHAs instead of version tags for supply-chain safety. Add inline comments with the resolved version (e.g. v4.3.1). Add Dependabot for github-actions (weekly), with a 5-day cooldown (excluding @datadog/*) and a single grouped PR for action updates. --- .github/actions/build-test-wasm/action.yaml | 8 ++++---- .github/dependabot.yml | 17 +++++++++++++++++ .github/workflows/build.yml | 8 ++++---- .github/workflows/release.yml | 8 ++++---- 4 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/actions/build-test-wasm/action.yaml b/.github/actions/build-test-wasm/action.yaml index 246a38ca..306d258c 100644 --- a/.github/actions/build-test-wasm/action.yaml +++ b/.github/actions/build-test-wasm/action.yaml @@ -7,10 +7,10 @@ inputs: runs: using: 'composite' steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - run: yarn install shell: bash - name: Install wasm-pack @@ -24,7 +24,7 @@ runs: - name: Test WASM run: node test_wasm.js ${{ inputs.crate }} shell: bash - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: prebuilds-wasm-${{ inputs.crate }} if-no-files-found: ignore diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..985225cc --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,17 @@ +# Dependabot version updates +# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + cooldown: + default-days: 5 + exclude: + - "@datadog/*" + groups: + gh-actions-packages: + patterns: + - "*" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0533478a..bbd1e28d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ jobs: - library_config - datadog-js-zstd steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: 'Use composite action' uses: ./.github/actions/build-test-wasm with: @@ -38,10 +38,10 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - run: yarn install - name: Compute module size tree and report uses: qard/heaviest-objects-in-the-universe@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c6b9ea68..90234353 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: - library_config - datadog-js-zstd steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: 'Use composite action' uses: ./.github/actions/build-test-wasm with: @@ -40,9 +40,9 @@ jobs: outputs: pkgjson: ${{ steps.pkg.outputs.json }} steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 - - uses: actions/setup-node@v4 + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 with: node-version: '24' registry-url: 'https://registry.npmjs.org' From 726cd26420c3dc1aa58020635294286b1ea8f55e Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 3 Mar 2026 16:06:22 +0100 Subject: [PATCH 31/68] chore: set minimum Node.js version to 18 (#85) Update min-node-version in the build and release CI workflows. --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bbd1e28d..9eb55d87 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: with: package-manager: 'yarn' cache: false - min-node-version: 16 + min-node-version: 18 rust: true only: darwin-arm64,darwin-x64,linux-arm64,linux-x64 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 90234353..a27ac93a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,7 +26,7 @@ jobs: with: package-manager: 'yarn' cache: false - min-node-version: 16 + min-node-version: 18 rust: true only: darwin-arm64,darwin-x64,linux-arm64,linux-x64 From 673d8540ff80f3930837074ea06d202d051a4f19 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 3 Mar 2026 17:17:45 +0100 Subject: [PATCH 32/68] chore(test): remove npm lockfile from crashtracker test (#90) The crashtracker test uses yarn (yarn.lock already exists), so the npm package-lock.json is unnecessary. --- test/crashtracker/package-lock.json | 791 ---------------------------- 1 file changed, 791 deletions(-) delete mode 100644 test/crashtracker/package-lock.json diff --git a/test/crashtracker/package-lock.json b/test/crashtracker/package-lock.json deleted file mode 100644 index e5566b77..00000000 --- a/test/crashtracker/package-lock.json +++ /dev/null @@ -1,791 +0,0 @@ -{ - "name": "crashtracker", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@datadog/segfaultify": "^0.1.1", - "body-parser": "^1.20.3", - "express": "^4.19.2" - } - }, - "node_modules/@datadog/segfaultify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@datadog/segfaultify/-/segfaultify-0.1.1.tgz", - "integrity": "sha512-wYfDBfS9VlsTOF10HkWgu7abTWsoGTFkaHxjiw8V6I2pXbfb+D3KNdjb4H+0jD7vnChs4Jm7Rgetg0j89jrlYw==", - "license": "Apache-2.0", - "dependencies": { - "node-gyp-build": "^3.9.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "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.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-gyp-build": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz", - "integrity": "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "license": "MIT" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - } - } -} From 8ea1cff7eeda7d0578e00bcefdd4fd201f3be92a Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 3 Mar 2026 18:12:17 +0100 Subject: [PATCH 33/68] chore: add ESLint linting to the project (#84) Set up ESLint with @eslint/js, @stylistic/eslint-plugin, eslint-plugin-n, eslint-plugin-unicorn, and eslint-plugin-import-x. Add an eslint.config.js with project-specific overrides (CJS mode, Node.js >=18, 1tbs brace style, kebab-case filenames, prefer-const, import ordering, etc.) and a lint CI job in the build workflow. Apply all auto-fixable and manual lint fixes across the codebase: - Use node: protocol for built-in requires - Replace var/let with const where appropriate - Add trailing commas, remove semicolons, fix spacing - Rename files to kebab-case (test_utils.js -> test-utils.js, test_wasm.js -> test-wasm.js, process_discovery.js -> process-discovery.js) - Replace .find() equality checks with .includes() - Remove unused catch bindings - Use top-level await where applicable - Auto-install test subdirectory dependencies in test.sh --- .github/actions/build-test-wasm/action.yaml | 2 +- .github/workflows/build.yml | 11 + .yarnrc | 1 + eslint.config.js | 72 ++ load.js | 16 +- package.json | 10 + scripts/build-wasm.js | 38 +- scripts/copy-artifacts.js | 2 +- scripts/test.sh | 6 + test-wasm.js | 10 + test/crashtracker/app-seg-fault.js | 4 +- .../app-uncaught-exception-non-error.js | 4 +- test/crashtracker/app-uncaught-exception.js | 4 +- .../app-unhandled-rejection-non-error.js | 4 +- test/crashtracker/app-unhandled-rejection.js | 6 +- test/crashtracker/index.js | 35 +- .../{test_utils.js => test-utils.js} | 10 +- test/pipeline.js | 4 +- ...cess_discovery.js => process-discovery.js} | 32 +- test/wasm/datadog-js-zstd/index.js | 57 +- test/wasm/library_config/index.js | 49 +- test_wasm.js | 10 - yarn.lock | 945 ++++++++++++++++++ 23 files changed, 1193 insertions(+), 139 deletions(-) create mode 100644 .yarnrc create mode 100644 eslint.config.js create mode 100644 test-wasm.js rename test/crashtracker/{test_utils.js => test-utils.js} (91%) rename test/{process_discovery.js => process-discovery.js} (61%) delete mode 100644 test_wasm.js diff --git a/.github/actions/build-test-wasm/action.yaml b/.github/actions/build-test-wasm/action.yaml index 306d258c..c8cabfe8 100644 --- a/.github/actions/build-test-wasm/action.yaml +++ b/.github/actions/build-test-wasm/action.yaml @@ -22,7 +22,7 @@ runs: wasm-pack build --target nodejs ./crates/${{ inputs.crate }} --out-dir ../../prebuilds/${{ inputs.crate }} shell: bash - name: Test WASM - run: node test_wasm.js ${{ inputs.crate }} + run: node test-wasm.js ${{ inputs.crate }} shell: bash - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9eb55d87..9e8ca53b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,17 @@ on: - main jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - name: Setup Node.js + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + - run: yarn install + - run: yarn install + working-directory: test/crashtracker + - run: yarn lint + build-test-wasm: runs-on: ubuntu-latest strategy: diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 00000000..4f14322d --- /dev/null +++ b/.yarnrc @@ -0,0 +1 @@ +--ignore-engines true diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..a264f442 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,72 @@ +'use strict' + +const eslintPluginImportX = require('eslint-plugin-import-x') +const eslintPluginJs = require('@eslint/js') +const eslintPluginN = require('eslint-plugin-n') +const eslintPluginStylistic = require('@stylistic/eslint-plugin') +const eslintPluginUnicorn = require('eslint-plugin-unicorn').default +const globals = require('globals') + +module.exports = [ + eslintPluginJs.configs.recommended, + eslintPluginImportX.flatConfigs.recommended, + eslintPluginN.configs['flat/recommended-script'], + eslintPluginStylistic.configs.recommended, + eslintPluginUnicorn.configs.recommended, + { + languageOptions: { + ecmaVersion: 2022, + sourceType: 'commonjs', + globals: { + ...globals.es2022, + ...globals.node, + }, + }, + settings: { + // Used by `eslint-plugin-n` to determine the minimum version of Node.js to support. + // Normally setting this in the `package.json` engines field is enough, but we can't use that as it will fail + // when running `yarn copy-artifacts` inside the prebuildify Docker container which uses Node.js 12. + node: { version: '>=18.0.0' }, + }, + rules: { + '@stylistic/brace-style': ['error', '1tbs'], + '@stylistic/space-before-function-paren': ['error', 'always'], + 'import-x/extensions': ['error', 'never', { json: 'always' }], + 'import-x/no-absolute-path': 'error', + 'import-x/no-webpack-loader-syntax': 'error', + 'import-x/order': ['error', { + 'newlines-between': 'always', + }], + 'n/no-process-exit': 'off', // Duplicate of unicorn/no-process-exit + 'prefer-const': 'error', + 'unicorn/prefer-module': 'off', // We use CJS + 'unicorn/prevent-abbreviations': 'off', + }, + }, + { + files: ['load.js'], + languageOptions: { + globals: { + __webpack_require__: 'readonly', + __non_webpack_require__: 'readonly', + }, + }, + }, + { + // This script runs inside the prebuildify Docker container which uses Node.js 12 + files: ['scripts/copy-artifacts.js'], + languageOptions: { + ecmaVersion: 2019, + }, + settings: { + // Used by `eslint-plugin-n` to determine the minimum version of Node.js to support. + node: { version: '>=12.0.0' }, + }, + rules: { + 'unicorn/prefer-node-protocol': 'off', + }, + }, + { + ignores: ['build/', 'target/', 'prebuilds/'], + }, +] diff --git a/load.js b/load.js index d54660c5..69cdca51 100644 --- a/load.js +++ b/load.js @@ -2,13 +2,13 @@ // TODO: Extract this file to an external library. -const { existsSync, readdirSync } = require('fs') -const os = require('os') -const path = require('path') +const { existsSync, readdirSync } = require('node:fs') +const os = require('node:os') +const path = require('node:path') const PLATFORM = os.platform() const ARCH = process.arch -const LIBC = PLATFORM === 'linux' ? existsSync('/etc/alpine-release') ? 'musl' : 'glibc' : '' +const LIBC = PLATFORM === 'linux' ? (existsSync('/etc/alpine-release') ? 'musl' : 'glibc') : '' const ABI = process.versions.modules const inWebpack = typeof __webpack_require__ === 'function' @@ -17,7 +17,7 @@ const runtimeRequire = inWebpack ? __non_webpack_require__ : require function maybeLoad (name) { try { return load(name) - } catch (e) { + } catch { // Not found, skip. } } @@ -40,7 +40,7 @@ function findWASM (name) { const root = __dirname const prebuilds = path.join(root, 'prebuilds') const folders = readdirSync(prebuilds) - if (folders.find(f => f === name)) { + if (folders.includes(name)) { return path.join(prebuilds, name, `${name.replaceAll('-', '_')}.js`) } } @@ -76,8 +76,8 @@ function findFolder (root) { return folders.find(f => f === `${PLATFORM}${LIBC}-${ARCH}`) || folders.find(f => f === `${PLATFORM}-${ARCH}`) - } catch (e) { - return null + } catch { + // Ignore } } diff --git a/package.json b/package.json index 64ce2a84..6af66370 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", + "lint": "eslint .", "test": "bash scripts/test.sh" }, "author": "Datadog Inc. ", @@ -27,5 +28,14 @@ "homepage": "https://github.com/DataDog/libdatadog-nodejs#readme", "publishConfig": { "access": "public" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@stylistic/eslint-plugin": "^5.9.0", + "eslint": "^10.0.2", + "eslint-plugin-import-x": "^4.12.2", + "eslint-plugin-n": "^17.24.0", + "eslint-plugin-unicorn": "^63.0.0", + "globals": "^17.4.0" } } diff --git a/scripts/build-wasm.js b/scripts/build-wasm.js index 51e692eb..b5a20a6d 100644 --- a/scripts/build-wasm.js +++ b/scripts/build-wasm.js @@ -10,42 +10,42 @@ // Our releases are built on Linux, and fortunately no special handling is required there. This // script only allows development to happen on macOS. -const os = require('os'); -const childProcess = require('child_process'); +const os = require('node:os') +const childProcess = require('node:child_process') -const isMacOS = os.platform() === 'darwin'; -const noWasmOpt = isMacOS ? '--no-opt' : ''; -const library = process.argv[2]; +const isMacOS = os.platform() === 'darwin' +const noWasmOpt = isMacOS ? '--no-opt' : '' +const library = process.argv[2] const env = { ...process.env, -}; +} if (isMacOS) { - const homebrewDir = env.HOMEBREW_DIR ?? '/opt/homebrew'; - const llvmDir = `${homebrewDir}/opt/llvm/`; - const llvmBinDir = `${llvmDir}/bin`; + const homebrewDir = env.HOMEBREW_DIR ?? '/opt/homebrew' + const llvmDir = `${homebrewDir}/opt/llvm/` + const llvmBinDir = `${llvmDir}/bin` try { - childProcess.execSync(`${llvmBinDir}/llvm-config --version`); - } catch (error) { - console.error(`‼️ LLVM not found in ${llvmDir}.\n‼️ Please install LLVM using Homebrew:\n📝 brew install llvm`); - process.exit(1); + childProcess.execSync(`${llvmBinDir}/llvm-config --version`) + } catch { + console.error(`‼️ LLVM not found in ${llvmDir}.\n‼️ Please install LLVM using Homebrew:\n📝 brew install llvm`) + process.exit(1) // eslint-disable-line unicorn/no-process-exit } if (!env.PATH.includes(llvmBinDir)) { // Add LLVM to PATH if not already included - env.PATH = `${llvmBinDir}:${env.PATH}`; + env.PATH = `${llvmBinDir}:${env.PATH}` } // Force C/C++ code (e.g. zstd-sys) to use Homebrew's clang for wasm32. Otherwise a global // CC (e.g. ccache cc) can point at Apple Clang, which does not support wasm32-unknown-unknown. - env.CC_wasm32_unknown_unknown = `${llvmBinDir}/clang`; - env.CXX_wasm32_unknown_unknown = `${llvmBinDir}/clang++`; + env.CC_wasm32_unknown_unknown = `${llvmBinDir}/clang` + env.CXX_wasm32_unknown_unknown = `${llvmBinDir}/clang++` } childProcess.execSync( `wasm-pack build ${noWasmOpt} --target nodejs ./crates/${library} --out-dir ../../prebuilds/${library}`, { - env - } -); + env, + }, +) diff --git a/scripts/copy-artifacts.js b/scripts/copy-artifacts.js index ecca6bfd..e7651234 100644 --- a/scripts/copy-artifacts.js +++ b/scripts/copy-artifacts.js @@ -10,7 +10,7 @@ const outPath = path.join(rootPath, 'target', 'out.ndjson') const buildPath = path.join(rootPath, 'build', 'Release') const lineReader = readline.createInterface({ - input: fs.createReadStream(outPath) + input: fs.createReadStream(outPath), }) lineReader.on('line', function (line) { diff --git a/scripts/test.sh b/scripts/test.sh index 864f27be..cfd0ca4e 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -2,6 +2,12 @@ set -e run_test() { + local dir + dir=$(dirname "$1") + if [ -f "${dir}/package.json" ]; then + echo "Installing dependencies for $1" + yarn --cwd "$dir" install + fi echo "Running $1" node "$1" } diff --git a/test-wasm.js b/test-wasm.js new file mode 100644 index 00000000..47aadf04 --- /dev/null +++ b/test-wasm.js @@ -0,0 +1,10 @@ +'use strict' + +const fs = require('node:fs') + +const crateTestsDir = `./test/wasm/${process.argv[2]}` +const files = fs.readdirSync(crateTestsDir).filter(file => file.endsWith('.js') || !file.includes('.')) + +for (const file of files) { + require(`${crateTestsDir}/${file}`) +} diff --git a/test/crashtracker/app-seg-fault.js b/test/crashtracker/app-seg-fault.js index a1471f61..8eb94c19 100644 --- a/test/crashtracker/app-seg-fault.js +++ b/test/crashtracker/app-seg-fault.js @@ -1,8 +1,10 @@ 'use strict' const libdatadog = require('../..') + +const { initTestCrashtracker } = require('./test-utils') + const crashtracker = libdatadog.load('crashtracker') -const { initTestCrashtracker } = require('./test_utils') initTestCrashtracker() crashtracker.beginProfilerSerializing() diff --git a/test/crashtracker/app-uncaught-exception-non-error.js b/test/crashtracker/app-uncaught-exception-non-error.js index 418fa4a5..cc5962d9 100644 --- a/test/crashtracker/app-uncaught-exception-non-error.js +++ b/test/crashtracker/app-uncaught-exception-non-error.js @@ -1,8 +1,10 @@ 'use strict' const libdatadog = require('../..') + +const { initTestCrashtracker } = require('./test-utils') + const crashtracker = libdatadog.load('crashtracker') -const { initTestCrashtracker } = require('./test_utils') initTestCrashtracker() crashtracker.beginProfilerSerializing() diff --git a/test/crashtracker/app-uncaught-exception.js b/test/crashtracker/app-uncaught-exception.js index bc94be38..0fa04558 100644 --- a/test/crashtracker/app-uncaught-exception.js +++ b/test/crashtracker/app-uncaught-exception.js @@ -1,8 +1,10 @@ 'use strict' const libdatadog = require('../..') + +const { initTestCrashtracker } = require('./test-utils') + const crashtracker = libdatadog.load('crashtracker') -const { initTestCrashtracker } = require('./test_utils') initTestCrashtracker() crashtracker.beginProfilerSerializing() diff --git a/test/crashtracker/app-unhandled-rejection-non-error.js b/test/crashtracker/app-unhandled-rejection-non-error.js index fc45909d..bb79f2d1 100644 --- a/test/crashtracker/app-unhandled-rejection-non-error.js +++ b/test/crashtracker/app-unhandled-rejection-non-error.js @@ -1,8 +1,10 @@ 'use strict' const libdatadog = require('../..') + +const { initTestCrashtracker } = require('./test-utils') + const crashtracker = libdatadog.load('crashtracker') -const { initTestCrashtracker } = require('./test_utils') initTestCrashtracker() crashtracker.beginProfilerSerializing() diff --git a/test/crashtracker/app-unhandled-rejection.js b/test/crashtracker/app-unhandled-rejection.js index 963d60ad..ed735719 100644 --- a/test/crashtracker/app-unhandled-rejection.js +++ b/test/crashtracker/app-unhandled-rejection.js @@ -1,8 +1,10 @@ 'use strict' const libdatadog = require('../..') + +const { initTestCrashtracker } = require('./test-utils') + const crashtracker = libdatadog.load('crashtracker') -const { initTestCrashtracker } = require('./test_utils') initTestCrashtracker() crashtracker.beginProfilerSerializing() @@ -15,4 +17,4 @@ async function myAsyncFaultyFunction () { throw new Error('async went wrong') } -myAsyncFaultyFunction() +myAsyncFaultyFunction() // eslint-disable-line unicorn/prefer-top-level-await diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index 1118fdb2..d017c46d 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -1,6 +1,12 @@ 'use strict' -const { execSync, exec } = require('child_process') +const assert = require('node:assert') +const { existsSync, rmSync } = require('node:fs') +const path = require('node:path') +const { execSync, exec } = require('node:child_process') + +const bodyParser = require('body-parser') +const express = require('express') const cwd = __dirname const stdio = ['inherit', 'inherit', 'inherit'] @@ -8,27 +14,19 @@ const uid = process.getuid() const gid = process.getgid() const opts = { cwd, stdio, uid, gid } -execSync('yarn install', opts) - -const express = require('express') -const bodyParser = require('body-parser') -const assert = require('assert') -const { existsSync, rmSync } = require('fs') -const path = require('path') - const app = express() rmSync(path.join(cwd, 'stdout.log'), { force: true }) rmSync(path.join(cwd, 'stderr.log'), { force: true }) -let timeout = setTimeout(() => { +const timeout = setTimeout(() => { execSync('cat stdout.log', opts) execSync('cat stderr.log', opts) throw new Error('No crash report received before timing out.') -}, 10000) +}, 10_000) -let currentTest = null +let currentTest app.use(bodyParser.json()) @@ -56,11 +54,11 @@ function runApp (script) { return new Promise((resolve) => { exec(`node ${script}`, { ...opts, - env: { ...process.env, PORT } + env: { ...process.env, PORT }, }) currentTest = (logPayload, tags) => { - currentTest = null + currentTest = undefined resolve({ logPayload, tags }) } }) @@ -104,21 +102,20 @@ async function testUnhandledNonError (label, script, { expectedFallbackType, exp const server = app.listen(async () => { PORT = server.address().port - await testSegfault() await testUnhandledError('uncaught-exception', 'app-uncaught-exception', { expectedType: 'TypeError', expectedMessage: 'something went wrong', - expectedFrame: 'myFaultyFunction' + expectedFrame: 'myFaultyFunction', }) await testUnhandledNonError('uncaught-exception-non-error', 'app-uncaught-exception-non-error', { expectedFallbackType: 'uncaughtException', - expectedValue: 'a plain string error' + expectedValue: 'a plain string error', }) await testUnhandledError('unhandled-rejection', 'app-unhandled-rejection', { expectedType: 'Error', expectedMessage: 'async went wrong', - expectedFrame: 'myAsyncFaultyFunction' + expectedFrame: 'myAsyncFaultyFunction', }) // Node wraps non-Error rejections in an Error with name 'UnhandledPromiseRejection' // before passing to uncaughtExceptionMonitor, so this hits the Error path. @@ -126,7 +123,7 @@ const server = app.listen(async () => { // stack trace await testUnhandledError('unhandled-rejection-non-error', 'app-unhandled-rejection-non-error', { expectedType: 'UnhandledPromiseRejection', - expectedMessage: 'a plain string rejection' + expectedMessage: 'a plain string rejection', }) clearTimeout(timeout) diff --git a/test/crashtracker/test_utils.js b/test/crashtracker/test-utils.js similarity index 91% rename from test/crashtracker/test_utils.js rename to test/crashtracker/test-utils.js index 8062d9cb..5dd68e44 100644 --- a/test/crashtracker/test_utils.js +++ b/test/crashtracker/test-utils.js @@ -12,15 +12,15 @@ function initTestCrashtracker () { url: { scheme: 'http', authority: `127.0.0.1:${process.env.PORT || 8126}`, - path_and_query: '' + path_and_query: '', }, - timeout_ms: 3000 + timeout_ms: 3000, }, timeout: { secs: 3, nanos: 0 }, resolve_frames: 'EnabledWithInprocessSymbols', wait_for_receiver: true, demangle_names: false, - signals: [] + signals: [], }, { args: [], env: [], @@ -37,8 +37,8 @@ function initTestCrashtracker () { 'runtime-id:8a8fef6433a849b3bc3171198831d102', 'library_version:6.0.0-pre', 'is_crash:true', - 'severity:crash' - ] + 'severity:crash', + ], }) } diff --git a/test/pipeline.js b/test/pipeline.js index a9de0606..239b3de8 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -3,8 +3,8 @@ const pipeline = require('..').maybeLoad('pipeline') if (pipeline) { - pipeline.init_trace_exporter("127.0.0.1", 8126, 10000, "1.0", "nodejs", "18.0", "v8") + pipeline.init_trace_exporter('127.0.0.1', 8126, 10_000, '1.0', 'nodejs', '18.0', 'v8') - let ret = pipeline.send_traces(Buffer.alloc(1), 1) + const ret = pipeline.send_traces(Buffer.alloc(1), 1) console.log(ret) } diff --git a/test/process_discovery.js b/test/process-discovery.js similarity index 61% rename from test/process_discovery.js rename to test/process-discovery.js index 501723bb..8e984fac 100644 --- a/test/process_discovery.js +++ b/test/process-discovery.js @@ -1,39 +1,39 @@ 'use strict' -const assert = require('assert'); -const fs = require('fs'); -const process = require('process'); +const assert = require('node:assert') +const fs = require('node:fs') +const process = require('node:process') const libdatadog = require('..') const process_discovery = libdatadog.load('process-discovery') assert(process_discovery !== undefined) const metadata = new process_discovery.TracerMetadata( - "7938685c-19dd-490f-b9b3-8aae4c22f897", - "1.0.0", - "my_hostname", - "my_svc", - "my_env", - "my_version" - ) + '7938685c-19dd-490f-b9b3-8aae4c22f897', + '1.0.0', + 'my_hostname', + 'my_svc', + 'my_env', + 'my_version', +) const cfg_handle = process_discovery.storeMetadata(metadata) assert(cfg_handle !== undefined) -if (process.platform === "linux") { +if (process.platform === 'linux') { const contains_datadog_memfd = (fds) => { for (const fd in fds) { try { - const fd_name = fs.readlinkSync(`/proc/${process.pid}/fd/${fd}`); - if (fd_name.indexOf("datadog-tracer-info-") !== -1) { - return true; + const fd_name = fs.readlinkSync(`/proc/${process.pid}/fd/${fd}`) + if (fd_name.includes('datadog-tracer-info-')) { + return true } } catch { - continue; + continue } } return false - }; + } const fds = fs.readdirSync(`/proc/${process.pid}/fd`) assert(contains_datadog_memfd(fds)) diff --git a/test/wasm/datadog-js-zstd/index.js b/test/wasm/datadog-js-zstd/index.js index fd7a4e81..734dfeb8 100644 --- a/test/wasm/datadog-js-zstd/index.js +++ b/test/wasm/datadog-js-zstd/index.js @@ -1,50 +1,51 @@ -const loader = require('../../../load.js'); -const assert = require('assert'); +const assert = require('node:assert') -const zstd = loader.load('datadog-js-zstd'); -assert(zstd !== undefined); +const loader = require('../../../load') + +const zstd = loader.load('datadog-js-zstd') +assert(zstd !== undefined) // Create some compressible data -const SAMPLE_SIZE = 512; -const SAMPLE_COUNT = 1024; -const DATA_SIZE = SAMPLE_COUNT * 4 * SAMPLE_SIZE; +const SAMPLE_SIZE = 512 +const SAMPLE_COUNT = 1024 +const DATA_SIZE = SAMPLE_COUNT * 4 * SAMPLE_SIZE const samples = [] for (let i = 0; i < SAMPLE_COUNT; i++) { - const sample = new Array(SAMPLE_SIZE); - for (let j = 0; j < SAMPLE_SIZE; j++) { - sample[j] = (Math.random() * 256) | 0; - } - samples.push(sample); + const sample = Array.from({ length: SAMPLE_SIZE }) + for (let j = 0; j < SAMPLE_SIZE; j++) { + sample[j] = Math.trunc(Math.random() * 256) + } + samples.push(sample) } -const data = new Array(DATA_SIZE); -for (let i = 0; i < DATA_SIZE; i+= SAMPLE_SIZE) { - data.push(...samples[Math.random() * SAMPLE_COUNT | 0]); +const data = Array.from({ length: DATA_SIZE }) +for (let i = 0; i < DATA_SIZE; i += SAMPLE_SIZE) { + data.push(...samples[Math.trunc(Math.random() * SAMPLE_COUNT)]) } // Introduce some irregularities for (let i = 0; i < SAMPLE_COUNT; i++) { - data[Math.random() * DATA_SIZE | 0] = 0; + data[Math.trunc(Math.random() * DATA_SIZE)] = 0 } -const dataArr = new Uint8Array(data); +const dataArr = new Uint8Array(data) const compressed3 = zstd.zstd_compress(dataArr, 3) -ensureCompressed(compressed3); +ensureCompressed(compressed3) // Test that 0 means default compression level const compressed0 = zstd.zstd_compress(dataArr, 0) -ensureCompressed(compressed3); -assert(compressed0.length == compressed3.length); +ensureCompressed(compressed3) +assert(compressed0.length == compressed3.length) // Test that compression levels are correctly passed on. // Level 18 should produce a smaller output than level 3. // We can go all the way up to 22, but it is significantly slower. const compressed18 = zstd.zstd_compress(dataArr, 18) -ensureCompressed(compressed18); -assert(compressed18.length < compressed3.length); +ensureCompressed(compressed18) +assert(compressed18.length < compressed3.length) -function ensureCompressed(compressed) { - assert(compressed.length > 4); - assert.equal(compressed[0], 0x28); - assert.equal(compressed[1], 0xb5); - assert.equal(compressed[2], 0x2f); - assert.equal(compressed[3], 0xfd); +function ensureCompressed (compressed) { + assert(compressed.length > 4) + assert.equal(compressed[0], 0x28) + assert.equal(compressed[1], 0xB5) + assert.equal(compressed[2], 0x2F) + assert.equal(compressed[3], 0xFD) } diff --git a/test/wasm/library_config/index.js b/test/wasm/library_config/index.js index 02c0343f..6904d00d 100644 --- a/test/wasm/library_config/index.js +++ b/test/wasm/library_config/index.js @@ -1,23 +1,24 @@ -const path = require('path'); -const fs = require('fs'); -const loader = require('../../../load.js'); -const assert = require('assert'); +const assert = require('node:assert') +const fs = require('node:fs') +const path = require('node:path') -const libconfig = loader.load('library_config'); -assert(libconfig !== undefined); +const loader = require('../../../load') + +const libconfig = loader.load('library_config') +assert(libconfig !== undefined) // Test 1: phase 1 (host selection) -function test_host_wide() { - const rawConfigLocal = fs.readFileSync(path.join(__dirname, 'config_local_phase1.yaml')); - let configurator = new libconfig.JsConfigurator(); +function test_host_wide () { + const rawConfigLocal = fs.readFileSync(path.join(__dirname, 'config_local_phase1.yaml')) + const configurator = new libconfig.JsConfigurator() configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}=${value}`)) configurator.set_args(process.argv) - let values = configurator.get_configuration(rawConfigLocal.toString(), "") - values.forEach((value, key, map) => { + const values = configurator.get_configuration(rawConfigLocal.toString(), '') + for (const value of values) { console.log(`(phase 1) name: ${value.name}, value: ${value.value}, source: ${value.source}, config_id: ${value.config_id}`) - }); + } assert.strictEqual(values.length, 1) assert.strictEqual(values[0].name, 'DD_RUNTIME_METRICS_ENABLED') @@ -26,18 +27,18 @@ function test_host_wide() { } // Test 2: managed > local, phase 2 (service selection) -function test_service_selector() { - const rawConfigLocal = fs.readFileSync(path.join(__dirname, 'config_local_phase2.yaml')); - const rawConfigManaged = fs.readFileSync(path.join(__dirname, 'config_managed_phase2.yaml')); - let configurator = new libconfig.JsConfigurator(); +function test_service_selector () { + const rawConfigLocal = fs.readFileSync(path.join(__dirname, 'config_local_phase2.yaml')) + const rawConfigManaged = fs.readFileSync(path.join(__dirname, 'config_managed_phase2.yaml')) + const configurator = new libconfig.JsConfigurator() configurator.set_envp(Object.entries(process.env).map(([key, value]) => `${key}=${value}`)) configurator.set_args(process.argv) - values = configurator.get_configuration(rawConfigLocal.toString(), rawConfigManaged.toString()) - values.forEach((value, key, map) => { + const values = configurator.get_configuration(rawConfigLocal.toString(), rawConfigManaged.toString()) + for (const value of values) { console.log(`(phase 2) name: ${value.name}, value: ${value.value}, source: ${value.source}, config_id: ${value.config_id}`) - }); + } assert.strictEqual(values.length, 2) // We can't rely on ordering, so sort it by name to make it deterministic @@ -50,13 +51,13 @@ function test_service_selector() { assert.strictEqual(values[1].source, 'fleet_stable_config') if (process.platform == 'linux') { - assert.strictEqual(configurator.get_config_local_path(process.platform), "/etc/datadog-agent/application_monitoring.yaml"); + assert.strictEqual(configurator.get_config_local_path(process.platform), '/etc/datadog-agent/application_monitoring.yaml') } else if (process.platform == 'darwin') { - assert.strictEqual(configurator.get_config_local_path(process.platform), "/opt/datadog-agent/etc/application_monitoring.yaml"); + assert.strictEqual(configurator.get_config_local_path(process.platform), '/opt/datadog-agent/etc/application_monitoring.yaml') } else if (process.platform == 'win32') { - assert.strictEqual(configurator.get_config_local_path(process.platform), "C:\\ProgramData\\Datadog\\application_monitoring.yaml"); + assert.strictEqual(configurator.get_config_local_path(process.platform), String.raw`C:\ProgramData\Datadog\application_monitoring.yaml`) } } -test_host_wide(); -test_service_selector(); +test_host_wide() +test_service_selector() diff --git a/test_wasm.js b/test_wasm.js deleted file mode 100644 index 66cc869c..00000000 --- a/test_wasm.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const fs = require('fs') - -const crateTestsDir = `./test/wasm/${process.argv[2]}` -fs.readdirSync(crateTestsDir) - .filter(file => file.endsWith('.js') || !file.includes('.')) - .forEach(file => { - require(`${crateTestsDir}/${file}`) - }) diff --git a/yarn.lock b/yarn.lock index fb57ccd1..ae3d5a41 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,3 +2,948 @@ # yarn lockfile v1 +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@emnapi/core@^1.4.3": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.8.1.tgz#fd9efe721a616288345ffee17a1f26ac5dd01349" + integrity sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg== + dependencies: + "@emnapi/wasi-threads" "1.1.0" + tslib "^2.4.0" + +"@emnapi/runtime@^1.4.3": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.8.1.tgz#550fa7e3c0d49c5fb175a116e8cd70614f9a22a5" + integrity sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" + integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== + dependencies: + tslib "^2.4.0" + +"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.5.0", "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.12.2": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/config-array@^0.23.2": + version "0.23.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.2.tgz#db85beeff7facc685a5775caacb1c845669b9470" + integrity sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A== + dependencies: + "@eslint/object-schema" "^3.0.2" + debug "^4.3.1" + minimatch "^10.2.1" + +"@eslint/config-helpers@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.2.tgz#314c7b03d02a371ad8c0a7f6821d5a8a8437ba9d" + integrity sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ== + dependencies: + "@eslint/core" "^1.1.0" + +"@eslint/core@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.1.0.tgz#51f5cd970e216fbdae6721ac84491f57f965836d" + integrity sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/js@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-10.0.1.tgz#1e8a876f50117af8ab67e47d5ad94d38d6622583" + integrity sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA== + +"@eslint/object-schema@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.2.tgz#c59c6a94aa4b428ed7f1615b6a4495c0a21f7a22" + integrity sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw== + +"@eslint/plugin-kit@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.6.0.tgz#e0cb12ec66719cb2211ad36499fb516f2a63899d" + integrity sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ== + dependencies: + "@eslint/core" "^1.1.0" + levn "^0.4.1" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.4.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + +"@napi-rs/wasm-runtime@^0.2.11": + version "0.2.12" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" + integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ== + dependencies: + "@emnapi/core" "^1.4.3" + "@emnapi/runtime" "^1.4.3" + "@tybys/wasm-util" "^0.10.0" + +"@stylistic/eslint-plugin@^5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.9.0.tgz#b7d23ac17dd8a1868eb7ac142f3ba6d627516e2a" + integrity sha512-FqqSkvDMYJReydrMhlugc71M76yLLQWNfmGq+SIlLa7N3kHp8Qq8i2PyWrVNAfjOyOIY+xv9XaaYwvVW7vroMA== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/types" "^8.56.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + estraverse "^5.3.0" + picomatch "^4.0.3" + +"@tybys/wasm-util@^0.10.0": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" + integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== + dependencies: + tslib "^2.4.0" + +"@types/esrecurse@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" + integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== + +"@types/estree@^1.0.6", "@types/estree@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@typescript-eslint/types@^8.35.0", "@typescript-eslint/types@^8.56.0": + version "8.56.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.1.tgz#975e5942bf54895291337c91b9191f6eb0632ab9" + integrity sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw== + +"@unrs/resolver-binding-android-arm-eabi@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz#9f5b04503088e6a354295e8ea8fe3cb99e43af81" + integrity sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw== + +"@unrs/resolver-binding-android-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz#7414885431bd7178b989aedc4d25cccb3865bc9f" + integrity sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g== + +"@unrs/resolver-binding-darwin-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz#b4a8556f42171fb9c9f7bac8235045e82aa0cbdf" + integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g== + +"@unrs/resolver-binding-darwin-x64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz#fd4d81257b13f4d1a083890a6a17c00de571f0dc" + integrity sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ== + +"@unrs/resolver-binding-freebsd-x64@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz#d2513084d0f37c407757e22f32bd924a78cfd99b" + integrity sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz#844d2605d057488d77fab09705f2866b86164e0a" + integrity sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz#204892995cefb6bd1d017d52d097193bc61ddad3" + integrity sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw== + +"@unrs/resolver-binding-linux-arm64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz#023eb0c3aac46066a10be7a3f362e7b34f3bdf9d" + integrity sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ== + +"@unrs/resolver-binding-linux-arm64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz#9e6f9abb06424e3140a60ac996139786f5d99be0" + integrity sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz#b111417f17c9d1b02efbec8e08398f0c5527bb44" + integrity sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA== + +"@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz#92ffbf02748af3e99873945c9a8a5ead01d508a9" + integrity sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ== + +"@unrs/resolver-binding-linux-riscv64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz#0bec6f1258fc390e6b305e9ff44256cb207de165" + integrity sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew== + +"@unrs/resolver-binding-linux-s390x-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz#577843a084c5952f5906770633ccfb89dac9bc94" + integrity sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg== + +"@unrs/resolver-binding-linux-x64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz#36fb318eebdd690f6da32ac5e0499a76fa881935" + integrity sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w== + +"@unrs/resolver-binding-linux-x64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz#bfb9af75f783f98f6a22c4244214efe4df1853d6" + integrity sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA== + +"@unrs/resolver-binding-wasm32-wasi@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz#752c359dd875684b27429500d88226d7cc72f71d" + integrity sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ== + dependencies: + "@napi-rs/wasm-runtime" "^0.2.11" + +"@unrs/resolver-binding-win32-arm64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz#ce5735e600e4c2fbb409cd051b3b7da4a399af35" + integrity sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw== + +"@unrs/resolver-binding-win32-ia32-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz#72fc57bc7c64ec5c3de0d64ee0d1810317bc60a6" + integrity sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ== + +"@unrs/resolver-binding-win32-x64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz#538b1e103bf8d9864e7b85cc96fa8d6fb6c40777" + integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.15.0, acorn@^8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + +ajv@^6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== + 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" + +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + +baseline-browser-mapping@^2.9.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" + integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== + +brace-expansion@^5.0.2: + version "5.0.4" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" + integrity sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg== + dependencies: + balanced-match "^4.0.2" + +browserslist@^4.28.1: + version "4.28.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== + dependencies: + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" + +builtin-modules@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-5.0.0.tgz#9be95686dedad2e9eed05592b07733db87dcff1a" + integrity sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg== + +caniuse-lite@^1.0.30001759: + version "1.0.30001776" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz#3c64d006348a2e92037aa4302345129806a42d24" + integrity sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw== + +change-case@^5.4.4: + version "5.4.4" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" + integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== + +ci-info@^4.3.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" + integrity sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== + +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== + dependencies: + escape-string-regexp "^1.0.5" + +comment-parser@^1.4.1: + version "1.4.5" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.5.tgz#6c595cd090737a1010fe5ff40d86e1d21b7bd6ce" + integrity sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw== + +core-js-compat@^3.46.0: + version "3.48.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" + integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q== + dependencies: + browserslist "^4.28.1" + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.3.1, debug@^4.3.2, debug@^4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +electron-to-chromium@^1.5.263: + version "1.5.307" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz#09f8973100c39fb0d003b890393cd1d58932b1c8" + integrity sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg== + +enhanced-resolve@^5.17.1: + version "5.20.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz#323c2a70d2aa7fb4bdfd6d3c24dfc705c581295d" + integrity sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.3.0" + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +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== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-compat-utils@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" + integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== + dependencies: + semver "^7.5.4" + +eslint-import-context@^0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/eslint-import-context/-/eslint-import-context-0.1.9.tgz#967b0b2f0a90ef4b689125e088f790f0b7756dbe" + integrity sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg== + dependencies: + get-tsconfig "^4.10.1" + stable-hash-x "^0.2.0" + +eslint-plugin-es-x@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" + integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== + dependencies: + "@eslint-community/eslint-utils" "^4.1.2" + "@eslint-community/regexpp" "^4.11.0" + eslint-compat-utils "^0.5.1" + +eslint-plugin-import-x@^4.12.2: + version "4.16.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz#a96ee1ad5ba6816f9a5573a9617935011a24c4df" + integrity sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ== + dependencies: + "@typescript-eslint/types" "^8.35.0" + comment-parser "^1.4.1" + debug "^4.4.1" + eslint-import-context "^0.1.9" + is-glob "^4.0.3" + minimatch "^9.0.3 || ^10.0.1" + semver "^7.7.2" + stable-hash-x "^0.2.0" + unrs-resolver "^1.9.2" + +eslint-plugin-n@^17.24.0: + version "17.24.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.24.0.tgz#b66fa05f7a6c1ba16768f0921b8974147dddd060" + integrity sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw== + dependencies: + "@eslint-community/eslint-utils" "^4.5.0" + enhanced-resolve "^5.17.1" + eslint-plugin-es-x "^7.8.0" + get-tsconfig "^4.8.1" + globals "^15.11.0" + globrex "^0.1.2" + ignore "^5.3.2" + semver "^7.6.3" + ts-declaration-location "^1.0.6" + +eslint-plugin-unicorn@^63.0.0: + version "63.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-63.0.0.tgz#db210b87bb66f0f15ab675ba13d9f1fb61016b22" + integrity sha512-Iqecl9118uQEXYh7adylgEmGfkn5es3/mlQTLLkd4pXkIk9CTGrAbeUux+YljSa2ohXCBmQQ0+Ej1kZaFgcfkA== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + "@eslint-community/eslint-utils" "^4.9.0" + change-case "^5.4.4" + ci-info "^4.3.1" + clean-regexp "^1.0.0" + core-js-compat "^3.46.0" + find-up-simple "^1.0.1" + globals "^16.4.0" + indent-string "^5.0.0" + is-builtin-module "^5.0.0" + jsesc "^3.1.0" + pluralize "^8.0.0" + regexp-tree "^0.1.27" + regjsparser "^0.13.0" + semver "^7.7.3" + strip-indent "^4.1.1" + +eslint-scope@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.1.tgz#f6a209486e38bd28356b5feb07d445cc99c89967" + integrity sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw== + dependencies: + "@types/esrecurse" "^4.3.1" + "@types/estree" "^1.0.8" + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint-visitor-keys@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + +eslint@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.0.2.tgz#1009263467591810320f2e1ad52b8a750d1acbab" + integrity sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.2" + "@eslint/config-array" "^0.23.2" + "@eslint/config-helpers" "^0.5.2" + "@eslint/core" "^1.1.0" + "@eslint/plugin-kit" "^0.6.0" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.14.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^9.1.1" + eslint-visitor-keys "^5.0.1" + espree "^11.1.1" + esquery "^1.7.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + minimatch "^10.2.1" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + +espree@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-11.1.1.tgz#866f6bc9ccccd6f28876b7a6463abb281b9cb847" + integrity sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ== + dependencies: + acorn "^8.16.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^5.0.1" + +esquery@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== + dependencies: + estraverse "^5.1.0" + +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@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +find-up-simple@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.1.tgz#18fb90ad49e45252c4d7fca56baade04fa3fca1e" + integrity sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ== + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.4.tgz#0986e681008f0f13f58e18656c47967682db5ff6" + integrity sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA== + +get-tsconfig@^4.10.1, get-tsconfig@^4.8.1: + version "4.13.6" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.13.6.tgz#2fbfda558a98a691a798f123afd95915badce876" + integrity sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +globals@^15.11.0: + version "15.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== + +globals@^16.4.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" + integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== + +globals@^17.4.0: + version "17.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-17.4.0.tgz#33d7d297ed1536b388a0e2f4bcd0ff19c8ff91b5" + integrity sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw== + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +ignore@^5.2.0, ignore@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +is-builtin-module@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-5.0.0.tgz#19df4b9c7451149b68176b0e06d18646db6308dd" + integrity sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA== + dependencies: + builtin-modules "^5.0.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-glob@^4.0.0, is-glob@^4.0.3: + 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" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jsesc@^3.1.0, jsesc@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +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== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +minimatch@^10.2.1, "minimatch@^9.0.3 || ^10.0.1": + version "10.2.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" + integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== + dependencies: + brace-expansion "^5.0.2" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +napi-postinstall@^0.3.0: + version "0.3.4" + resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" + integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-releases@^2.0.27: + version "2.0.27" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" + integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +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-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== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^4.0.2, picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +regexp-tree@^0.1.27: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + +regjsparser@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.0.tgz#01f8351335cf7898d43686bc74d2dd71c847ecc0" + integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== + dependencies: + jsesc "~3.1.0" + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +semver@^7.5.4, semver@^7.6.3, semver@^7.7.2, semver@^7.7.3: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + +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@^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== + +stable-hash-x@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" + integrity sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ== + +strip-indent@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.1.1.tgz#aba13de189d4ad9a17f6050e76554ac27585c7af" + integrity sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA== + +tapable@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" + integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== + +ts-declaration-location@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz#d4068fe9975828b3b453b3ab112b4711d8267688" + integrity sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA== + dependencies: + picomatch "^4.0.2" + +tslib@^2.4.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +unrs-resolver@^1.9.2: + version "1.11.1" + resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz#be9cd8686c99ef53ecb96df2a473c64d304048a9" + integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== + dependencies: + napi-postinstall "^0.3.0" + optionalDependencies: + "@unrs/resolver-binding-android-arm-eabi" "1.11.1" + "@unrs/resolver-binding-android-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-x64" "1.11.1" + "@unrs/resolver-binding-freebsd-x64" "1.11.1" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" + "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-musl" "1.11.1" + "@unrs/resolver-binding-wasm32-wasi" "1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" + "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" + +update-browserslist-db@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +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" + +which@^2.0.1: + 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" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 83fd325000dbcabc2b02e1204f1761a049d954b8 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 3 Mar 2026 21:12:04 +0100 Subject: [PATCH 34/68] test(crashtracker): improve reliability and debuggability of crash tests (#83) - Increase crashtracker handler timeout from 3s to 15s and crash-report wait timeout from 10s to 20s to reduce flakiness in CI - Guard stdout/stderr log file reads in the timeout handler with existence checks to avoid masking the real timeout error - Add error and close handlers to child processes so tests fail with a clear message instead of hanging indefinitely - Add console.log labels to each test for easier debugging --- test/crashtracker/index.js | 50 +++++++++++++++++++++++++++++---- test/crashtracker/test-utils.js | 2 +- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index d017c46d..ac3d1495 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -20,11 +20,21 @@ rmSync(path.join(cwd, 'stdout.log'), { force: true }) rmSync(path.join(cwd, 'stderr.log'), { force: true }) const timeout = setTimeout(() => { - execSync('cat stdout.log', opts) - execSync('cat stderr.log', opts) + const stdoutLog = path.join(cwd, 'stdout.log') + const stderrLog = path.join(cwd, 'stderr.log') + if (existsSync(stdoutLog)) { + execSync(`cat ${stdoutLog}`, opts) + } else { + console.error('stdout.log not found (crashtracker-receiver may not have started)') + } + if (existsSync(stderrLog)) { + execSync(`cat ${stderrLog}`, opts) + } else { + console.error('stderr.log not found (crashtracker-receiver may not have started)') + } throw new Error('No crash report received before timing out.') -}, 10_000) +}, 20_000) let currentTest @@ -51,20 +61,46 @@ app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { let PORT function runApp (script) { - return new Promise((resolve) => { - exec(`node ${script}`, { + return new Promise((resolve, reject) => { + let closeTimer + let done = false + + const child = exec(`node ${script}`, { ...opts, env: { ...process.env, PORT }, }) + child.on('error', (err) => { + cleanup() + reject(new Error(`Child process for "${script}" failed to start`, { cause: err })) + }) + + child.on('close', (code, signal) => { + if (done) return + // Allow a grace period for the crash report HTTP request to arrive + // after the child process exits (e.g. segfault sends report then dies). + closeTimer = setTimeout(() => { + const reason = signal ? `signal ${signal}` : `exit code ${code}` + reject(new Error(`Child process for "${script}" exited with ${reason} before sending a crash report`)) + }, 5000) + }) + currentTest = (logPayload, tags) => { + cleanup() currentTest = undefined resolve({ logPayload, tags }) } + + function cleanup () { + clearTimeout(closeTimer) + done = true + } }) } async function testSegfault () { + console.log('Running test: testSegfault') + const { logPayload, tags } = await runApp('app-seg-fault') const stackTrace = JSON.parse(logPayload.message).error.stack.frames const boomFrame = stackTrace.find(frame => frame.function?.toLowerCase().includes('segfaultify')) @@ -79,6 +115,8 @@ async function testSegfault () { } async function testUnhandledError (label, script, { expectedType, expectedMessage, expectedFrame }) { + console.log('Running test: testUnhandledError', label) + const { logPayload } = await runApp(script) const crashReport = JSON.parse(logPayload.message) @@ -91,6 +129,8 @@ async function testUnhandledError (label, script, { expectedType, expectedMessag } async function testUnhandledNonError (label, script, { expectedFallbackType, expectedValue }) { + console.log('Running test: testUnhandledNonError', label) + const { logPayload } = await runApp(script) const crashReport = JSON.parse(logPayload.message) diff --git a/test/crashtracker/test-utils.js b/test/crashtracker/test-utils.js index 5dd68e44..cc62da45 100644 --- a/test/crashtracker/test-utils.js +++ b/test/crashtracker/test-utils.js @@ -16,7 +16,7 @@ function initTestCrashtracker () { }, timeout_ms: 3000, }, - timeout: { secs: 3, nanos: 0 }, + timeout: { secs: 15, nanos: 0 }, resolve_frames: 'EnabledWithInprocessSymbols', wait_for_receiver: true, demangle_names: false, From c35f07aa7b9febad77730a8533112d0315001ee2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Mar 2026 21:04:30 +0100 Subject: [PATCH 35/68] Bump the gh-actions-packages group with 3 updates (#86) Bumps the gh-actions-packages group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [actions/download-artifact](https://github.com/actions/download-artifact) and [actions/setup-node](https://github.com/actions/setup-node). Updates `actions/checkout` from 4.3.1 to 6.0.2 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/34e114876b0b11c390a56381ad16ebd13914f8d5...de0fac2e4500dabe0009e67214ff5f5447ce83dd) Updates `actions/download-artifact` from 4.3.0 to 8.0.0 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/d3f86a106a0bac45b974a628896c90dbdf5c8093...70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3) Updates `actions/setup-node` from 4.4.0 to 6.2.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/49933ea5288caeca8642d1e84afbd3f7d6820020...6044e13b5dc448c55e2357c09f80417699197238) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.2 dependency-type: direct:production update-type: version-update:semver-major dependency-group: gh-actions-packages - dependency-name: actions/download-artifact dependency-version: 8.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: gh-actions-packages - dependency-name: actions/setup-node dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: gh-actions-packages ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 12 ++++++------ .github/workflows/release.yml | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9e8ca53b..d81bd3e5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,9 +10,9 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 - run: yarn install - run: yarn install working-directory: test/crashtracker @@ -26,7 +26,7 @@ jobs: - library_config - datadog-js-zstd steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: 'Use composite action' uses: ./.github/actions/build-test-wasm with: @@ -49,10 +49,10 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 - name: Setup Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 - run: yarn install - name: Compute module size tree and report uses: qard/heaviest-objects-in-the-universe@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a27ac93a..98ea9a72 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: - library_config - datadog-js-zstd steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: 'Use composite action' uses: ./.github/actions/build-test-wasm with: @@ -40,9 +40,9 @@ jobs: outputs: pkgjson: ${{ steps.pkg.outputs.json }} steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 - - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: '24' registry-url: 'https://registry.npmjs.org' From 549a68e8f8ae9cdf99f88d561329b91bb145ff5e Mon Sep 17 00:00:00 2001 From: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> Date: Fri, 13 Mar 2026 10:38:48 -0400 Subject: [PATCH 36/68] Bump libdatadog to v29 and use remote symbol resolution (#100) * Bump libdatadog to v29 * trigger CI * trigger CI * Trigger CI * Trigger CI * Trigger CI * Trigger CI --- .github/workflows/build.yml | 2 + Cargo.lock | 1038 +++++++++++++++++-------------- crates/crashtracker/Cargo.toml | 2 +- rust-toolchain.toml | 2 +- test/crashtracker/test-utils.js | 3 +- test/crashtracker/yarn.lock | 459 +++++++------- yarn.lock | 126 ++-- 7 files changed, 872 insertions(+), 760 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d81bd3e5..cf5eeb90 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,6 +41,8 @@ jobs: min-node-version: 18 rust: true only: darwin-arm64,darwin-x64,linux-arm64,linux-x64 + # Need this, now that libdatadog packages libunwind as a submodule + prebuild: '(command -v apk >/dev/null && apk add autoconf automake libtool) || (command -v apt-get >/dev/null && apt-get update && apt-get install -y autoconf automake libtool) || true' package-size: runs-on: ubuntu-latest diff --git a/Cargo.lock b/Cargo.lock index f95516ae..4ac99816 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,26 +2,17 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli 0.31.1", -] - [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -32,12 +23,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -49,21 +34,38 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.13.1" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" dependencies = [ "aws-lc-sys", "zeroize", @@ -71,75 +73,36 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.29.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" dependencies = [ - "bindgen", "cc", "cmake", "dunce", "fs_extra", ] -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn", - "which", -] - [[package]] name = "bitflags" -version = "2.9.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "blazesym" -version = "0.2.0-rc.5" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95824d1dd4f20b4a4dfa63b72954e81914a718357231468180b30314e85057fa" +checksum = "48ceccc54b9c3e60e5f36b0498908c8c0f87387229cb0e0e5d65a074e00a8ba4" dependencies = [ - "cpp_demangle 0.4.4", - "gimli 0.32.3", + "cpp_demangle", + "gimli", "libc", "memmap2", "miniz_oxide", @@ -157,47 +120,39 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] -name = "byteorder" -version = "1.5.0" +name = "bytes" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] -name = "bytes" -version = "1.10.1" +name = "cast" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.25" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", ] -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -207,33 +162,21 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-link 0.1.1", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", + "windows-link 0.2.1", ] [[package]] name = "cmake" -version = "0.1.54" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" dependencies = [ "cc", ] @@ -283,15 +226,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "cpp_demangle" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" -dependencies = [ - "cfg-if", -] - [[package]] name = "cpp_demangle" version = "0.5.1" @@ -357,9 +291,9 @@ dependencies = [ [[package]] name = "dispatch2" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ "bitflags", "objc2", @@ -373,9 +307,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" @@ -391,12 +325,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.12" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -406,10 +340,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" [[package]] -name = "fnv" -version = "1.0.7" +name = "find-msvc-tools" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "foldhash" @@ -425,9 +359,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -440,9 +374,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -450,15 +384,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -467,15 +401,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -484,21 +418,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -508,40 +442,46 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "r-efi 5.3.0", + "wasip2", ] [[package]] -name = "gimli" -version = "0.31.1" +name = "getrandom" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] [[package]] name = "gimli" @@ -554,17 +494,11 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -572,28 +506,30 @@ dependencies = [ ] [[package]] -name = "hex" -version = "0.4.3" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] -name = "home" -version = "0.5.11" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -628,18 +564,20 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "http", "http-body", "httparse", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -647,9 +585,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.6" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a01595e11bdcec50946522c32dde3fc6914743000a68b93000965f2f02406d" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http", "hyper", @@ -664,13 +602,12 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.13" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -685,9 +622,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -695,7 +632,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core 0.62.2", ] [[package]] @@ -707,73 +644,75 @@ dependencies = [ "cc", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "indexmap" -version = "2.9.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] name = "itertools" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libc", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", ] [[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.180" +version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "libdd-common" -version = "1.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v28.0.1#647c8ff924070d4e79494ec852d312ff0301fd8a" +version = "2.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" dependencies = [ "anyhow", "bytes", @@ -807,16 +746,16 @@ dependencies = [ [[package]] name = "libdd-crashtracker" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v28.0.1#647c8ff924070d4e79494ec852d312ff0301fd8a" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" dependencies = [ "anyhow", - "backtrace", "blazesym", "cc", "chrono", "http", "libc", "libdd-common", + "libdd-libunwind-sys", "libdd-telemetry", "nix 0.29.0", "num-derive", @@ -838,21 +777,31 @@ dependencies = [ [[package]] name = "libdd-ddsketch" -version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v28.0.1#647c8ff924070d4e79494ec852d312ff0301fd8a" +version = "1.0.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" dependencies = [ "prost", ] +[[package]] +name = "libdd-libunwind-sys" +version = "29.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +dependencies = [ + "cc", + "libc", + "paste", +] + [[package]] name = "libdd-telemetry" -version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v28.0.1#647c8ff924070d4e79494ec852d312ff0301fd8a" +version = "3.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" dependencies = [ "anyhow", "base64", "futures", - "hashbrown", + "hashbrown 0.15.5", "http", "http-body-util", "libc", @@ -870,21 +819,27 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.0", + "windows-link 0.2.1", ] +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + [[package]] name = "library-config" version = "0.2.0" dependencies = [ "anyhow", "datadog-library-config", - "getrandom 0.2.16", + "getrandom 0.2.17", "serde", "serde-wasm-bindgen", "wasm-bindgen", @@ -893,36 +848,36 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "log" -version = "0.4.27" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memfd" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ "rustix", ] [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" dependencies = [ "libc", ] @@ -946,17 +901,11 @@ dependencies = [ "walkdir", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "5faa9f23e86bd5768d76def086192ff5f869fb088da12a976ea21e9796b975f6" dependencies = [ "adler2", "simd-adler32", @@ -964,13 +913,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -1060,13 +1009,12 @@ dependencies = [ ] [[package]] -name = "nom" -version = "7.1.3" +name = "nu-ansi-term" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "memchr", - "minimal-lexical", + "windows-sys 0.61.2", ] [[package]] @@ -1087,13 +1035,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -1248,26 +1197,23 @@ dependencies = [ "objc2-foundation", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "os_info" @@ -1303,18 +1249,18 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", @@ -1323,9 +1269,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -1341,9 +1287,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" dependencies = [ "serde", ] @@ -1359,9 +1305,9 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.33" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dee91521343f4c5c6a63edd65e54f31f5c92fe8978c40a4282f8372194c6a7d" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn", @@ -1369,9 +1315,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1411,18 +1357,24 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" @@ -1451,14 +1403,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -1468,9 +1420,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -1479,9 +1431,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "ring" @@ -1491,7 +1443,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -1499,56 +1451,47 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" dependencies = [ - "byteorder", "num-traits", - "paste", ] [[package]] name = "rmp-serde" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "byteorder", "rmp", "serde", ] [[package]] name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "1.1.0" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] name = "rustix" -version = "0.38.44" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "aws-lc-rs", "once_cell", @@ -1561,9 +1504,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -1573,18 +1516,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "aws-lc-rs", "ring", @@ -1594,15 +1537,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -1615,11 +1558,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1648,9 +1591,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.2.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ "bitflags", "core-foundation", @@ -1661,20 +1604,27 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" -version = "1.0.197" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -1689,11 +1639,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1713,14 +1672,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", + "serde_core", + "zmij", ] [[package]] @@ -1744,40 +1704,37 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -1809,7 +1766,7 @@ version = "12.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79b237cfbe320601dd24b4ac817a5b68bb28f5508e33f08d42be0682cadc8ac9" dependencies = [ - "cpp_demangle 0.5.1", + "cpp_demangle", "msvc-demangler", "rustc-demangle", "symbolic-common", @@ -1817,9 +1774,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -1858,25 +1815,24 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.1" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ - "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", @@ -1885,9 +1841,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -1895,9 +1851,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -1914,9 +1870,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", "tracing-core", @@ -1924,9 +1880,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", ] @@ -1939,9 +1895,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" @@ -1969,13 +1925,13 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uuid" -version = "1.17.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.4.2", "js-sys", - "serde", + "serde_core", "wasm-bindgen", ] @@ -2000,52 +1956,49 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen" -version = "0.2.100" +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" +name = "wasm-bindgen" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -2054,9 +2007,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2064,44 +2017,53 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.50" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" +checksum = "6311c867385cc7d5602463b31825d454d0837a3aba7cdb5e56d5201792a3f7fe" dependencies = [ + "async-trait", + "cast", "js-sys", + "libm", "minicov", + "nu-ansi-term", + "num-traits", + "oorandom", + "serde", + "serde_json", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test-macro", + "wasm-bindgen-test-shared", ] [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.50" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" +checksum = "67008cdde4769831958536b0f11b3bdd0380bde882be17fff9c2f34bb4549abd" dependencies = [ "proc-macro2", "quote", @@ -2109,25 +2071,53 @@ dependencies = [ ] [[package]] -name = "web-sys" -version = "0.3.77" +name = "wasm-bindgen-test-shared" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "cfe29135b180b72b04c74aa97b2b4a2ef275161eff9a6c7955ea9eaedc7e1d4e" + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" dependencies = [ - "js-sys", - "wasm-bindgen", + "leb128fmt", + "wasmparser", ] [[package]] -name = "which" -version = "4.4.2" +name = "wasm-metadata" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ - "either", - "home", - "once_cell", - "rustix", + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +dependencies = [ + "js-sys", + "wasm-bindgen", ] [[package]] @@ -2152,7 +2142,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2177,7 +2167,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" dependencies = [ "windows-core 0.59.0", - "windows-targets 0.53.0", + "windows-targets 0.53.5", ] [[package]] @@ -2188,22 +2178,22 @@ checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" dependencies = [ "windows-implement 0.59.0", "windows-interface", - "windows-result", + "windows-result 0.3.4", "windows-strings 0.3.1", - "windows-targets 0.53.0", + "windows-targets 0.53.5", ] [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement 0.60.0", + "windows-implement 0.60.2", "windows-interface", - "windows-link 0.1.1", - "windows-result", - "windows-strings 0.4.2", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -2219,9 +2209,9 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -2230,9 +2220,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -2241,9 +2231,9 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" @@ -2257,41 +2247,41 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link 0.1.1", + "windows-link 0.1.3", ] [[package]] -name = "windows-strings" -version = "0.3.1" +name = "windows-result" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.1.1", + "windows-link 0.2.1", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-link 0.1.1", + "windows-link 0.1.3", ] [[package]] -name = "windows-sys" -version = "0.52.0" +name = "windows-strings" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ "windows-targets 0.52.6", ] @@ -2338,18 +2328,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -2366,9 +2357,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -2384,9 +2375,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -2402,9 +2393,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -2414,9 +2405,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -2432,9 +2423,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -2450,9 +2441,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -2468,9 +2459,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -2486,9 +2477,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winver" @@ -2500,28 +2491,107 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ + "anyhow", "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", ] [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" dependencies = [ "proc-macro2", "quote", @@ -2530,9 +2600,15 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zmij" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zstd" diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index 62877bfb..4eed302f 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v28.0.1" } +libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v29.0.0" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 1c3b513d..f4b35ed3 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.84.1" +channel = "1.85.0" profile = "minimal" components = ["clippy", "rustfmt", "rust-src"] diff --git a/test/crashtracker/test-utils.js b/test/crashtracker/test-utils.js index cc62da45..f708555b 100644 --- a/test/crashtracker/test-utils.js +++ b/test/crashtracker/test-utils.js @@ -17,7 +17,8 @@ function initTestCrashtracker () { timeout_ms: 3000, }, timeout: { secs: 15, nanos: 0 }, - resolve_frames: 'EnabledWithInprocessSymbols', + // In process symbol resolution can crash the CT process itself. + resolve_frames: 'EnabledWithSymbolsInReceiver', wait_for_receiver: true, demangle_names: false, signals: [], diff --git a/test/crashtracker/yarn.lock b/test/crashtracker/yarn.lock index 3579edb4..af309dca 100644 --- a/test/crashtracker/yarn.lock +++ b/test/crashtracker/yarn.lock @@ -4,14 +4,14 @@ "@datadog/segfaultify@^0.1.1": version "0.1.1" - resolved "https://registry.npmjs.org/@datadog/segfaultify/-/segfaultify-0.1.1.tgz" + resolved "https://registry.yarnpkg.com/@datadog/segfaultify/-/segfaultify-0.1.1.tgz#bd12d31ad26c5d15dc1b8c32572ceb37dbb12651" integrity sha512-wYfDBfS9VlsTOF10HkWgu7abTWsoGTFkaHxjiw8V6I2pXbfb+D3KNdjb4H+0jD7vnChs4Jm7Rgetg0j89jrlYw== dependencies: node-gyp-build "^3.9.0" accepts@~1.3.8: version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + 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" @@ -19,462 +19,489 @@ accepts@~1.3.8: array-flatten@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -body-parser@^1.20.3, body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== +body-parser@^1.20.3, body-parser@~1.20.3: + version "1.20.4" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" + integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA== dependencies: - bytes "3.1.2" + bytes "~3.1.2" content-type "~1.0.5" 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.13.0" - raw-body "2.5.2" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.14.0" + raw-body "~2.5.3" type-is "~1.6.18" - unpipe "1.0.0" + unpipe "~1.0.0" -bytes@3.1.2: +bytes@~3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" -content-disposition@0.5.4: +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +content-disposition@~0.5.4: version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + 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, content-type@~1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + 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.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== +cookie@~0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== debug@2.6.9: version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -depd@2.0.0: +depd@2.0.0, depd@~2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -destroy@1.2.0: +destroy@1.2.0, destroy@~1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + ee-first@1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - encodeurl@~2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + escape-html@~1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== etag@~1.8.1: version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== express@^4.19.2: - version "4.21.1" - resolved "https://registry.npmjs.org/express/-/express-4.21.1.tgz" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + version "4.22.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" + integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" + body-parser "~1.20.3" + content-disposition "~0.5.4" content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" + cookie "~0.7.1" + cookie-signature "~1.0.6" debug "2.6.9" depd "2.0.0" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" + finalhandler "~1.3.1" + fresh "~0.5.2" + http-errors "~2.0.0" merge-descriptors "1.0.3" methods "~1.1.2" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.10" + path-to-regexp "~0.1.12" proxy-addr "~2.0.7" - qs "6.13.0" + qs "~6.14.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" + send "~0.19.0" + serve-static "~1.16.2" setprototypeof "1.2.0" - statuses "2.0.1" + statuses "~2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== +finalhandler@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" + integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== dependencies: debug "2.6.9" encodeurl "~2.0.0" escape-html "~1.0.3" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - statuses "2.0.1" + statuses "~2.0.2" unpipe "~1.0.0" forwarded@0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fresh@0.5.2: +fresh@~0.5.2: version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" -gopd@^1.0.1: +get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: - es-define-property "^1.0.0" + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -hasown@^2.0.0: +hasown@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== +http-errors@~2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" -iconv-lite@0.4.24: +iconv-lite@~0.4.24: version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + 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" -inherits@2.0.4: +inherits@~2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ipaddr.js@1.9.1: version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + media-typer@0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== merge-descriptors@1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== methods@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + 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.npmjs.org/mime/-/mime-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== ms@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== negotiator@0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== node-gyp-build@^3.9.0: version "3.9.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== -object-inspect@^1.13.1: - version "1.13.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz" - integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== -on-finished@2.4.1: +on-finished@~2.4.1: version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + 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" parseurl@~1.3.3: version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +path-to-regexp@~0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== proxy-addr@~2.0.7: version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + 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" -qs@6.13.0: - version "6.13.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== +qs@~6.14.0: + version "6.14.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" + integrity sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q== dependencies: - side-channel "^1.0.6" + side-channel "^1.1.0" range-parser@~1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + 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.2: - version "2.5.2" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== +raw-body@~2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" safe-buffer@5.2.1: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -send@0.19.0: - version "0.19.0" - resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== +send@~0.19.0, send@~0.19.1: + version "0.19.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" + integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== dependencies: debug "2.6.9" depd "2.0.0" destroy "1.2.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" + fresh "~0.5.2" + http-errors "~2.0.1" mime "1.6.0" ms "2.1.3" - on-finished "2.4.1" + on-finished "~2.4.1" range-parser "~1.2.1" - statuses "2.0.1" + statuses "~2.0.2" -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== +serve-static@~1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" + integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== dependencies: encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.19.0" + send "~0.19.1" + +setprototypeof@1.2.0, setprototypeof@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - define-data-property "^1.1.4" es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" + object-inspect "^1.13.3" -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: - call-bind "^1.0.7" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +statuses@~2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== -toidentifier@1.0.1: +toidentifier@~1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== type-is@~1.6.18: version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + 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" -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== utils-merge@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== vary@~1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== diff --git a/yarn.lock b/yarn.lock index ae3d5a41..c86291bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,26 +41,26 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== -"@eslint/config-array@^0.23.2": - version "0.23.2" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.2.tgz#db85beeff7facc685a5775caacb1c845669b9470" - integrity sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A== +"@eslint/config-array@^0.23.3": + version "0.23.3" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.3.tgz#3f4a93dd546169c09130cbd10f2415b13a20a219" + integrity sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw== dependencies: - "@eslint/object-schema" "^3.0.2" + "@eslint/object-schema" "^3.0.3" debug "^4.3.1" - minimatch "^10.2.1" + minimatch "^10.2.4" "@eslint/config-helpers@^0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.2.tgz#314c7b03d02a371ad8c0a7f6821d5a8a8437ba9d" - integrity sha512-a5MxrdDXEvqnIq+LisyCX6tQMPF/dSJpCfBgBauY+pNZ28yCtSsTvyTYrMhaI+LK26bVyCJfJkT0u8KIj2i1dQ== + version "0.5.3" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.3.tgz#721fe6bbb90d74b0c80d6ff2428e5bbcb002becb" + integrity sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw== dependencies: - "@eslint/core" "^1.1.0" + "@eslint/core" "^1.1.1" -"@eslint/core@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.1.0.tgz#51f5cd970e216fbdae6721ac84491f57f965836d" - integrity sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw== +"@eslint/core@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.1.1.tgz#450f3d2be2d463ccd51119544092256b4e88df32" + integrity sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ== dependencies: "@types/json-schema" "^7.0.15" @@ -69,17 +69,17 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-10.0.1.tgz#1e8a876f50117af8ab67e47d5ad94d38d6622583" integrity sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA== -"@eslint/object-schema@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.2.tgz#c59c6a94aa4b428ed7f1615b6a4495c0a21f7a22" - integrity sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw== +"@eslint/object-schema@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.3.tgz#5bf671e52e382e4adc47a9906f2699374637db6b" + integrity sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ== -"@eslint/plugin-kit@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.6.0.tgz#e0cb12ec66719cb2211ad36499fb516f2a63899d" - integrity sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ== +"@eslint/plugin-kit@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz#eb9e6689b56ce8bc1855bb33090e63f3fc115e8e" + integrity sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ== dependencies: - "@eslint/core" "^1.1.0" + "@eslint/core" "^1.1.1" levn "^0.4.1" "@humanfs/core@^0.19.1": @@ -114,10 +114,15 @@ "@emnapi/runtime" "^1.4.3" "@tybys/wasm-util" "^0.10.0" +"@package-json/types@^0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@package-json/types/-/types-0.0.12.tgz#4629e833ba128ed9880b6b7a947633ee22952462" + integrity sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw== + "@stylistic/eslint-plugin@^5.9.0": - version "5.9.0" - resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.9.0.tgz#b7d23ac17dd8a1868eb7ac142f3ba6d627516e2a" - integrity sha512-FqqSkvDMYJReydrMhlugc71M76yLLQWNfmGq+SIlLa7N3kHp8Qq8i2PyWrVNAfjOyOIY+xv9XaaYwvVW7vroMA== + version "5.10.0" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz#471bbd9f7a27ceaac4a217e7f5b3890855e5640c" + integrity sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ== dependencies: "@eslint-community/eslint-utils" "^4.9.1" "@typescript-eslint/types" "^8.56.0" @@ -148,10 +153,10 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@typescript-eslint/types@^8.35.0", "@typescript-eslint/types@^8.56.0": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.1.tgz#975e5942bf54895291337c91b9191f6eb0632ab9" - integrity sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw== +"@typescript-eslint/types@^8.56.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.57.0.tgz#4fa5385ffd1cd161fa5b9dce93e0493d491b8dc6" + integrity sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg== "@unrs/resolver-binding-android-arm-eabi@1.11.1": version "1.11.1" @@ -304,9 +309,9 @@ builtin-modules@^5.0.0: integrity sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg== caniuse-lite@^1.0.30001759: - version "1.0.30001776" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz#3c64d006348a2e92037aa4302345129806a42d24" - integrity sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw== + version "1.0.30001777" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz#028f21e4b2718d138b55e692583e6810ccf60691" + integrity sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ== change-case@^5.4.4: version "5.4.4" @@ -411,16 +416,17 @@ eslint-plugin-es-x@^7.8.0: eslint-compat-utils "^0.5.1" eslint-plugin-import-x@^4.12.2: - version "4.16.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz#a96ee1ad5ba6816f9a5573a9617935011a24c4df" - integrity sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ== + version "4.16.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.2.tgz#95d1f798795566712c87897317ef8433d101db29" + integrity sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw== dependencies: - "@typescript-eslint/types" "^8.35.0" + "@package-json/types" "^0.0.12" + "@typescript-eslint/types" "^8.56.0" comment-parser "^1.4.1" debug "^4.4.1" eslint-import-context "^0.1.9" is-glob "^4.0.3" - minimatch "^9.0.3 || ^10.0.1" + minimatch "^9.0.3 || ^10.1.2" semver "^7.7.2" stable-hash-x "^0.2.0" unrs-resolver "^1.9.2" @@ -462,10 +468,10 @@ eslint-plugin-unicorn@^63.0.0: semver "^7.7.3" strip-indent "^4.1.1" -eslint-scope@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.1.tgz#f6a209486e38bd28356b5feb07d445cc99c89967" - integrity sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw== +eslint-scope@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.2.tgz#b9de6ace2fab1cff24d2e58d85b74c8fcea39802" + integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== dependencies: "@types/esrecurse" "^4.3.1" "@types/estree" "^1.0.8" @@ -488,16 +494,16 @@ eslint-visitor-keys@^5.0.1: integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== eslint@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.0.2.tgz#1009263467591810320f2e1ad52b8a750d1acbab" - integrity sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw== + version "10.0.3" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.0.3.tgz#360a7de7f2706eb8a32caa17ca983f0089efe694" + integrity sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.2" - "@eslint/config-array" "^0.23.2" + "@eslint/config-array" "^0.23.3" "@eslint/config-helpers" "^0.5.2" - "@eslint/core" "^1.1.0" - "@eslint/plugin-kit" "^0.6.0" + "@eslint/core" "^1.1.1" + "@eslint/plugin-kit" "^0.6.1" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" @@ -506,7 +512,7 @@ eslint@^10.0.2: cross-spawn "^7.0.6" debug "^4.3.2" escape-string-regexp "^4.0.0" - eslint-scope "^9.1.1" + eslint-scope "^9.1.2" eslint-visitor-keys "^5.0.1" espree "^11.1.1" esquery "^1.7.0" @@ -519,7 +525,7 @@ eslint@^10.0.2: imurmurhash "^0.1.4" is-glob "^4.0.0" json-stable-stringify-without-jsonify "^1.0.1" - minimatch "^10.2.1" + minimatch "^10.2.4" natural-compare "^1.4.0" optionator "^0.9.3" @@ -533,9 +539,9 @@ espree@^10.4.0: eslint-visitor-keys "^4.2.1" espree@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-11.1.1.tgz#866f6bc9ccccd6f28876b7a6463abb281b9cb847" - integrity sha512-AVHPqQoZYc+RUM4/3Ly5udlZY/U4LS8pIG05jEjWM2lQMU/oaZ7qshzAl2YP1tfNmXfftH3ohurfwNAug+MnsQ== + version "11.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-11.2.0.tgz#01d5e47dc332aaba3059008362454a8cc34ccaa5" + integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== dependencies: acorn "^8.16.0" acorn-jsx "^5.3.2" @@ -609,9 +615,9 @@ flat-cache@^4.0.0: keyv "^4.5.4" flatted@^3.2.9: - version "3.3.4" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.4.tgz#0986e681008f0f13f58e18656c47967682db5ff6" - integrity sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA== + version "3.4.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.1.tgz#84ccd9579e76e9cc0d246c11d8be0beb019143e6" + integrity sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ== get-tsconfig@^4.10.1, get-tsconfig@^4.8.1: version "4.13.6" @@ -733,7 +739,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -minimatch@^10.2.1, "minimatch@^9.0.3 || ^10.0.1": +minimatch@^10.2.4, "minimatch@^9.0.3 || ^10.1.2": version "10.2.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== @@ -756,9 +762,9 @@ natural-compare@^1.4.0: integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-releases@^2.0.27: - version "2.0.27" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" - integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== + version "2.0.36" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" + integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== optionator@^0.9.3: version "0.9.4" From 08eb48eaa6bdf92ef401211242a6b7295ca84789 Mon Sep 17 00:00:00 2001 From: Roch Devost Date: Mon, 16 Mar 2026 10:27:44 -0400 Subject: [PATCH 37/68] demangle crashes stack traces (#101) --- test/crashtracker/test-utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/crashtracker/test-utils.js b/test/crashtracker/test-utils.js index f708555b..55e58399 100644 --- a/test/crashtracker/test-utils.js +++ b/test/crashtracker/test-utils.js @@ -20,7 +20,7 @@ function initTestCrashtracker () { // In process symbol resolution can crash the CT process itself. resolve_frames: 'EnabledWithSymbolsInReceiver', wait_for_receiver: true, - demangle_names: false, + demangle_names: true, signals: [], }, { args: [], From 45cefe4080b9f27a0c3083d68c74626631d63805 Mon Sep 17 00:00:00 2001 From: Thomas Hunter II Date: Thu, 19 Mar 2026 11:20:55 -0700 Subject: [PATCH 38/68] feat(process-discovery): add process_tags and container_id to TracerMetadata (#104) --- .github/workflows/build.yml | 2 +- Cargo.lock | 39 ++++++++++++++++++++++++++++- crates/process_discovery/Cargo.toml | 2 +- crates/process_discovery/src/lib.rs | 6 ++++- test/process-discovery.js | 2 ++ 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cf5eeb90..50d6f09e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,7 +33,7 @@ jobs: crate: '${{ matrix.crate }}' build: - uses: Datadog/action-prebuildify/.github/workflows/build.yml@main + uses: Datadog/action-prebuildify/.github/workflows/build.yml@d4e89247e6dd34f485c0f92c12f0cc739c2f8c92 # main @ 2026-03-16, last known working version needs: build-test-wasm with: package-manager: 'yarn' diff --git a/Cargo.lock b/Cargo.lock index 4ac99816..e9bb6934 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -783,6 +783,23 @@ dependencies = [ "prost", ] +[[package]] +name = "libdd-library-config" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +dependencies = [ + "anyhow", + "libdd-trace-protobuf", + "memfd", + "prost", + "rand", + "rmp", + "rmp-serde", + "rustix", + "serde", + "serde_yaml", +] + [[package]] name = "libdd-libunwind-sys" version = "29.0.0" @@ -817,6 +834,16 @@ dependencies = [ "winver", ] +[[package]] +name = "libdd-trace-protobuf" +version = "1.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +dependencies = [ + "prost", + "serde", + "serde_bytes", +] + [[package]] name = "libloading" version = "0.8.9" @@ -1327,7 +1354,7 @@ name = "process-discovery" version = "0.1.0" dependencies = [ "anyhow", - "datadog-library-config", + "libdd-library-config", "napi", "napi-derive", ] @@ -1639,6 +1666,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde_core" version = "1.0.228" diff --git a/crates/process_discovery/Cargo.toml b/crates/process_discovery/Cargo.toml index 1f59cd23..30f94b40 100644 --- a/crates/process_discovery/Cargo.toml +++ b/crates/process_discovery/Cargo.toml @@ -8,7 +8,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" -datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v18.1.0" } +libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v29.0.0" } napi = { version = "2" } napi-derive = { version = "2", default-features = false } diff --git a/crates/process_discovery/src/lib.rs b/crates/process_discovery/src/lib.rs index c5cfac1f..36499592 100644 --- a/crates/process_discovery/src/lib.rs +++ b/crates/process_discovery/src/lib.rs @@ -1,7 +1,7 @@ use napi::{Error, Status}; use napi_derive::napi; -use datadog_library_config::tracer_metadata; +use libdd_library_config::tracer_metadata; #[napi] pub struct NapiAnonymousFileHandle { @@ -19,6 +19,8 @@ pub struct TracerMetadata { pub service_name: Option, pub service_env: Option, pub service_version: Option, + pub process_tags: Option, + pub container_id: Option, } #[napi] @@ -32,6 +34,8 @@ pub fn store_metadata(data: &TracerMetadata) -> napi::Result Date: Mon, 23 Mar 2026 12:51:11 -0700 Subject: [PATCH 39/68] chore(ci): switch prebuildify back to main (#107) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 50d6f09e..cf5eeb90 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,7 +33,7 @@ jobs: crate: '${{ matrix.crate }}' build: - uses: Datadog/action-prebuildify/.github/workflows/build.yml@d4e89247e6dd34f485c0f92c12f0cc739c2f8c92 # main @ 2026-03-16, last known working version + uses: Datadog/action-prebuildify/.github/workflows/build.yml@main needs: build-test-wasm with: package-manager: 'yarn' From ac523ac55ac18f4cbdcc5a7a4f05b624c6c538b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 14:59:56 +0100 Subject: [PATCH 40/68] Bump the gh-actions-packages group across 1 directory with 2 updates (#103) Bumps the gh-actions-packages group with 2 updates in the / directory: [actions/setup-node](https://github.com/actions/setup-node) and [actions/download-artifact](https://github.com/actions/download-artifact). Updates `actions/setup-node` from 6.2.0 to 6.3.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/6044e13b5dc448c55e2357c09f80417699197238...53b83947a5a98c8d113130e565377fae1a50d02f) Updates `actions/download-artifact` from 8.0.0 to 8.0.1 - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: 6.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: gh-actions-packages - dependency-name: actions/download-artifact dependency-version: 8.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gh-actions-packages ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 6 +++--- .github/workflows/release.yml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cf5eeb90..d49c42af 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Setup Node.js - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 - run: yarn install - run: yarn install working-directory: test/crashtracker @@ -52,9 +52,9 @@ jobs: pull-requests: write steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - name: Setup Node.js - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 - run: yarn install - name: Compute module size tree and report uses: qard/heaviest-objects-in-the-universe@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 98ea9a72..9cb1bf41 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,8 +41,8 @@ jobs: pkgjson: ${{ steps.pkg.outputs.json }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: '24' registry-url: 'https://registry.npmjs.org' From d7b1b6b49d419ce0d1e8506ed9d442c3b8158c58 Mon Sep 17 00:00:00 2001 From: Thomas Hunter II Date: Tue, 24 Mar 2026 07:49:26 -0700 Subject: [PATCH 41/68] fix(ci): set explicit path for download-artifact in release workflow (#110) download-artifact v8 no longer extracts artifacts into an artifact-named subdirectory by default, causing the publish job to fail with "cannot access './prebuilds'". Explicitly set name and path to restore the expected behavior. Co-authored-by: Claude Opus 4.6 (1M context) Co-authored-by: Attila Szegedi --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9cb1bf41..c6abf545 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,6 +42,9 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: prebuilds + path: prebuilds - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: '24' From 08acdc17ac7b3581d266ec714fe5b9c700f3d93e Mon Sep 17 00:00:00 2001 From: moezein0 <169095174+moezein0@users.noreply.github.com> Date: Wed, 25 Mar 2026 10:36:31 -0400 Subject: [PATCH 42/68] chore: disable automated dependency updater config [incident-51602] (#115) Signed-off-by: Moe Zein --- .github/{dependabot.yml => dependabot.yml.disabled} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{dependabot.yml => dependabot.yml.disabled} (100%) diff --git a/.github/dependabot.yml b/.github/dependabot.yml.disabled similarity index 100% rename from .github/dependabot.yml rename to .github/dependabot.yml.disabled From 2896b1d7f2d90e141ceab665491657c573af1f19 Mon Sep 17 00:00:00 2001 From: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> Date: Thu, 4 Jun 2026 14:11:31 -0400 Subject: [PATCH 43/68] chore(deps): bump to libdatadog v35 crashtracker (#130) * Bump to libdatadog v35 crashtracker * enable wasm pack bulk memory ops --- Cargo.lock | 71 +++++++++++++++++++++++++------ crates/crashtracker/Cargo.toml | 3 +- crates/crashtracker/src/lib.rs | 15 ++----- crates/datadog-js-zstd/Cargo.toml | 3 ++ crates/library_config/Cargo.toml | 3 ++ rust-toolchain.toml | 2 +- test/crashtracker/index.js | 2 +- test/crashtracker/test-utils.js | 1 + 8 files changed, 73 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e9bb6934..afac19ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -244,6 +244,7 @@ dependencies = [ "napi", "napi-derive", "rustls", + "serde_json", ] [[package]] @@ -710,9 +711,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] -name = "libdd-common" +name = "libdd-capabilities" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" +dependencies = [ + "anyhow", + "bytes", + "http", + "thiserror", +] + +[[package]] +name = "libdd-capabilities-impl" +version = "2.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" +dependencies = [ + "bytes", + "http", + "http-body-util", + "libdd-capabilities", + "libdd-common", + "tokio", +] + +[[package]] +name = "libdd-common" +version = "4.2.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" dependencies = [ "anyhow", "bytes", @@ -746,12 +771,13 @@ dependencies = [ [[package]] name = "libdd-crashtracker" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" dependencies = [ "anyhow", "blazesym", "cc", "chrono", + "errno", "http", "libc", "libdd-common", @@ -778,7 +804,7 @@ dependencies = [ [[package]] name = "libdd-ddsketch" version = "1.0.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" dependencies = [ "prost", ] @@ -802,21 +828,41 @@ dependencies = [ [[package]] name = "libdd-libunwind-sys" -version = "29.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227f0e30af5fbb91d1b3768db7997fdd1ded87c44b371663783c4ff3eb686908" dependencies = [ "cc", "libc", "paste", ] +[[package]] +name = "libdd-shared-runtime" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" +dependencies = [ + "async-trait", + "futures", + "futures-util", + "libdd-capabilities", + "libdd-capabilities-impl", + "libdd-common", + "tokio", + "tokio-util", + "tracing", + "wasm-bindgen-futures", +] + [[package]] name = "libdd-telemetry" -version = "3.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +version = "5.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" dependencies = [ "anyhow", + "async-trait", "base64", + "bytes", "futures", "hashbrown 0.15.5", "http", @@ -824,6 +870,7 @@ dependencies = [ "libc", "libdd-common", "libdd-ddsketch", + "libdd-shared-runtime", "serde", "serde_json", "sys-info", @@ -1238,9 +1285,9 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "openssl-probe" -version = "0.2.1" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "os_info" @@ -1531,9 +1578,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index 4eed302f..f349c08a 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,8 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v29.0.0" } +libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v35.0.0" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } +serde_json = "1" diff --git a/crates/crashtracker/src/lib.rs b/crates/crashtracker/src/lib.rs index 28366af0..eb906969 100644 --- a/crates/crashtracker/src/lib.rs +++ b/crates/crashtracker/src/lib.rs @@ -11,18 +11,9 @@ fn apply_default_signals( config: libdd_crashtracker::CrashtrackerConfiguration, ) -> libdd_crashtracker::CrashtrackerConfiguration { if config.signals().is_empty() { - libdd_crashtracker::CrashtrackerConfiguration::new( - config.additional_files().clone(), - config.create_alt_stack(), - config.use_alt_stack(), - config.endpoint().clone(), - config.resolve_frames(), - vec![], // Empty vec will be replaced with default_signals() in new() in libdatadog - Some(config.timeout()), - config.unix_socket_path().clone(), - config.demangle_names(), - ) - .unwrap() + let mut value = serde_json::to_value(&config).unwrap(); + value["signals"] = serde_json::to_value(libdd_crashtracker::default_signals()).unwrap(); + serde_json::from_value(value).unwrap() } else { config } diff --git a/crates/datadog-js-zstd/Cargo.toml b/crates/datadog-js-zstd/Cargo.toml index 308740fa..6a4a626d 100644 --- a/crates/datadog-js-zstd/Cargo.toml +++ b/crates/datadog-js-zstd/Cargo.toml @@ -11,5 +11,8 @@ wasm-bindgen = "0.2.100" zstd = "0.13.3" js-sys = "0.3.77" +[package.metadata.wasm-pack.profile.release] +wasm-opt = ["-O", "--enable-bulk-memory"] + [dev-dependencies] wasm-bindgen-test = "0.3.50" diff --git a/crates/library_config/Cargo.toml b/crates/library_config/Cargo.toml index a88f20fc..80093eb0 100644 --- a/crates/library_config/Cargo.toml +++ b/crates/library_config/Cargo.toml @@ -14,6 +14,9 @@ wasm-bindgen = "0.2.100" serde = { version = "1.0", features = ["derive"] } serde-wasm-bindgen = "0.4" +[package.metadata.wasm-pack.profile.release] +wasm-opt = ["-O", "--enable-bulk-memory"] + [dev-dependencies] wasm-bindgen-test = "0.3.50" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index f4b35ed3..9b112d47 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.85.0" +channel = "1.87.0" profile = "minimal" components = ["clippy", "rustfmt", "rust-src"] diff --git a/test/crashtracker/index.js b/test/crashtracker/index.js index ac3d1495..9c6c2c00 100644 --- a/test/crashtracker/index.js +++ b/test/crashtracker/index.js @@ -38,7 +38,7 @@ const timeout = setTimeout(() => { let currentTest -app.use(bodyParser.json()) +app.use(bodyParser.json({ limit: '10mb' })) app.post('/telemetry/proxy/api/v2/apmtelemetry', (req, res) => { res.status(200).send() diff --git a/test/crashtracker/test-utils.js b/test/crashtracker/test-utils.js index 55e58399..32d135c0 100644 --- a/test/crashtracker/test-utils.js +++ b/test/crashtracker/test-utils.js @@ -6,6 +6,7 @@ const crashtracker = libdatadog.load('crashtracker') function initTestCrashtracker () { crashtracker.init({ additional_files: [], + collect_all_threads: true, create_alt_stack: true, use_alt_stack: true, endpoint: { From 0c3f048d653bbbabd07c671ed53b242f610bda59 Mon Sep 17 00:00:00 2001 From: moezein0 <169095174+moezein0@users.noreply.github.com> Date: Mon, 22 Jun 2026 09:53:38 -0400 Subject: [PATCH 44/68] chore: re-enable dependabot with 2-day cooldown (#118) Rename .disabled configs back and add cooldown: default-days: 2 Signed-off-by: Moe Zein --- .github/{dependabot.yml.disabled => dependabot.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{dependabot.yml.disabled => dependabot.yml} (100%) diff --git a/.github/dependabot.yml.disabled b/.github/dependabot.yml similarity index 100% rename from .github/dependabot.yml.disabled rename to .github/dependabot.yml From 2453a51db8ca040dff1e3055cb40144e556119cd Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Mon, 22 Jun 2026 16:59:17 +0200 Subject: [PATCH 45/68] process_discovery: expose threadlocal_attribute_keys (#135) Add the optional `threadlocal_attribute_keys: Option>` field to the NAPI `TracerMetadata` and forward it to libdatadog's `tracer_metadata::TracerMetadata`. When set, libdatadog's `to_otel_process_ctx` injects: threadlocal.schema_version = "tlsdesc_v1_dev" threadlocal.attribute_key_map = ["datadog.local_root_span_id", ...threadlocal_attribute_keys] into the OTel process context, giving an out-of-process reader the name table for the uint8 key indices that OTEP-4947 thread-context records carry on the wire. The implicit `datadog.local_root_span_id` key is prepended by libdatadog itself; callers only supply their *additional* keys (entry 0 in this list = wire key index 1). The field is gated behind libdatadog's `otel-thread-ctx` Cargo feature, which arrived after v29.0.0. Bump the `libdd-library-config` dependency to v35.0.0 (matches the version already pinned by the crashtracker crate in this workspace) and enable the feature. Existing 8-arg constructor calls keep working because the new field is optional. The test exercises both the absent and present forms. --- Cargo.lock | 10 +++++----- crates/process_discovery/Cargo.toml | 2 +- crates/process_discovery/src/lib.rs | 11 +++++++++++ test/process-discovery.js | 21 +++++++++++++++++++++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index afac19ee..a8d1c7e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -811,17 +811,17 @@ dependencies = [ [[package]] name = "libdd-library-config" -version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +version = "2.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" dependencies = [ "anyhow", + "libc", "libdd-trace-protobuf", "memfd", "prost", "rand", "rmp", "rmp-serde", - "rustix", "serde", "serde_yaml", ] @@ -883,8 +883,8 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" -version = "1.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v29.0.0#001bd56fcbba34fa4ec3f9798a6c4fbcddeffa40" +version = "3.0.2" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" dependencies = [ "prost", "serde", diff --git a/crates/process_discovery/Cargo.toml b/crates/process_discovery/Cargo.toml index 30f94b40..4aa80ce9 100644 --- a/crates/process_discovery/Cargo.toml +++ b/crates/process_discovery/Cargo.toml @@ -8,7 +8,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" -libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v29.0.0" } +libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v35.0.0", features = ["otel-thread-ctx"] } napi = { version = "2" } napi-derive = { version = "2", default-features = false } diff --git a/crates/process_discovery/src/lib.rs b/crates/process_discovery/src/lib.rs index 36499592..3bf3516c 100644 --- a/crates/process_discovery/src/lib.rs +++ b/crates/process_discovery/src/lib.rs @@ -21,6 +21,16 @@ pub struct TracerMetadata { pub service_version: Option, pub process_tags: Option, pub container_id: Option, + /// Ordered list of attribute key names for thread-level OTEP-4947 + /// context records. Key indices on the wire index into this list. + /// libdatadog's OTel process-context conversion prepends the + /// implicit `datadog.local_root_span_id` entry at wire index 0, so + /// callers should only set their additional keys here — entry 0 in + /// this list corresponds to wire key index 1. + /// + /// `null`/omitted (the default) disables the thread-context-related + /// attributes in the OTel process context entirely. + pub threadlocal_attribute_keys: Option>, } #[napi] @@ -36,6 +46,7 @@ pub fn store_metadata(data: &TracerMetadata) -> napi::Result { for (const fd in fds) { From 333217d72e71629b6b940302e08257ec0c21c66a Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Mon, 22 Jun 2026 17:52:10 +0200 Subject: [PATCH 46/68] fix: release tag push (#137) The release workflow's tag push was rejected by the tag ruleset because actions/checkout persisted GITHUB_TOKEN credentials, which took precedence over the dd-octo-sts token in the explicit push URL. Drop the persisted credentials and downgrade contents permission to read. Also add the dd-octo-sts policy file. --- .../self.github.release.push-tags.sts.yaml | 12 ++++++++++++ .github/workflows/release.yml | 11 +++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 .github/chainguard/self.github.release.push-tags.sts.yaml diff --git a/.github/chainguard/self.github.release.push-tags.sts.yaml b/.github/chainguard/self.github.release.push-tags.sts.yaml new file mode 100644 index 00000000..e8074403 --- /dev/null +++ b/.github/chainguard/self.github.release.push-tags.sts.yaml @@ -0,0 +1,12 @@ +issuer: https://token.actions.githubusercontent.com + +subject: repo:DataDog/libdatadog-nodejs:environment:npm + +claim_pattern: + event_name: push + job_workflow_ref: DataDog/libdatadog-nodejs/\.github/workflows/release\.yml@refs/heads/v[0-9]+\.x + ref: refs/heads/v[0-9]+\.x + repository: DataDog/libdatadog-nodejs + +permissions: + contents: write diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c6abf545..8cfd339d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,11 +36,18 @@ jobs: environment: npm permissions: id-token: write # Required for OIDC - contents: write + contents: read outputs: pkgjson: ${{ steps.pkg.outputs.json }} steps: + - uses: DataDog/dd-octo-sts-action@acaa02eee7e3bb0839e4272dacb37b8f3b58ba80 # v1.0.3 + id: octo-sts + with: + scope: DataDog/libdatadog-nodejs + policy: self.github.release.push-tags - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false # drop GITHUB_TOKEN so the dd-octo-sts token is used for the tag push - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: prebuilds @@ -57,4 +64,4 @@ jobs: echo "json=$content" >> $GITHUB_OUTPUT - run: | git tag v${{ fromJson(steps.pkg.outputs.json).version }} - git push origin v${{ fromJson(steps.pkg.outputs.json).version }} + git push https://x-access-token:${{ steps.octo-sts.outputs.token }}@github.com/${{ github.repository }}.git v${{ fromJson(steps.pkg.outputs.json).version }} From a0629144b61cc701206800d88db5a4408a4d47d8 Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Mon, 22 Jun 2026 21:19:45 +0200 Subject: [PATCH 47/68] chore: enable dependabot for npm and cargo dependencies (#138) * chore: enable dependabot for npm and cargo dependencies * chore: add lockfile and dependabot entry for test/crashtracker --- .github/dependabot.yml | 53 ++ test/crashtracker/package-lock.json | 846 ++++++++++++++++++++++++++++ 2 files changed, 899 insertions(+) create mode 100644 test/crashtracker/package-lock.json diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 985225cc..abe2e959 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,3 +15,56 @@ updates: gh-actions-packages: patterns: - "*" + + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + versioning-strategy: "increase" + labels: + - dependabot + - dependencies + - javascript + - semver-patch + groups: + patch-updates: + update-types: + - "patch" + minor-updates: + update-types: + - "minor" + + - package-ecosystem: "npm" + directory: "/test/crashtracker" + schedule: + interval: "weekly" + versioning-strategy: "increase" + labels: + - dependabot + - dependencies + - javascript + - semver-patch + groups: + patch-updates: + update-types: + - "patch" + minor-updates: + update-types: + - "minor" + + - package-ecosystem: "cargo" + directory: "/" + schedule: + interval: "weekly" + labels: + - dependabot + - dependencies + - rust + - semver-patch + groups: + patch-updates: + update-types: + - "patch" + minor-updates: + update-types: + - "minor" diff --git a/test/crashtracker/package-lock.json b/test/crashtracker/package-lock.json new file mode 100644 index 00000000..e6236c70 --- /dev/null +++ b/test/crashtracker/package-lock.json @@ -0,0 +1,846 @@ +{ + "name": "crashtracker", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@datadog/segfaultify": "^0.1.1", + "body-parser": "^1.20.3", + "express": "^4.19.2" + } + }, + "node_modules/@datadog/segfaultify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@datadog/segfaultify/-/segfaultify-0.1.1.tgz", + "integrity": "sha512-wYfDBfS9VlsTOF10HkWgu7abTWsoGTFkaHxjiw8V6I2pXbfb+D3KNdjb4H+0jD7vnChs4Jm7Rgetg0j89jrlYw==", + "license": "Apache-2.0", + "dependencies": { + "node-gyp-build": "^3.9.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-gyp-build": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz", + "integrity": "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} From 4392a3e9f24c13ae2f3107d5eb22405c2ea6e08e Mon Sep 17 00:00:00 2001 From: Bryan English Date: Wed, 1 Jul 2026 13:37:38 -0400 Subject: [PATCH 48/68] feat: native-spans wasm support (pipeline, capabilities, trace exporter) (#151) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * build: set up cargo workspace and wasm/native build tooling Establish the Rust workspace, pin the toolchain, and add the npm scripts and shell tooling that build the wasm modules and the native (napi) addons and run their test suites. Co-authored-by: Jules Wiriath Co-authored-by: paullegranddc Co-authored-by: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> * feat(capabilities): add wasm capability bundle Implement the portable libdatadog capability traits for the wasm runtime: an HTTP client backed by Node's http.request, a setTimeout-based sleep, and a response-header observer hook. This bundle is the generic parameter the data-pipeline and trace-exporter crates are instantiated with. Co-authored-by: Jules Wiriath Co-authored-by: paullegranddc Co-authored-by: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> * feat(pipeline): add native-spans wasm pipeline Wasm binding over libdatadog's span-id-addressed change buffer: span creation and mutation via a binary op protocol, a deduplicated string table, segment (trace-level) attributes, batched export through prepareChunk/sendPreparedChunk, and optional client-side stats. Co-authored-by: Jules Wiriath Co-authored-by: paullegranddc Co-authored-by: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> * feat(trace-exporter): add wasm TraceExporter binding Expose libdatadog's TraceExporter to JS via wasm-bindgen, pinned to the wasm capability bundle. The exporter is built lazily on first send, since the blocking build path is unavailable on wasm. Includes an integration test that drives it against an in-process mock agent. Co-authored-by: Jules Wiriath Co-authored-by: paullegranddc Co-authored-by: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> * chore: adapt existing crates for toolchain and libdatadog bumps Update library_config, process_discovery, and datadog-js-zstd for the workspace's pinned Rust toolchain and libdatadog dependency versions. Co-authored-by: Jules Wiriath Co-authored-by: paullegranddc Co-authored-by: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> * feat(pipeline): add meta_struct span bindings libdatadog's Span already carries meta_struct (VecMap) and the exporter serializes it, but no JS binding existed, so structured per-span data (AppSec, Code Origin, Dynamic Instrumentation) could not be sent on the native path. There is no change-buffer opcode for meta_struct, so setMetaStruct writes the value directly onto the span via span_mut() after draining the change queue. meta_struct depends on no other queued op, so bypassing the queue ordering is safe \u2014 subsequent ops are applied on the next flush and never touch meta_struct. getMetaStruct mirrors the existing per-span getters for round-trip coverage. * feat(capabilities): support unix socket and named-pipe agent transport The wasm HTTP transport only spoke http/https to a host:port, so a `unix://` or `windows:` agent URL could not be reached: request() treated the hex-encoded socket path (ddcommon's parse_uri stores it in the URI authority) as a TCP host. Detect the unix/windows scheme in request(), hex-decode the socket path from the authority, and pass it to the JS transport, which now uses Node's { socketPath } (covering Windows named pipes too). TCP requests are unchanged; socket requests send a localhost Host header with no port. Adds a unix-socket case to the transport tests. * feat(pipeline): add span_events bindings Add `addSpanEvent` to append OpenTelemetry-style span events onto the top-level v0.4 `span_events` field that libdatadog already serializes. Like meta_struct there is no change-buffer opcode, so the event is appended directly to the span after draining the queue (span_events do not depend on any other queued op, so bypassing queue ordering is safe). Attributes arrive as a flat little-endian buffer with per-value type tags (String=0, Boolean=1, Integer=2, Double=3, Array=4) matching libdatadog's AttributeArrayValue discriminants; every read is bounded against the buffer so a malformed/truncated buffer errors instead of panicking. A `getSpanEventsJson` helper serializes events via the same serde impl used for the msgpack wire format, exercised by new round-trip tests covering each scalar type, arrays, and bounds. * feat(pipeline): add v0.5 output format selection Add setUseV05() to WasmSpanState so the single trace exporter can emit the v0.5 wire format (/v0.5/traces) instead of the default v0.4. The flag is read once, at the lazy exporter build on first send, then fixed; callers must set it before the first flush. v0.5 uses a fixed 12-field schema with no slots for meta_struct, span_events, or span_links, so libdatadog's v0.5 serializer silently drops them. This mirrors dd-trace-js master's v0.5 encoder and is intentional \u2014 there is no guard and no dual exporter. libdatadog does not downgrade V05 (unlike V1), so the caller (dd-trace-js) is responsible for only enabling this after the agent advertises /v0.5/traces via /info. * chore: remove unused trace_exporter crate The pipeline crate's WasmSpanState builds its own internal TraceExporter and owns serialization + send (sendPreparedChunk), superseding the standalone trace_exporter binding (JsTraceExporter, the earlier pre-encoded-v0.4-bytes path). Nothing consumes it: dd-trace-js (native-spans and master) loads only the pipeline crate, and no other tracked code references it. Drop the crate, its wasm test, and the build/test wiring. * build: restore wasm-pack install in build-wasm The branch's build-wasm dropped the leading `yarn -s install-wasm-pack` that main still runs, so a clean checkout without wasm-pack on PATH fails with `wasm-pack: not found` before building any module. Restore it. * fix(pipeline): keep stats collector available during in-flight flush flushStats() took the StatsCollector out of its RefCell for the whole async send, so a prepareChunk() during that await saw None and skipped add_spans — permanently dropping those successfully-sent spans from client-side stats. Split StatsCollector::flush into a synchronous prepare_request (drain + encode under a brief borrow) and an async send_request (no borrow). flushStats now builds the request, releases the collector, then awaits the send, so concurrent add_spans is counted. * refactor(capabilities): track libdatadog main and use a capability bundle struct Bump the libdatadog branch=main git deps from the older pinned commit (4b79b7ed) to the current main HEAD (a38b6304). Current main requires the capability generic to implement LogWriterCapability in addition to HttpClientCapability and SleepCapability. Replace the `WasmCapabilities = DefaultHttpClient` type alias with a proper bundle struct that mirrors libdatadog's native `NativeCapabilities { http, sleep }`: - rename `DefaultHttpClient` to `WasmHttpClient` (HTTP only) and move the sleep impl into its own `WasmSleepCapability` (new `sleep` module), matching libdatadog's `NativeHttpClient` / `NativeSleepCapability` split. - `WasmCapabilities` now delegates HTTP and sleep to those fields and implements `LogWriterCapability` as a no-op, since the wasm binding only runs in trace-export mode. Also pass the new `override_max_entries_per_bucket` argument (None = default) to `SpanConcentrator::new`, which gained a parameter on main. * feat(pipeline): add OTLP trace export config to the wasm binding libdatadog's TraceExporter can export traces over OTLP HTTP (JSON or protobuf) instead of to the Datadog agent, mapping its internal traces to OTLP directly. Expose that on WasmSpanState so dd-trace-js can honour OTEL_TRACES_EXPORTER=otlp without resurrecting a JS-side OTLP exporter. - setOtlpEndpoint(url): route export to an OTLP HTTP endpoint (e.g. an OTel Collector) instead of the agent. - setOtlpProtocol('http/json'|'http/protobuf'): select the wire format; rejects unsupported values (grpc) at the parse boundary. - setOtlpHeaders([k, v, ...]): extra headers (e.g. collector auth). All three apply at lazy build time and only when an OTLP endpoint is set. * test(pipeline): strengthen OTLP coverage and document header pairing Address review-until-green feedback on the OTLP binding: - Pin the default wire protocol: the endpoint-only OTLP test now asserts the request content-type is JSON (the http/json default) instead of accepting either json or protobuf. - Cover multi-header export and the odd-length trailing-drop in one test (two header pairs plus a stray unpaired element; assert both pairs arrive). - Document that setOtlpHeaders ignores a trailing unpaired element, replaces prior headers, and that setOtlpEndpoint takes precedence over setUseV05. * ci: build/test the pipeline wasm crate and fix test-suite lint The pipeline crate is wasm-only, but it was missing from the build-test-wasm matrix, so its wasm module was never built in CI (nor shipped in releases), and the native action-prebuildify test matrix crashed on `require('..').maybeLoad('pipeline')` returning undefined. - Add `pipeline` to the build-test-wasm matrix in build.yml and release.yml, and make the composite action's test step crate-aware: pipeline runs its top-level node:test suites with --test-force-exit, other crates keep using test-wasm.js. This builds + tests the pipeline wasm in CI and includes it in release prebuilds. - test/pipeline.js now skips its suite when the wasm binding is unavailable (the native test matrix) instead of throwing on the destructure. - eslint: add test-file overrides (the node:test runner, the snake_case http_transport.js name that must match the Rust wasm_bindgen module path, null inputs in the wasm test harness, and describe-scoped test helpers) and mechanical cleanups so `eslint .` passes across the new test files + shim. - Cargo.lock: canonicalize the dual-source libdd-trace-protobuf entry left inconsistent by the earlier rebase merge (no dependency changes). * fix(capabilities): unref the wasm transport sleep timer so the host can exit The wasm exporter races a sleep(timeout) against each HTTP request as a timeout guard (and reuses it for retry backoff). On a fast success the timer is abandoned but, being reffed, kept the Node process alive for up to the request timeout (5 minutes) after the last flush. unref the timer: an in-flight request refs the event loop on its own, so an abandoned/standalone timeout timer must not block process exit. This also fixes the Node 18 CI test jobs: scripts/test.sh now probes for --test-force-exit (Node >= 20.14/22) and runs without it on Node 18, which rejects the flag as unknown. With the unref above, node:test exits cleanly on Node 18 regardless. * ci: skip pipeline.js on Node 18 in the native test matrix Node 18 lacks --test-force-exit (the wasm exporter keeps the event loop alive after a flush) and the wasm HTTP client leaves a mock-agent socket open that node:test cannot drain there, so test/pipeline.js cannot exit cleanly on Node 18. Skip it on a Node without --test-force-exit. The pipeline wasm is fully covered by the build-test-wasm job and the Node 20/22/24/26 runs here, so this loses no real coverage (it is platform/Node-independent wasm). * fix(pipeline): harden buffer reads, build-error handling, and panics Address review feedback on the wasm binding: - get_num now bounds-checks internally and returns Option, so a truncated or malformed buffer yields a clean error at the call site instead of a panic (the check no longer relies on every call site). All five callers propagate it. - Latch a failed lazy build_async: building is one-shot and a build failure is fatal (bad config), so once it fails every send returns a distinguishable NativeExporterBuildError (a tagged JS Error) instead of a misleading 'exporter builder already consumed' string, letting the host stop retrying. - Avoid panicking unwrap()s: the response builder's headers_mut() (which could panic on an out-of-range agent status) is handled gracefully; the provably-safe unwraps (Vec::as_mut_ptr, Reflect::set on a fresh object) become documented expects. * chore(deps): pin libdatadog to the v37.0.0 release instead of branch=main v37.0.0 includes everything the wasm pipeline needs \u2014 the libdd-capabilities crate (with LogWriterCapability), the change-buffer feature, the capability-bundle TraceExporter, and the OTLP builder methods \u2014 so pin the released tag instead of tracking a moving main branch. This makes the build reproducible and is a prerequisite for publishing the npm package. SpanConcentrator::new gained a 5th argument (override_max_entries_per_bucket) on a later main commit that is not in v37.0.0; drop it and use the 4-arg form (we were passing its default, so behavior is unchanged). * chore(pipeline): address review \u2014 release profile, unused deps/methods, docs Address szegedi's review on the wasm binding: - Restore the release profile to strip=true and drop debug=true (a debugging leftover; matters for the published package size, and matches main). With stripping restored, pass --all-features to wasm-opt for the pipeline crate ([package.metadata.wasm-pack]): its post-MVP features (bulk-memory for the change-buffer copies, sign-extension, etc.) otherwise trip wasm-pack's bundled wasm-opt validation (the smaller wasm crates don't hit this). - Remove the unused @napi-rs/cli runtime dependency \u2014 nothing invokes it and main builds the native prebuilds without it. - Remove the unused StatsCollector::flush and set_agent_url methods (dead since flush was split into prepare_request/send_request); clears the dead_code warning. - Fix the prepareChunk error message (was mislabeled sendPreparedChunk) and the parse_response_headers doc (it takes a flat [name, value, ...] array, not an object). - Document why the WASM_MEMORY LazyLock is Sync (wasm32-only). --------- Co-authored-by: Jules Wiriath Co-authored-by: paullegranddc Co-authored-by: Gyuheon Oh <102937919+gyuheon0h@users.noreply.github.com> --- .github/actions/build-test-wasm/action.yaml | 10 +- .github/workflows/build.yml | 1 + .github/workflows/release.yml | 1 + Cargo.lock | 718 ++++++++++--- Cargo.toml | 3 +- crates/capabilities/Cargo.toml | 21 + crates/capabilities/src/http.rs | 257 +++++ crates/capabilities/src/http_transport.js | 116 +++ crates/capabilities/src/lib.rs | 91 ++ crates/capabilities/src/sleep.rs | 43 + crates/datadog-js-zstd/src/lib.rs | 7 +- crates/library_config/Cargo.toml | 2 +- crates/library_config/src/lib.rs | 22 +- crates/pipeline/Cargo.toml | 40 + crates/pipeline/src/lib.rs | 878 ++++++++++++++++ crates/pipeline/src/span_bytes.rs | 25 + crates/pipeline/src/span_string.rs | 46 + crates/pipeline/src/stats.rs | 153 +++ crates/pipeline/src/trace_data.rs | 16 + crates/pipeline/src/utils.rs | 44 + eslint.config.js | 21 + package.json | 2 +- rust-toolchain.toml | 2 +- scripts/test.sh | 29 +- test/http_transport.js | 173 +++ test/pipeline.js | 1039 ++++++++++++++++++- yarn.lock | 695 +++++++++++++ 27 files changed, 4298 insertions(+), 157 deletions(-) create mode 100644 crates/capabilities/Cargo.toml create mode 100644 crates/capabilities/src/http.rs create mode 100644 crates/capabilities/src/http_transport.js create mode 100644 crates/capabilities/src/lib.rs create mode 100644 crates/capabilities/src/sleep.rs create mode 100644 crates/pipeline/Cargo.toml create mode 100644 crates/pipeline/src/lib.rs create mode 100644 crates/pipeline/src/span_bytes.rs create mode 100644 crates/pipeline/src/span_string.rs create mode 100644 crates/pipeline/src/stats.rs create mode 100644 crates/pipeline/src/trace_data.rs create mode 100644 crates/pipeline/src/utils.rs create mode 100644 test/http_transport.js diff --git a/.github/actions/build-test-wasm/action.yaml b/.github/actions/build-test-wasm/action.yaml index c8cabfe8..0e1df366 100644 --- a/.github/actions/build-test-wasm/action.yaml +++ b/.github/actions/build-test-wasm/action.yaml @@ -22,7 +22,15 @@ runs: wasm-pack build --target nodejs ./crates/${{ inputs.crate }} --out-dir ../../prebuilds/${{ inputs.crate }} shell: bash - name: Test WASM - run: node test-wasm.js ${{ inputs.crate }} + # The pipeline crate's tests are top-level node:test suites that need + # --test-force-exit (the wasm exporter keeps the event loop alive after + # a flush); the other wasm crates use plain test/wasm// scripts. + run: | + if [ "${{ inputs.crate }}" = "pipeline" ]; then + node --test --test-force-exit test/pipeline.js + else + node test-wasm.js ${{ inputs.crate }} + fi shell: bash - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d49c42af..52dc405c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,6 +25,7 @@ jobs: crate: - library_config - datadog-js-zstd + - pipeline steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: 'Use composite action' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8cfd339d..256da64b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,7 @@ jobs: crate: - library_config - datadog-js-zstd + - pipeline steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: 'Use composite action' diff --git a/Cargo.lock b/Cargo.lock index a8d1c7e3..5c0007bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,6 +38,15 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "arc-swap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +dependencies = [ + "rustversion", +] + [[package]] name = "async-trait" version = "0.1.89" @@ -63,9 +72,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.1" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" +checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" dependencies = [ "aws-lc-sys", "zeroize", @@ -73,9 +82,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.38.0" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" +checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" dependencies = [ "cc", "cmake", @@ -91,9 +100,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "blazesym" @@ -101,7 +110,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48ceccc54b9c3e60e5f36b0498908c8c0f87387229cb0e0e5d65a074e00a8ba4" dependencies = [ - "cpp_demangle", + "cpp_demangle 0.5.1", "gimli", "libc", "memmap2", @@ -109,6 +118,15 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "block2" version = "0.6.2" @@ -118,6 +136,12 @@ dependencies = [ "objc2", ] +[[package]] +name = "borrow-or-share" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" + [[package]] name = "bumpalo" version = "3.20.2" @@ -130,6 +154,15 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +[[package]] +name = "cadence" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca08f6db9f0c963249cf23a27820f9d973d2acaad4d6bfaeb858b58ebd58a6a" +dependencies = [ + "crossbeam-channel", +] + [[package]] name = "cast" version = "0.3.0" @@ -138,9 +171,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.56" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -174,20 +207,31 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] +[[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", + "wasm-bindgen", +] + [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -226,6 +270,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cpp_demangle" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2bb79cb74d735044c972aae58ed0aaa9a837e85b01106a54c39e42e97f62253" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpp_demangle" version = "0.5.1" @@ -235,6 +288,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crashtracker" version = "0.2.0" @@ -247,6 +309,31 @@ dependencies = [ "serde_json", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "ctor" version = "0.2.9" @@ -267,20 +354,6 @@ dependencies = [ "zstd", ] -[[package]] -name = "datadog-library-config" -version = "0.0.2" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v18.1.0#5fdc3357f0070d5ad11dcaf89014b7479d32104f" -dependencies = [ - "anyhow", - "memfd", - "rand", - "rmp", - "rmp-serde", - "serde", - "serde_yaml", -] - [[package]] name = "debugid" version = "0.8.0" @@ -290,6 +363,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dispatch2" version = "0.3.1" @@ -346,6 +429,17 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "fluent-uri" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc74ac4d8359ae70623506d512209619e5cf8f347124910440dbc221714b328e" +dependencies = [ + "borrow-or-share", + "ref-cast", + "serde", +] + [[package]] name = "foldhash" version = "0.1.5" @@ -446,6 +540,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -508,9 +612,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "heck" @@ -565,9 +669,9 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -578,7 +682,6 @@ dependencies = [ "httparse", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -586,16 +689,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "rustls", "rustls-native-certs", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -653,12 +755,12 @@ checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -674,9 +776,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jobserver" @@ -690,14 +792,31 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "leb128fmt" version = "0.1.0" @@ -706,9 +825,24 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libdatadog-nodejs-capabilities" +version = "0.1.0" +dependencies = [ + "anyhow", + "bytes", + "futures-core", + "http", + "js-sys", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", +] [[package]] name = "libdd-capabilities" @@ -721,6 +855,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "libdd-capabilities" +version = "2.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "anyhow", + "bytes", + "http", + "thiserror", +] + [[package]] name = "libdd-capabilities-impl" version = "2.0.0" @@ -729,8 +874,21 @@ dependencies = [ "bytes", "http", "http-body-util", - "libdd-capabilities", - "libdd-common", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", + "libdd-common 4.2.0", + "tokio", +] + +[[package]] +name = "libdd-capabilities-impl" +version = "2.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "bytes", + "http", + "http-body-util", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-common 5.0.0", "tokio", ] @@ -768,6 +926,36 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "libdd-common" +version = "5.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "anyhow", + "bytes", + "cc", + "const_format", + "futures", + "futures-core", + "futures-util", + "hex", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "libc", + "nix 0.29.0", + "pin-project", + "regex", + "serde", + "static_assertions", + "thiserror", + "tokio", + "tower-service", + "windows-sys 0.52.0", +] + [[package]] name = "libdd-crashtracker" version = "1.0.0" @@ -780,7 +968,7 @@ dependencies = [ "errno", "http", "libc", - "libdd-common", + "libdd-common 4.2.0", "libdd-libunwind-sys", "libdd-telemetry", "nix 0.29.0", @@ -801,6 +989,40 @@ dependencies = [ "windows 0.59.0", ] +[[package]] +name = "libdd-data-pipeline" +version = "6.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "anyhow", + "arc-swap", + "async-trait", + "bytes", + "either", + "getrandom 0.2.17", + "http", + "http-body-util", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-common 5.0.0", + "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-dogstatsd-client", + "libdd-shared-runtime 1.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-tinybytes", + "libdd-trace-normalization", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-stats", + "libdd-trace-utils", + "rmp-serde", + "serde", + "serde_json", + "sha2", + "tokio", + "tokio-util", + "tracing", + "uuid", +] + [[package]] name = "libdd-ddsketch" version = "1.0.1" @@ -809,6 +1031,41 @@ dependencies = [ "prost", ] +[[package]] +name = "libdd-ddsketch" +version = "1.0.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "prost", +] + +[[package]] +name = "libdd-dogstatsd-client" +version = "3.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "anyhow", + "cadence", + "http", + "libdd-common 5.0.0", + "serde", + "tracing", +] + +[[package]] +name = "libdd-library-config" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=353134770b312b7ccd2df6afabc253090b948e5f#353134770b312b7ccd2df6afabc253090b948e5f" +dependencies = [ + "anyhow", + "memfd", + "rand", + "rmp", + "rmp-serde", + "serde", + "serde_yaml", +] + [[package]] name = "libdd-library-config" version = "2.0.0" @@ -816,7 +1073,7 @@ source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba21 dependencies = [ "anyhow", "libc", - "libdd-trace-protobuf", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", "memfd", "prost", "rand", @@ -845,9 +1102,26 @@ dependencies = [ "async-trait", "futures", "futures-util", - "libdd-capabilities", - "libdd-capabilities-impl", - "libdd-common", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", + "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", + "libdd-common 4.2.0", + "tokio", + "tokio-util", + "tracing", + "wasm-bindgen-futures", +] + +[[package]] +name = "libdd-shared-runtime" +version = "1.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "async-trait", + "futures", + "futures-util", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-common 5.0.0", "tokio", "tokio-util", "tracing", @@ -868,9 +1142,9 @@ dependencies = [ "http", "http-body-util", "libc", - "libdd-common", - "libdd-ddsketch", - "libdd-shared-runtime", + "libdd-common 4.2.0", + "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", + "libdd-shared-runtime 1.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", "serde", "serde_json", "sys-info", @@ -881,6 +1155,39 @@ dependencies = [ "winver", ] +[[package]] +name = "libdd-tinybytes" +version = "1.1.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "serde", +] + +[[package]] +name = "libdd-trace-normalization" +version = "2.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "anyhow", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", +] + +[[package]] +name = "libdd-trace-obfuscation" +version = "4.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "anyhow", + "fluent-uri", + "libdd-common 5.0.0", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-utils", + "log", + "percent-encoding", + "serde", + "serde_json", +] + [[package]] name = "libdd-trace-protobuf" version = "3.0.2" @@ -891,6 +1198,75 @@ dependencies = [ "serde_bytes", ] +[[package]] +name = "libdd-trace-protobuf" +version = "3.0.2" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "prost", + "serde", + "serde_bytes", +] + +[[package]] +name = "libdd-trace-stats" +version = "5.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "anyhow", + "arc-swap", + "async-trait", + "hashbrown 0.15.5", + "http", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-common 5.0.0", + "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-shared-runtime 1.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-obfuscation", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-utils", + "rmp-serde", + "serde", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "libdd-trace-utils" +version = "8.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +dependencies = [ + "anyhow", + "base64", + "bytes", + "futures", + "getrandom 0.2.17", + "hex", + "http", + "http-body", + "http-body-util", + "indexmap", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-common 5.0.0", + "libdd-tinybytes", + "libdd-trace-normalization", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "prost", + "rand", + "rmp", + "rmp-serde", + "rmpv", + "rustc-hash", + "serde", + "serde_json", + "thin-vec", + "tokio", + "tracing", +] + [[package]] name = "libloading" version = "0.8.9" @@ -912,8 +1288,8 @@ name = "library-config" version = "0.2.0" dependencies = [ "anyhow", - "datadog-library-config", "getrandom 0.2.17", + "libdd-library-config 1.0.0", "serde", "serde-wasm-bindgen", "wasm-bindgen", @@ -977,9 +1353,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5faa9f23e86bd5768d76def086192ff5f869fb088da12a976ea21e9796b975f6" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" dependencies = [ "adler2", "simd-adler32", @@ -987,9 +1363,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -1273,9 +1649,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "oorandom" @@ -1321,6 +1697,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + [[package]] name = "pin-project" version = "1.1.11" @@ -1348,16 +1730,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "pin-utils" +name = "pipeline" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +dependencies = [ + "bytes", + "console_error_panic_hook", + "getrandom 0.2.17", + "http", + "js-sys", + "libdatadog-nodejs-capabilities", + "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-data-pipeline", + "libdd-shared-runtime 1.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-stats", + "libdd-trace-utils", + "rmp-serde", + "serde", + "serde_json", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test", +] [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "portable-atomic" @@ -1401,7 +1802,7 @@ name = "process-discovery" version = "0.1.0" dependencies = [ "anyhow", - "libdd-library-config", + "libdd-library-config 2.0.0", "napi", "napi-derive", ] @@ -1452,9 +1853,9 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha", @@ -1480,6 +1881,26 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "regex" version = "1.12.3" @@ -1542,12 +1963,27 @@ dependencies = [ "serde", ] +[[package]] +name = "rmpv" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a4e1d4b9b938a26d2996af33229f0ca0956c652c1375067f0b45291c1df8417" +dependencies = [ + "rmp", +] + [[package]] name = "rustc-demangle" version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + [[package]] name = "rustix" version = "1.1.4" @@ -1563,9 +1999,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "aws-lc-rs", "once_cell", @@ -1590,18 +2026,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -1688,9 +2124,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -1760,6 +2196,7 @@ version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ + "indexmap", "itoa", "memchr", "serde", @@ -1780,6 +2217,17 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1788,9 +2236,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "slab" @@ -1834,9 +2282,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "symbolic-common" -version = "12.17.2" +version = "12.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "751a2823d606b5d0a7616499e4130a516ebd01a44f39811be2b9600936509c23" +checksum = "332615d90111d8eeaf86a84dc9bbe9f65d0d8c5cf11b4caccedc37754eb0dcfd" dependencies = [ "debugid", "memmap2", @@ -1846,11 +2294,11 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.17.2" +version = "12.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b237cfbe320601dd24b4ac817a5b68bb28f5508e33f08d42be0682cadc8ac9" +checksum = "912017718eb4d21930546245af9a3475c9dccf15675a5c215664e76621afc471" dependencies = [ - "cpp_demangle", + "cpp_demangle 0.4.5", "msvc-demangler", "rustc-demangle", "symbolic-common", @@ -1877,6 +2325,12 @@ dependencies = [ "libc", ] +[[package]] +name = "thin-vec" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482" + [[package]] name = "thiserror" version = "1.0.69" @@ -1899,9 +2353,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.50.0" +version = "1.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" dependencies = [ "bytes", "libc", @@ -1914,9 +2368,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -1977,6 +2431,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -1985,9 +2445,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-xid" @@ -2009,9 +2469,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -2019,6 +2479,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "walkdir" version = "2.5.0" @@ -2046,11 +2512,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -2059,14 +2525,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" dependencies = [ "cfg-if", "once_cell", @@ -2077,23 +2543,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2101,9 +2563,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" dependencies = [ "bumpalo", "proc-macro2", @@ -2114,18 +2576,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.64" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6311c867385cc7d5602463b31825d454d0837a3aba7cdb5e56d5201792a3f7fe" +checksum = "29826f9d9ecaa314c480d376b276d1c790e6cb6a4681fab8532da69cbabf977d" dependencies = [ "async-trait", "cast", @@ -2145,9 +2607,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.64" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67008cdde4769831958536b0f11b3bdd0380bde882be17fff9c2f34bb4549abd" +checksum = "c610311887f9e6599a546d278d12d69dfd3a3e92639b2129e4b11ad6cf1961d6" dependencies = [ "proc-macro2", "quote", @@ -2156,9 +2618,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-shared" -version = "0.2.114" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe29135b180b72b04c74aa97b2b4a2ef275161eff9a6c7955ea9eaedc7e1d4e" +checksum = "60238e5b4b1b295701d6f9a66d2a126fe19990348f5fb9dae3b623a370119d94" [[package]] name = "wasm-encoder" @@ -2194,16 +2656,6 @@ dependencies = [ "semver", ] -[[package]] -name = "web-sys" -version = "0.3.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "winapi" version = "0.3.9" @@ -2583,6 +3035,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -2664,18 +3122,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 45083635..41a1142c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" default-members = [ "crates/crashtracker", "crates/process_discovery", @@ -13,5 +14,3 @@ lto = true opt-level = "z" panic = "abort" strip = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/capabilities/Cargo.toml b/crates/capabilities/Cargo.toml new file mode 100644 index 00000000..888f5666 --- /dev/null +++ b/crates/capabilities/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "libdatadog-nodejs-capabilities" +version = "0.1.0" +edition = "2021" +description = "Wasm capability implementations for libdatadog-nodejs (backed by JS transports)" + +[lib] +crate-type = ["rlib"] + +[dependencies] +wasm-bindgen = "0.2" +wasm-bindgen-futures = "0.4" +js-sys = "0.3" +http = "1" +bytes = "1.4" +futures-core = "0.3" +anyhow = "1" +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0" } + +[dev-dependencies] +wasm-bindgen-test = "0.3" diff --git a/crates/capabilities/src/http.rs b/crates/capabilities/src/http.rs new file mode 100644 index 00000000..9f3abb5a --- /dev/null +++ b/crates/capabilities/src/http.rs @@ -0,0 +1,257 @@ +// Copyright 2026-Present Datadog, Inc. https://www.datadoghq.com/ +// SPDX-License-Identifier: Apache-2.0 + +//! Wasm implementation of [`HttpClientCapability`] backed by Node.js `http.request`. +//! +//! The JS transport is imported via `wasm_bindgen(module = ...)` from +//! `http_transport.js`, which ships alongside the wasm output. + +use std::future::Future; +use std::io::Write as _; +use std::sync::LazyLock; + +use bytes::Bytes; +use http::{HeaderMap, HeaderName, HeaderValue}; +use js_sys::{self, Array, JsString, Number, Uint8Array}; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::JsFuture; + +use libdd_capabilities::http::{HttpClientCapability, HttpError}; +use libdd_capabilities::maybe_send::MaybeSend; + +// A `static` requires `Sync`, and `LazyLock: Sync` needs `JsValue: +// Sync` — which holds only because on wasm32 (single-threaded) wasm-bindgen +// implements `Send`/`Sync` for `JsValue`. This crate is wasm32-only, so it's sound. +static WASM_MEMORY: LazyLock = LazyLock::new(wasm_bindgen::memory); + +#[wasm_bindgen(module = "/src/http_transport.js")] +extern "C" { + #[wasm_bindgen(js_name = "httpRequest")] + fn http_request( + host: &str, + port: u16, + is_https: bool, + socket_path: &str, + head_ptr: *const u8, + head_len: u32, + body_ptr: *const u8, + body_len: u32, + wasm_memory: &JsValue, + ) -> js_sys::Promise; + + #[wasm_bindgen(js_name = "setStorage")] + pub fn set_storage(new_storage: &JsValue); + + #[wasm_bindgen(js_name = "setResponseHeaderObserver")] + pub fn set_response_header_observer(observer: &JsValue); +} + +/// Wasm [`HttpClientCapability`] that delegates HTTP to Node.js `http.request`. +/// +/// The wasm analogue of libdatadog's native `NativeHttpClient`. Bundled into +/// [`crate::WasmCapabilities`] alongside the sleep and log-output capabilities +/// that `TraceExporter` requires. +#[derive(Debug, Clone)] +pub struct WasmHttpClient; + +impl HttpClientCapability for WasmHttpClient { + fn new_client() -> Self { + Self + } + + #[allow(clippy::manual_async_fn)] + fn request( + &self, + req: http::Request, + ) -> impl Future, HttpError>> + MaybeSend { + async move { + let scheme = req.uri().scheme_str().unwrap_or("http"); + + // Unix domain socket / Windows named pipe: ddcommon's `parse_uri` + // hex-encodes the socket path into the URI authority (there is no + // standard URL form for socket paths). On wasm the request bypasses + // ddcommon's native (hyper) connector and reaches us directly, so we + // decode the path here and route over the socket instead of TCP. + let (host, port, is_https, socket_path) = if scheme == "unix" || scheme == "windows" { + (String::new(), 0u16, false, decode_socket_path(req.uri())?) + } else { + let is_https = scheme == "https"; + let host = req.uri().host().ok_or_else(|| { + HttpError::InvalidRequest(anyhow::anyhow!("missing host in URI")) + })?; + let port = req + .uri() + .port_u16() + .unwrap_or(if is_https { 443 } else { 80 }); + (host.to_owned(), port, is_https, String::new()) + }; + + // For a socket request there is no meaningful network host; HTTP/1.1 + // still requires a Host header, so send a stable placeholder (the + // agent does not validate Host over a socket). + let head = if socket_path.is_empty() { + serialize_request_head(&req, &host, port, is_https, false)? + } else { + serialize_request_head(&req, "localhost", port, is_https, true)? + }; + let body = req.into_body(); + + let result = JsFuture::from(http_request( + &host, + port, + is_https, + &socket_path, + head.as_ptr(), + head.len() as u32, + body.as_ptr(), + body.len() as u32, + WASM_MEMORY.as_ref(), + )) + .await + .map_err(|e| HttpError::Network(anyhow::anyhow!("{:?}", e)))?; + + let result: js_sys::ArrayTuple<(Number, Array, Uint8Array)> = + js_sys::ArrayTuple::unchecked_from_js(result); + + let status = result + .get0() + .as_f64() + .ok_or_else(|| HttpError::Other(anyhow::anyhow!("status is not a number")))? + as u16; + + let headers = parse_response_headers(result.get1())?; + + let body = Bytes::from(result.get2().to_vec()); + + let mut builder = http::Response::builder().status(status); + // `headers_mut()` is `None` only when the builder already holds an + // error (e.g. an out-of-range status from the agent). Don't unwrap: + // skip the headers and let `body()` below surface that error. + if let Some(builder_headers) = builder.headers_mut() { + *builder_headers = headers; + } + builder.body(body).map_err(|e| HttpError::Other(e.into())) + } + } +} + +/// Parse response headers from Node's flat `[name, value, name, value, ...]` +/// array (`res.rawHeaders`): even indices are (lowercased) header names, odd +/// indices their string values. +fn parse_response_headers(header_js: Array) -> Result { + let len = header_js.length() as usize; + let mut headers = HeaderMap::with_capacity(len / 2); + for i in 0..(len / 2) { + let key = header_js.get((i * 2) as u32).as_string(); + let val = header_js.get((i * 2 + 1) as u32).as_string(); + if let (Some(key), Some(val)) = (key, val) { + // Response headers come from the agent (untrusted over plaintext + // HTTP); skip any the http crate rejects rather than unwrapping + // and trapping the whole wasm instance on one malformed header. + if let (Ok(name), Ok(value)) = ( + HeaderName::from_bytes(key.as_bytes()), + HeaderValue::from_maybe_shared(Bytes::from(val)), + ) { + headers.insert(name, value); + } + } + } + Ok(headers) +} + +/// Decode the socket path that ddcommon's `parse_uri` hex-encoded into the URI +/// authority for `unix://` / `windows:` agent URLs (see `encode_uri_path_in_authority` +/// in libdd-common). The authority is the lowercase hex of the raw path bytes. +fn decode_socket_path(uri: &http::Uri) -> Result { + let authority = uri + .authority() + .ok_or_else(|| HttpError::InvalidRequest(anyhow::anyhow!("socket URI missing authority")))? + .as_str(); + let bytes = hex_decode(authority).ok_or_else(|| { + HttpError::InvalidRequest(anyhow::anyhow!("socket path authority is not valid hex")) + })?; + String::from_utf8(bytes) + .map_err(|e| HttpError::InvalidRequest(anyhow::anyhow!("socket path is not utf-8: {e}"))) +} + +/// Minimal hex decoder for the socket-path authority. Returns `None` on any +/// malformed input (odd length or non-hex digit) rather than panicking. +fn hex_decode(s: &str) -> Option> { + let bytes = s.as_bytes(); + if !bytes.len().is_multiple_of(2) { + return None; + } + let mut out = Vec::with_capacity(bytes.len() / 2); + for pair in bytes.chunks_exact(2) { + let hi = (pair[0] as char).to_digit(16)?; + let lo = (pair[1] as char).to_digit(16)?; + out.push((hi * 16 + lo) as u8); + } + Some(out) +} + +/// Serialize the full HTTP/1.1 request head (request line + Host + Content-Length +/// + user headers + terminating CRLF) into a contiguous byte buffer. +/// +/// The buffer is handed to JS by pointer; JS assigns it to +/// `req._header`, bypassing Node's `_storeHeader` serialization. +/// +/// `is_socket` requests (unix socket / named pipe) omit the `:port` suffix on +/// the Host header — there is no TCP port for a socket transport. +fn serialize_request_head( + req: &http::Request, + host: &str, + port: u16, + is_https: bool, + is_socket: bool, +) -> Result, HttpError> { + let method = req.method().as_str(); + let path_and_query = req + .uri() + .path_and_query() + .map(|pq| pq.as_str()) + .unwrap_or("/"); + let body_len = req.body().len(); + let headers = req.headers(); + + let mut buf = Vec::with_capacity(256 + headers.len() * 64); + + buf.extend_from_slice(method.as_bytes()); + buf.push(b' '); + buf.extend_from_slice(path_and_query.as_bytes()); + buf.extend_from_slice(b" HTTP/1.1\r\n"); + + buf.extend_from_slice(b"Host: "); + buf.extend_from_slice(host.as_bytes()); + if !is_socket { + let default_port = if is_https { 443 } else { 80 }; + if port != default_port { + write!(&mut buf, ":{port}").map_err(|e| HttpError::Other(e.into()))?; + } + } + buf.extend_from_slice(b"\r\n"); + + write!(&mut buf, "Content-Length: {body_len}\r\n").map_err(|e| HttpError::Other(e.into()))?; + + for (name, value) in headers.iter() { + // The request-framing headers above (Host, Content-Length) are + // authoritative. Skip any caller-supplied duplicates of them (and + // Transfer-Encoding) so they can't be emitted twice — duplicate/ + // conflicting framing headers are a request-smuggling vector when the + // agent URL is reached through a proxy. + if matches!( + name.as_str(), + "host" | "content-length" | "transfer-encoding" + ) { + continue; + } + buf.extend_from_slice(name.as_str().as_bytes()); + buf.extend_from_slice(b": "); + buf.extend_from_slice(value.as_bytes()); + buf.extend_from_slice(b"\r\n"); + } + + buf.extend_from_slice(b"\r\n"); + + Ok(buf) +} diff --git a/crates/capabilities/src/http_transport.js b/crates/capabilities/src/http_transport.js new file mode 100644 index 00000000..083d958f --- /dev/null +++ b/crates/capabilities/src/http_transport.js @@ -0,0 +1,116 @@ +const http = require('node:http') +const https = require('node:https') + +let storage = f => f() + +// A retried write can race a wasm-memory detach; treat that as a transient error. +function isDetachedBufferError (err) { + return err instanceof TypeError && /detached/i.test(err.message) +} + +module.exports.sleep = function (ms) { + return new Promise((resolve) => { + const timer = setTimeout(resolve, ms) + // The exporter races this sleep against each request as a timeout guard (and + // reuses it for retry backoff). An in-flight request refs the event loop on + // its own, so an abandoned timeout timer (e.g. the 5-minute request-timeout + // guard after a fast success) must not keep the host process alive. + timer.unref?.() + }) +} + +module.exports.setStorage = function (new_storage) { + storage = new_storage +} + +// Optional observer invoked with each agent response's raw headers +// (Node's flat [name, value, name, value, ...] array). Lets the host tracer +// read response-only headers (e.g. Datadog-Container-Tags-Hash) that are not +// otherwise surfaced through the wasm response body. Never throws into the +// transport: a misbehaving observer must not break trace delivery. +// +// The observer runs synchronously on the response 'end' event, so it must be +// non-blocking and return quickly — long-running synchronous work here would +// stall the event loop. +let responseHeaderObserver + +module.exports.setResponseHeaderObserver = function (new_observer) { + responseHeaderObserver = new_observer +} + +module.exports.httpRequest = function (host, port, isHttps, socketPath, head_ptr, head_len, body_ptr, body_len, wasm_memory) { + // A non-empty socketPath routes over a Unix domain socket (or Windows named + // pipe) instead of TCP. Sockets are always plaintext HTTP/1.1, so https is + // ignored in that mode. + const useSocket = typeof socketPath === 'string' && socketPath.length > 0 + const transport = useSocket ? http : (isHttps ? https : http) + + function attempt () { + return new Promise((resolve, reject) => { + storage(() => { + // wasm_memory.buffer is replaced each time WebAssembly.Memory grows, so + // the views must be recreated on every attempt against the current buffer. + const headView = new Uint8Array(wasm_memory.buffer, head_ptr, head_len) + const bodyView = new Uint8Array(wasm_memory.buffer, body_ptr, body_len) + + // host/port (or socketPath) drive connection selection; method/path/ + // headers are placeholders because we replace the rendered head below. + const requestOptions = useSocket + ? { socketPath, method: 'POST', path: '/' } + : { host, port, method: 'POST', path: '/' } + const req = transport.request(requestOptions, (res) => { + const chunks = [] + res.on('data', chunk => chunks.push(chunk)) + res.on('end', () => { + const body = Buffer.concat(chunks) + if (responseHeaderObserver) { + try { + responseHeaderObserver(res.rawHeaders) + } catch (error) { + // Only read `err.message` (a string) rather than stringifying an + // arbitrary thrown value, so a hostile/throwing toString on the + // error can't turn the log line into its own failure path. + process.stderr.write('responseHeaderObserver error: ' + (error && error.message) + '\n') + } + } + resolve([ + res.statusCode, + res.rawHeaders, + // Copy the exact body bytes. `body` is a Buffer from Buffer.concat, + // which for small payloads is a view into Node's shared pool, so + // `body.buffer` is the whole pool — slicing by offset/length (via + // the Uint8Array(typedArray) copy ctor) is required to avoid + // handing the Rust side unrelated pooled memory. + new Uint8Array(body), + ]) + }) + }) + req.on('error', reject) + + // Bypass Node's headers: the Rust side has already produced the full + // request head in HTTP/1.1 wire format. Setting _header before write() + // makes write/end skip _implicitHeader and _send prepends our bytes. + + try { + req._header = Buffer.from(headView) + req.write(bodyView) + req.end() + } catch (error) { + reject(error) + } + }) + }) + } + + function attemptWithRetry () { + return attempt().catch((error) => { + process.stderr.write('httpRequest error: ' + error + '\n') + if (isDetachedBufferError(error)) { + return attemptWithRetry() + } + throw error + }) + } + + return attemptWithRetry() +} diff --git a/crates/capabilities/src/lib.rs b/crates/capabilities/src/lib.rs new file mode 100644 index 00000000..f7cb4b01 --- /dev/null +++ b/crates/capabilities/src/lib.rs @@ -0,0 +1,91 @@ +// Copyright 2026-Present Datadog, Inc. https://www.datadoghq.com/ +// SPDX-License-Identifier: Apache-2.0 + +//! Wasm capability implementations for libdatadog-nodejs. +//! +//! [`WasmCapabilities`] is the bundle struct that implements every capability +//! trait `TraceExporter` requires (HTTP, sleep, log output) using wasm_bindgen +//! and JS transports. The wasm binding crate pins this type as the capability +//! generic for libdatadog's `TraceExporter`, mirroring libdatadog's native +//! `NativeCapabilities`. + +use std::future::Future; +use std::time::Duration; + +use libdd_capabilities::http::HttpError; +use libdd_capabilities::{HttpClientCapability, LogWriterCapability, MaybeSend, SleepCapability}; + +pub mod http; +pub mod sleep; + +pub use http::WasmHttpClient; +pub use sleep::WasmSleepCapability; + +/// Bundle of wasm platform capabilities for libdatadog's `TraceExporter`. +/// +/// Mirrors libdatadog's native `NativeCapabilities`: delegates HTTP to +/// [`WasmHttpClient`] and sleep to [`WasmSleepCapability`]. Log output is a +/// no-op (see the [`LogWriterCapability`] impl). Per-function bounds stay +/// minimal in libdatadog (e.g. stats-only code uses [`WasmHttpClient`] +/// directly), so this bundle is only needed where the full `TraceExporter` +/// capability set is. +#[derive(Clone, Debug)] +pub struct WasmCapabilities { + http: WasmHttpClient, + sleep: WasmSleepCapability, +} + +impl Default for WasmCapabilities { + fn default() -> Self { + Self::new() + } +} + +impl WasmCapabilities { + pub fn new() -> Self { + Self { + http: WasmHttpClient::new_client(), + sleep: WasmSleepCapability, + } + } +} + +impl HttpClientCapability for WasmCapabilities { + fn new_client() -> Self { + Self { + http: WasmHttpClient::new_client(), + sleep: WasmSleepCapability, + } + } + + fn request( + &self, + req: ::http::Request<::bytes::Bytes>, + ) -> impl Future, HttpError>> + MaybeSend { + self.http.request(req) + } +} + +impl SleepCapability for WasmCapabilities { + fn new() -> Self { + Self { + http: WasmHttpClient::new_client(), + sleep: WasmSleepCapability, + } + } + + fn sleep(&self, duration: Duration) -> impl Future + MaybeSend { + self.sleep.sleep(duration) + } +} + +impl LogWriterCapability for WasmCapabilities { + fn write_log_output(&self, _bytes: &[u8]) -> std::io::Result<()> { + // The wasm binding runs exclusively in trace-export mode; the + // TraceExporter only invokes this in log-output mode, which this + // binding never enables. Implemented as a no-op to satisfy the + // capability bound. If log-output mode is added for wasm, route the + // buffer to a JS sink (e.g. process.stderr) here. + Ok(()) + } +} diff --git a/crates/capabilities/src/sleep.rs b/crates/capabilities/src/sleep.rs new file mode 100644 index 00000000..6a6af6c3 --- /dev/null +++ b/crates/capabilities/src/sleep.rs @@ -0,0 +1,43 @@ +// Copyright 2026-Present Datadog, Inc. https://www.datadoghq.com/ +// SPDX-License-Identifier: Apache-2.0 + +//! Wasm [`SleepCapability`] backed by JS `setTimeout`. +//! +//! `TraceExporter` requires its capability bundle to implement `SleepCapability` +//! (used for retry backoff). Native code uses `tokio::time::sleep`; in wasm we +//! delegate to `setTimeout` via a JS-returned Promise. + +use std::future::Future; +use std::time::Duration; + +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::JsFuture; + +use libdd_capabilities::maybe_send::MaybeSend; +use libdd_capabilities::sleep::SleepCapability; + +#[wasm_bindgen(module = "/src/http_transport.js")] +extern "C" { + #[wasm_bindgen(js_name = "sleep")] + fn js_sleep(ms: f64) -> js_sys::Promise; +} + +/// Wasm sleep backed by JS `setTimeout`. +/// +/// The wasm analogue of libdatadog's native `NativeSleepCapability`. +#[derive(Debug, Clone)] +pub struct WasmSleepCapability; + +impl SleepCapability for WasmSleepCapability { + fn new() -> Self { + Self + } + + #[allow(clippy::manual_async_fn)] + fn sleep(&self, duration: Duration) -> impl Future + MaybeSend { + async move { + let ms = duration.as_millis() as f64; + let _ = JsFuture::from(js_sleep(ms)).await; + } + } +} diff --git a/crates/datadog-js-zstd/src/lib.rs b/crates/datadog-js-zstd/src/lib.rs index 4896301b..fed9b1c7 100644 --- a/crates/datadog-js-zstd/src/lib.rs +++ b/crates/datadog-js-zstd/src/lib.rs @@ -1,11 +1,8 @@ -use wasm_bindgen::prelude::*; use js_sys::Uint8Array; +use wasm_bindgen::prelude::*; #[wasm_bindgen] -pub fn zstd_compress( - data: Uint8Array, - level: i32, -) -> Uint8Array { +pub fn zstd_compress(data: Uint8Array, level: i32) -> Uint8Array { let vecdata = data.to_vec(); let compressed_data = zstd::encode_all(&vecdata[..], level).expect("Failed to compress data"); Uint8Array::from(compressed_data.as_slice()) diff --git a/crates/library_config/Cargo.toml b/crates/library_config/Cargo.toml index 80093eb0..be76bd45 100644 --- a/crates/library_config/Cargo.toml +++ b/crates/library_config/Cargo.toml @@ -8,7 +8,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" -datadog-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v18.1.0" } +libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", rev = "353134770b312b7ccd2df6afabc253090b948e5f" } wasm-bindgen = "0.2.100" serde = { version = "1.0", features = ["derive"] } diff --git a/crates/library_config/src/lib.rs b/crates/library_config/src/lib.rs index c993fbc9..6896a63c 100644 --- a/crates/library_config/src/lib.rs +++ b/crates/library_config/src/lib.rs @@ -2,7 +2,7 @@ use wasm_bindgen::prelude::*; #[wasm_bindgen] pub struct JsConfigurator { - configurator: Box, + configurator: Box, envp: Vec, args: Vec, } @@ -49,7 +49,7 @@ impl JsConfigurator { #[wasm_bindgen(constructor)] pub fn new() -> Self { JsConfigurator { - configurator: Box::new(datadog_library_config::Configurator::new(false)), // No debug log as WASM can't write to stdout + configurator: Box::new(libdd_library_config::Configurator::new(false)), // No debug log as WASM can't write to stdout envp: Vec::new(), args: Vec::new(), } @@ -70,13 +70,13 @@ impl JsConfigurator { #[wasm_bindgen] pub fn get_config_local_path(&self, target: String) -> Result { let target_enum = match target.as_str() { - "linux" => datadog_library_config::Target::Linux, - "win32" => datadog_library_config::Target::Windows, - "darwin" => datadog_library_config::Target::Macos, + "linux" => libdd_library_config::Target::Linux, + "win32" => libdd_library_config::Target::Windows, + "darwin" => libdd_library_config::Target::Macos, _ => return Err(JsValue::from_str("Unsupported target")), }; Ok( - datadog_library_config::Configurator::local_stable_configuration_path(target_enum) + libdd_library_config::Configurator::local_stable_configuration_path(target_enum) .to_string(), ) } @@ -84,13 +84,13 @@ impl JsConfigurator { #[wasm_bindgen] pub fn get_config_managed_path(&self, target: String) -> Result { let target_enum = match target.as_str() { - "linux" => datadog_library_config::Target::Linux, - "win32" => datadog_library_config::Target::Windows, - "darwin" => datadog_library_config::Target::Macos, + "linux" => libdd_library_config::Target::Linux, + "win32" => libdd_library_config::Target::Windows, + "darwin" => libdd_library_config::Target::Macos, _ => return Err(JsValue::from_str("Unsupported target")), }; Ok( - datadog_library_config::Configurator::fleet_stable_configuration_path(target_enum) + libdd_library_config::Configurator::fleet_stable_configuration_path(target_enum) .to_string(), ) } @@ -108,7 +108,7 @@ impl JsConfigurator { let res_config = self.configurator.get_config_from_bytes( config_string_local.as_bytes(), config_string_managed.as_bytes(), - datadog_library_config::ProcessInfo { + libdd_library_config::ProcessInfo { envp: envp, args: args, language: b"nodejs".to_vec(), diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml new file mode 100644 index 00000000..166815e4 --- /dev/null +++ b/crates/pipeline/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "pipeline" +version = "0.1.0" +edition = "2021" +description = "Wasm binding for pipeline span management and trace export" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +wasm-bindgen = "0.2" +wasm-bindgen-futures = "0.4" +js-sys = "0.3" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1" +libdatadog-nodejs-capabilities = { path = "../capabilities" } +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0" } +libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false, features = ["change-buffer"] } +libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } +libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } +libdd-shared-runtime = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } +rmp-serde = "1" +bytes = "1" +http = "1" +console_error_panic_hook = "0.1" + +[target.'cfg(target_arch = "wasm32")'.dependencies] +getrandom = { version = "0.2", features = ["js"] } +uuid = { version = "1", features = ["js"] } + +[dev-dependencies] +wasm-bindgen-test = "0.3" + +# The pipeline wasm uses post-MVP features (bulk-memory for change-buffer +# copies, sign-extension, etc.) that the wasm-opt bundled with wasm-pack does +# not enable by default. Pass --all-features so wasm-opt validation passes +# (the smaller wasm crates don't hit this, so it's set per-crate here). +[package.metadata.wasm-pack.profile.release] +wasm-opt = ['-O', '--all-features'] diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs new file mode 100644 index 00000000..9d1bc112 --- /dev/null +++ b/crates/pipeline/src/lib.rs @@ -0,0 +1,878 @@ +use libdatadog_nodejs_capabilities::WasmCapabilities; +use libdd_data_pipeline::trace_exporter::agent_response::AgentResponse; +use libdd_data_pipeline::trace_exporter::{ + TraceExporter, TraceExporterBuilder, TraceExporterOutputFormat, +}; +use libdd_data_pipeline::OtlpProtocol; +use libdd_shared_runtime::LocalRuntime; +use std::cell::{Cell, RefCell, UnsafeCell}; +use std::ffi::CStr; +use std::time::Duration; + +use wasm_bindgen::prelude::*; + +mod span_string; + +mod span_bytes; + +mod trace_data; +use trace_data::*; + +mod stats; + +use libdd_trace_utils::change_buffer::{ChangeBuffer, ChangeBufferState}; +use libdd_trace_utils::span::v04::{AttributeAnyValue, AttributeArrayValue, SpanEvent}; +use span_string::SpanString; +use std::collections::HashMap; + +mod utils; +use utils::*; + +#[wasm_bindgen(start)] +fn init() { + console_error_panic_hook::set_once(); +} + +// --- span event attribute decoding --- +// +// `addSpanEvent` receives its attributes as a flat little-endian buffer built +// by dd-trace-js. Layout: repeated entries until the buffer is exhausted, each +// [key_len: u32][key: utf8][tag: u8] + value +// where the value depends on `tag`: +// 0 String [len: u32][utf8] +// 1 Boolean [u8 (0/1)] +// 2 Integer [i64] +// 3 Double [f64] +// 4 Array [count: u32] then `count` items, each [item_tag: u8][scalar] +// (item_tag must be 0..=3; nested arrays are rejected) +// The tags mirror libdatadog's `AttributeArrayValue` discriminants +// (String=0, Boolean=1, Integer=2, Double=3, Array=4). Every read is bounded +// against the buffer so a malformed/truncated buffer errors instead of +// panicking (matching the hardening in `stringTableInsertMany`/`prepareChunk`). + +fn se_need(buf: &[u8], idx: usize, n: usize) -> Result<(), JsValue> { + // Avoid `idx + n` overflowing: on wasm32 `usize` is 32-bit, and `n` can be + // a u32-derived length (e.g. a crafted `key_len`) near `usize::MAX`, which + // would wrap and let a too-large read slip past the bound and trap on the + // slice. `idx` never exceeds `buf.len()` (it only advances after a checked + // read), so `buf.len() - idx` is the safe remaining-byte form. + if idx > buf.len() || n > buf.len() - idx { + return Err(JsValue::from_str( + "addSpanEvent: truncated span-event attribute buffer", + )); + } + Ok(()) +} + +fn se_read_u8(buf: &[u8], idx: &mut usize) -> Result { + se_need(buf, *idx, 1)?; + let b = buf[*idx]; + *idx += 1; + Ok(b) +} + +fn se_read_u32(buf: &[u8], idx: &mut usize) -> Result { + se_need(buf, *idx, 4)?; + get_num(buf, idx) + .ok_or_else(|| JsValue::from_str("addSpanEvent: truncated span-event attribute buffer")) +} + +fn se_read_str(buf: &[u8], idx: &mut usize) -> Result { + let len = se_read_u32(buf, idx)? as usize; + se_need(buf, *idx, len)?; + let s = std::str::from_utf8(&buf[*idx..*idx + len]) + .map_err(|e| JsValue::from_str(&format!("addSpanEvent: invalid utf8: {e}")))?; + *idx += len; + Ok(s.into()) +} + +fn se_read_scalar( + buf: &[u8], + idx: &mut usize, + tag: u8, +) -> Result, JsValue> { + match tag { + 0 => Ok(AttributeArrayValue::String(se_read_str(buf, idx)?)), + 1 => Ok(AttributeArrayValue::Boolean(se_read_u8(buf, idx)? != 0)), + 2 => { + se_need(buf, *idx, 8)?; + let n = get_num(buf, idx) + .ok_or_else(|| JsValue::from_str("addSpanEvent: truncated span-event attribute buffer"))?; + Ok(AttributeArrayValue::Integer(n)) + } + 3 => { + se_need(buf, *idx, 8)?; + let n = get_num(buf, idx) + .ok_or_else(|| JsValue::from_str("addSpanEvent: truncated span-event attribute buffer"))?; + Ok(AttributeArrayValue::Double(n)) + } + _ => Err(JsValue::from_str( + "addSpanEvent: invalid span-event attribute tag", + )), + } +} + +fn decode_span_event_attributes( + buf: &[u8], +) -> Result>, JsValue> { + let mut attributes = HashMap::new(); + let mut idx = 0usize; + while idx < buf.len() { + let key = se_read_str(buf, &mut idx)?; + let tag = se_read_u8(buf, &mut idx)?; + let value = if tag == 4 { + let count = se_read_u32(buf, &mut idx)? as usize; + // Each item is at least 1 byte (its tag), so cap the pre-allocation + // to the remaining buffer: an inflated count can't force a huge + // allocation, and the per-item bounded reads catch truncation. + let mut items = Vec::with_capacity(count.min(buf.len().saturating_sub(idx))); + for _ in 0..count { + let item_tag = se_read_u8(buf, &mut idx)?; + if item_tag == 4 { + return Err(JsValue::from_str( + "addSpanEvent: nested arrays are not supported", + )); + } + items.push(se_read_scalar(buf, &mut idx, item_tag)?); + } + AttributeAnyValue::Array(items) + } else { + AttributeAnyValue::SingleValue(se_read_scalar(buf, &mut idx, tag)?) + }; + attributes.insert(key, value); + } + Ok(attributes) +} + +#[wasm_bindgen] +/// All mutable state is behind RefCell to allow `&self` methods on the +/// wasm-bindgen wrapper. This prevents re-entrant borrow panics when: +/// - Plugin instrumentation triggers span creation inside another span's +/// creation (e.g., http client span created during express handler) +/// - Async `flushChunk` holds a borrow across await points while other +/// span operations need access +pub struct WasmSpanState { + change_queue: Vec, + string_table_input: Vec, + /// UnsafeCell because send_trace_chunks_async needs &mut self across an + /// await point. WASM is single-threaded so this is safe — we just need + /// to ensure no overlapping mutable borrows (guaranteed by the JS-side + /// _flushInFlight guard which serializes sendPreparedChunk calls). + /// On wasm the exporter must be built asynchronously (`build_async`), but + /// the wasm-bindgen constructor is synchronous. We stash the configured + /// builder here and build the exporter lazily on the first send (the only + /// path that needs it), inside an async context. + // On wasm the exporter runs on a single-threaded `LocalRuntime` (workers + // spawned via wasm_bindgen_futures::spawn_local); the multi-thread + // ForkSafeRuntime/BasicRuntime are native-only. + exporter: UnsafeCell>>, + builder: UnsafeCell>>, + cbs: RefCell>, + stats_collector: RefCell>, + prepared_spans: RefCell>>>, + /// Re-entrancy guard for `sendPreparedChunk`. wasm-bindgen async exports + /// can be invoked again from JS before the prior future resolves; without + /// this, two calls would each take `&mut` out of `exporter`/`builder` and + /// alias across the await (UB). The guard makes a re-entrant call return + /// an error instead. + sending: Cell, + /// When true, the lazily-built exporter is configured for v0.5 output + /// (`/v0.5/traces`) instead of the default v0.4. v0.5 is a smaller, fixed + /// 12-field schema with NO slots for `meta_struct`/`span_events`/`span_links`, + /// so libdatadog's v0.5 serializer silently drops them — this mirrors + /// dd-trace-js master's v0.5 encoder and is intentional. Caller (dd-trace-js) + /// must only enable this after confirming the agent advertises `/v0.5/traces` + /// (libdd does NOT downgrade V05 the way it does V1). The output format is + /// fixed once the exporter is built on the first send, so `setUseV05` only + /// takes effect if called before then. + use_v05: Cell, + /// When set, the lazily-built exporter is configured to export traces via + /// OTLP HTTP to this endpoint (e.g. an OTel Collector) INSTEAD of the + /// Datadog agent. libdatadog maps its internal traces to OTLP, so no + /// JS-formatted spans are involved. Like `use_v05`, only takes effect if + /// set before the first send (when the exporter is built). + otlp_endpoint: RefCell>, + /// OTLP wire protocol (`http/json` default, or `http/protobuf`). Only + /// applied when `otlp_endpoint` is set. + otlp_protocol: Cell>, + /// Extra HTTP headers for OTLP export (e.g. collector auth), as key/value + /// pairs. Only applied when `otlp_endpoint` is set. + otlp_headers: RefCell>, + /// Latched message from a failed lazy `build_async`. Building is one-shot and + /// a failure is fatal (bad config), so once set every send returns it (as a + /// distinguishable error) instead of a misleading "builder already consumed", + /// letting the host stop retrying. + build_error: RefCell>, +} + +/// Clears an in-flight flag on drop, so an early return or a dropped future +/// still resets it. +struct InFlightGuard<'a>(&'a Cell); +impl Drop for InFlightGuard<'_> { + fn drop(&mut self) { + self.0.set(false); + } +} + +#[wasm_bindgen] +impl WasmSpanState { + #[wasm_bindgen(constructor)] + pub fn new( + url: &str, + tracer_version: &str, + lang: &str, + lang_version: &str, + lang_interpreter: &str, + change_queue_size: u32, + string_table_input_size: u32, + pid: u32, + tracer_service: &str, + stats_enabled: bool, + hostname: &str, + env: &str, + app_version: &str, + runtime_id: &str, + ) -> Result { + let mut builder = TraceExporterBuilder::::new(); + builder + .set_url(url) + .set_tracer_version(tracer_version) + .set_language(lang) + .set_language_version(lang_version) + .set_language_interpreter(lang_interpreter) + // Populate the payload-level TracerMetadata (service/env/hostname/ + // app_version) the agent receives. These values are already passed + // in for the stats collector; without these calls the trace + // payload's tracer metadata is sent empty. + .set_service(tracer_service) + .set_env(env) + .set_hostname(hostname) + .set_app_version(app_version) + .enable_agent_rates_payload_version(); + + let mut change_queue = vec![0u8; change_queue_size as usize]; + let change_buffer = unsafe { + ChangeBuffer::from_raw_parts( + std::ptr::NonNull::new(change_queue.as_mut_ptr()) + .expect("Vec::as_mut_ptr is never null"), + change_queue.len(), + ) + }; + let change_buffer_state = ChangeBufferState::new( + change_buffer, + tracer_service.into(), + lang.into(), + pid, + ); + + let stats_collector = if stats_enabled { + Some(stats::StatsCollector::new( + Duration::from_secs(10), + url.to_string(), + stats::StatsMeta { + hostname: hostname.to_string(), + env: env.to_string(), + version: app_version.to_string(), + lang: lang.to_string(), + tracer_version: tracer_version.to_string(), + runtime_id: runtime_id.to_string(), + service: tracer_service.to_string(), + }, + )) + } else { + None + }; + + Ok(WasmSpanState { + change_queue, + string_table_input: vec![0u8; string_table_input_size as usize], + exporter: UnsafeCell::new(None), + builder: UnsafeCell::new(Some(builder)), + cbs: RefCell::new(change_buffer_state), + stats_collector: RefCell::new(stats_collector), + prepared_spans: RefCell::new(None), + sending: Cell::new(false), + use_v05: Cell::new(false), + otlp_endpoint: RefCell::new(None), + otlp_protocol: Cell::new(None), + otlp_headers: RefCell::new(Vec::new()), + build_error: RefCell::new(None), + }) + } + + /// Select v0.5 output for the trace exporter. Must be called before the + /// first `sendPreparedChunk` (the exporter is built lazily on first send and + /// the output format is fixed at build time; later calls have no effect). + /// + /// v0.5 silently drops `meta_struct` (and top-level `span_events`/`span_links`) + /// because the v0.5 wire schema has no slots for them — the caller is + /// responsible for only enabling this when the agent supports `/v0.5/traces`. + #[wasm_bindgen(js_name = "setUseV05")] + pub fn set_use_v05(&self, v: bool) { + self.use_v05.set(v); + } + + /// Route trace export through libdatadog's OTLP HTTP exporter to `url` + /// instead of the Datadog agent. Must be called before the first send. + /// Takes precedence over `setUseV05` (OTLP bypasses the agent entirely). + #[wasm_bindgen(js_name = "setOtlpEndpoint")] + pub fn set_otlp_endpoint(&self, url: String) { + *self.otlp_endpoint.borrow_mut() = Some(url); + } + + /// Select the OTLP wire protocol: `http/json` (default) or `http/protobuf`. + /// Rejects unsupported values (e.g. `grpc`). Only takes effect with an OTLP + /// endpoint set, before the first send. + #[wasm_bindgen(js_name = "setOtlpProtocol")] + pub fn set_otlp_protocol(&self, protocol: String) -> Result<(), JsValue> { + let parsed = protocol + .parse::() + .map_err(|e| JsValue::from_str(&format!("setOtlpProtocol: {e}")))?; + self.otlp_protocol.set(Some(parsed)); + Ok(()) + } + + /// Set extra HTTP headers for OTLP export as a flat `[key, value, ...]` + /// array (the host flattens its key/value map). Only takes effect with an + /// OTLP endpoint set, before the first send. A trailing unpaired element on + /// an odd-length array is ignored. Each call replaces any previously set headers. + #[wasm_bindgen(js_name = "setOtlpHeaders")] + pub fn set_otlp_headers(&self, kv: Vec) { + // chunks_exact drops a trailing unpaired element; the host always passes + // complete [key, value] pairs. + let headers = kv + .chunks_exact(2) + .map(|pair| (pair[0].clone(), pair[1].clone())) + .collect(); + *self.otlp_headers.borrow_mut() = headers; + } + + #[wasm_bindgen] + pub fn change_queue_ptr(&self) -> *const u8 { + self.change_queue.as_ptr() + } + + #[wasm_bindgen] + pub fn change_queue_len(&self) -> u32 { + self.change_queue.len() as u32 + } + + #[wasm_bindgen] + pub fn string_table_input_ptr(&self) -> *const u8 { + self.string_table_input.as_ptr() + } + + #[wasm_bindgen] + pub fn string_table_input_len(&self) -> u32 { + self.string_table_input.len() as u32 + } + + /// Prepare a chunk of spans for sending. Flushes the change buffer, + /// extracts spans, feeds stats. Returns `true` if a chunk was prepared + /// (there are spans to send) and `false` if there was nothing to send. + /// Must be followed by `sendPreparedChunk()` to actually send. + #[wasm_bindgen(js_name = "prepareChunk")] + pub fn prepare_chunk( + &self, + len: u32, + first_is_local_root: bool, + chunk: &[u8], + ) -> Result { + // Validate the JS-supplied count against the actual buffer size before + // doing any work: each span id is a u64 (8 bytes). This prevents an + // out-of-bounds read panic (and a huge `Vec::with_capacity`) when the + // caller passes a `len` larger than the chunk can hold. + if (len as usize).saturating_mul(8) > chunk.len() { + return Err(JsValue::from_str( + "prepareChunk: len exceeds the span-id bytes available in chunk", + )); + } + if len == 0 { + // Nothing to send: drop any previously prepared-but-unsent chunk so + // a caller that ignores this `false` cannot later resend a stale one. + if let Some(old_spans) = self.prepared_spans.borrow_mut().take() { + self.cbs.borrow_mut().recycle_spans(old_spans); + } + return Ok(false); + } + + self.cbs.borrow_mut() + .flush_change_buffer() + .map_err(|e| JsValue::from_str(&e.to_string()))?; + + let mut count = len; + let mut index = 0; + let mut span_ids = Vec::with_capacity(count as usize); + while count > 0 { + let span_id: u64 = get_num(chunk, &mut index) + .ok_or_else(|| JsValue::from_str("prepareChunk: span id index out of bounds"))?; + span_ids.push(span_id); + count -= 1; + } + + let spans_vec = self + .cbs.borrow_mut() + .flush_chunk(&span_ids, first_is_local_root) + .map_err(|e| JsValue::from_str(&e.to_string()))?; + + if let Some(collector) = self.stats_collector.borrow_mut().as_mut() { + collector.add_spans(&spans_vec); + } + + // Recycle any previously prepared spans that were never sent (e.g. + // if the prior send was skipped by JS back-pressure). Reusing the + // pre-allocated HashMaps avoids allocator fragmentation in WASM. + if let Some(old_spans) = self.prepared_spans.borrow_mut().take() { + self.cbs.borrow_mut().recycle_spans(old_spans); + } + + // Store prepared spans for the subsequent sendPreparedChunk call + let has_spans = !spans_vec.is_empty(); + *self.prepared_spans.borrow_mut() = Some(spans_vec); + Ok(has_spans) + } + + /// Send the previously prepared chunk. + /// + /// Uses `&self` (not `&mut self`); exclusive access to the exporter is + /// enforced at runtime by the `sending` re-entrancy guard below rather + /// than by the borrow checker. WASM is single-threaded, so the only way + /// two `&mut` to the exporter could co-exist is async re-entrancy (JS + /// calling this again before the prior future resolves) — the guard + /// rejects that with an error instead of allowing aliasing (UB). + #[wasm_bindgen(js_name = "sendPreparedChunk")] + pub async fn send_prepared_chunk(&self) -> Result { + if self.sending.get() { + return Err(JsValue::from_str("sendPreparedChunk is already in flight")); + } + self.sending.set(true); + let _in_flight = InFlightGuard(&self.sending); + + let spans_vec = self + .prepared_spans + .borrow_mut() + .take() + .ok_or_else(|| JsValue::from_str("no prepared chunk to send"))?; + + // SAFETY: WASM is single-threaded and the `sending` guard above + // guarantees no overlapping invocation, so this is the only live + // reference to the exporter for the duration of the awaits. + let exporter_slot = unsafe { &mut *self.exporter.get() }; + if exporter_slot.is_none() { + // A previous build attempt failed. Building is one-shot and the + // failure is fatal (bad config won't fix itself), so return it + // consistently — as a distinguishable error the host bails on — + // rather than a misleading "builder already consumed". + if let Some(msg) = self.build_error.borrow().clone() { + return Err(build_failure_error(&msg)); + } + // First send: build the exporter asynchronously. `build` is not + // available on wasm (it needs a blocking runtime), so we drive + // `build_async` here where we already have an async context. + let mut builder = unsafe { &mut *self.builder.get() } + .take() + .ok_or_else(|| JsValue::from_str("exporter builder already consumed"))?; + // Output format is decided here, at first build, and then fixed. + // v0.5 drops meta_struct/span_events/span_links by design (the v0.5 + // schema has no slots for them); dd-trace-js only enables this after + // confirming agent `/v0.5/traces` support via `/info`. + if self.use_v05.get() { + builder.set_output_format(TraceExporterOutputFormat::V05); + } + // When an OTLP endpoint is configured, libdatadog exports traces via + // OTLP HTTP to that endpoint instead of the Datadog agent (mutually + // exclusive with the agent v0.4/v0.5 path). + if let Some(url) = self.otlp_endpoint.borrow().as_deref() { + builder.set_otlp_endpoint(url); + if let Some(protocol) = self.otlp_protocol.get() { + builder.set_otlp_protocol(protocol); + } + let headers = self.otlp_headers.borrow(); + if !headers.is_empty() { + builder.set_otlp_headers(headers.clone()); + } + } + match builder.build_async::().await { + Ok(built) => *exporter_slot = Some(built), + Err(e) => { + // Latch the failure: the builder is now consumed and the + // config won't change, so every later send must fail fast. + let msg = format!("native exporter build failed: {e:?}"); + *self.build_error.borrow_mut() = Some(msg.clone()); + return Err(build_failure_error(&msg)); + } + } + } + let exporter = match exporter_slot.as_mut() { + Some(exporter) => exporter, + // Unreachable: the block above either set `Some` or returned early. + None => return Err(build_failure_error("native exporter unavailable")), + }; + let resp = exporter + .send_trace_chunks_async(vec![spans_vec]) + .await; + let response_str = resp.map(|resp| match resp { + AgentResponse::Unchanged => "unchanged".to_string(), + AgentResponse::Changed { body } => body, + }); + + response_str + .map(|s| JsValue::from_str(&s)) + .map_err(|e| JsValue::from_str(&format!("{:?}", e))) + } + + /// Flush aggregated stats to the agent's /v0.6/stats endpoint. + /// + /// Should be called periodically (e.g. every 10s) from JS, and with + /// `force=true` on shutdown. + #[wasm_bindgen(js_name = "flushStats")] + pub async fn flush_stats(&self, force: bool) -> Result { + // Build the stats request under a brief *synchronous* borrow, then drop + // the borrow BEFORE the async send. The collector therefore stays in + // `stats_collector`, so a concurrent `prepareChunk` during the in-flight + // send still reaches `add_spans` and those spans are counted. (Taking + // the collector out for the whole await would silently drop them from + // client-side stats.) No borrow is held across the await, so there is + // no double-borrow hazard from overlapping calls. + let req = { + let mut guard = self.stats_collector.borrow_mut(); + match guard.as_mut() { + Some(collector) => collector + .prepare_request(force) + .map_err(|e| JsValue::from_str(&e))?, + None => return Ok(false), + } + }; + match req { + Some(req) => { + stats::StatsCollector::send_request(req) + .await + .map_err(|e| JsValue::from_str(&e))?; + Ok(true) + } + None => Ok(false), + } + } + + /// Flush the queued change-buffer operations. On success always returns + /// `true` (the bool exists only for signature symmetry with the other + /// flush methods); failures surface as a thrown error. + #[wasm_bindgen(js_name = "flushChangeQueue")] + pub fn flush_change_queue(&self) -> Result { + self.cbs.borrow_mut() + .flush_change_buffer() + .map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(true) + } + + /// Set default meta tags applied to every new span. + /// Takes a flat array of key-value pairs: [key1, val1, key2, val2, ...] + #[wasm_bindgen(js_name = "setDefaultMeta")] + pub fn set_default_meta(&self, pairs: Vec) -> Result<(), JsValue> { + let mut tags = Vec::with_capacity(pairs.len() / 2); + let mut i = 0; + while i + 1 < pairs.len() { + let key = pairs[i] + .as_string() + .ok_or_else(|| JsValue::from_str("default meta key must be a string"))?; + let val = pairs[i + 1] + .as_string() + .ok_or_else(|| JsValue::from_str("default meta value must be a string"))?; + tags.push((key.into(), val.into())); + i += 2; + } + self.cbs.borrow_mut().set_default_meta(tags); + Ok(()) + } + + #[wasm_bindgen(js_name = "stringTableInsertOne")] + pub fn string_table_insert_one(&self, key: u32, val: &str) { + self.cbs.borrow_mut() + .string_table_insert_one(key, val.into()); + } + + #[wasm_bindgen(js_name = "stringTableInsertMany")] + pub fn string_table_insert_many(&self, count: u32) -> Result<(), JsValue> { + let mut index: usize = 0; + let mut remaining = count as usize; + // Hold one mutable borrow for the whole bulk insert rather than + // re-borrowing the RefCell once per string. + let mut cbs = self.cbs.borrow_mut(); + let buf = &self.string_table_input; + while remaining > 0 { + // Bound the read against the untrusted `count`: a count larger than + // the encoded entries must error, not index out of bounds. get_num + // does the (overflow-safe) bounds check and returns None past the end. + let key: u32 = get_num(buf, &mut index).ok_or_else(|| { + JsValue::from_str("stringTableInsertMany: count exceeds the entries in the input buffer") + })?; + let str_slice = &buf[index..]; + // Bound the NUL scan to the input slice so a non-terminated string + // can't read past the buffer, and advance past the NUL terminator + // (+ 1) so the next entry parses from the right offset. + let cstr = CStr::from_bytes_until_nul(str_slice) + .map_err(|e| JsValue::from_str(&format!("{}", e)))?; + let val = cstr + .to_str() + .map_err(|e| JsValue::from_str(&format!("{}", e)))?; + index += val.len() + 1; + // From<&str> for SpanString is a single Arc allocation — no + // intermediate owned String. + cbs.string_table_insert_one(key, val.into()); + remaining -= 1; + } + Ok(()) + } + + #[wasm_bindgen(js_name = "stringTableEvict")] + pub fn string_table_evict(&self, key: u32) { + self.cbs.borrow_mut().string_table_evict_one(key); + } + + // Absent-entity convention: span-level getters return an error (JS throw) + // for an unknown span_id, while trace-level getters and attribute lookups + // return null for an unknown segment / unset attribute. + #[wasm_bindgen(js_name = "getServiceName")] + pub fn get_service_name(&self, span_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span.service.to_string()) + } + + #[wasm_bindgen(js_name = "getResourceName")] + pub fn get_resource_name(&self, span_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span.resource.to_string()) + } + + #[wasm_bindgen(js_name = "getMetaAttr")] + pub fn get_meta_attr(&self, span_id: u64, name: &str) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + // VecMap::get accepts &str directly (SpanString: Borrow), so no + // SpanString allocation is needed for the lookup. + Ok(span.meta.get(name) + .map(|v| JsValue::from_str(v.0.as_ref())) + .unwrap_or(JsValue::NULL)) + } + + #[wasm_bindgen(js_name = "getMetricAttr")] + pub fn get_metric_attr(&self, span_id: u64, name: &str) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span.metrics.get(name) + .map(|v| JsValue::from_f64(*v)) + .unwrap_or(JsValue::NULL)) + } + + #[wasm_bindgen(js_name = "getError")] + pub fn get_error(&self, span_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span.error) + } + + // start/duration are i64 nanoseconds. Returning them as JS BigInt (not + // f64) preserves full precision — real epoch-ns values exceed 2^53 and + // would be silently truncated as f64. + #[wasm_bindgen(js_name = "getStart")] + pub fn get_start(&self, span_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span.start) + } + + #[wasm_bindgen(js_name = "getDuration")] + pub fn get_duration(&self, span_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span.duration) + } + + #[wasm_bindgen(js_name = "getType")] + pub fn get_type(&self, span_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span.r#type.to_string()) + } + + #[wasm_bindgen(js_name = "getName")] + pub fn get_name(&self, span_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span.name.to_string()) + } + + // `meta_struct` carries msgpack-encoded structured data (e.g. AppSec, Code + // Origin, Dynamic Instrumentation). There is no change-buffer opcode for it, + // so the value is written directly onto the span after draining the queue — + // meta_struct does not depend on any other queued op, so bypassing the queue + // ordering is safe (subsequent ops are applied on the next flush and never + // touch meta_struct). + #[wasm_bindgen(js_name = "setMetaStruct")] + pub fn set_meta_struct( + &self, + span_id: u64, + key: &str, + value: &[u8], + ) -> Result<(), JsValue> { + self.flush_change_queue()?; + let mut cbs = self.cbs.borrow_mut(); + let span = cbs + .span_mut(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; + span.meta_struct + .insert(key.into(), span_bytes::SpanBytesImpl(value.to_vec())); + Ok(()) + } + + #[wasm_bindgen(js_name = "getMetaStruct")] + pub fn get_meta_struct(&self, span_id: u64, key: &str) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + // VecMap::get accepts &str directly (SpanString: Borrow). + Ok(span.meta_struct.get(key) + .map(|v| JsValue::from(js_sys::Uint8Array::from(v.0.as_slice()))) + .unwrap_or(JsValue::NULL)) + } + + // Span events (OpenTelemetry-style) are serialized by libdatadog as the + // top-level v0.4 `span_events` field when present. Like meta_struct there + // is no change-buffer opcode, so the event is appended directly to the span + // after draining the queue (span_events do not depend on any other queued + // op, so bypassing queue ordering is safe). `attrs_buf` is the flat typed + // attribute encoding decoded by `decode_span_event_attributes`. + #[wasm_bindgen(js_name = "addSpanEvent")] + pub fn add_span_event( + &self, + span_id: u64, + name: &str, + time_unix_nano: u64, + attrs_buf: &[u8], + ) -> Result<(), JsValue> { + self.flush_change_queue()?; + // Decode before borrowing cbs mutably so a malformed buffer errors + // without holding the borrow. + let attributes = decode_span_event_attributes(attrs_buf)?; + let mut cbs = self.cbs.borrow_mut(); + let span = cbs + .span_mut(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; + span.span_events.push(SpanEvent { + time_unix_nano, + name: name.into(), + attributes, + }); + Ok(()) + } + + // Test/inspection helper: serialize the span's events to JSON via the same + // serde `Serialize` impl libdatadog uses for the msgpack wire format, so + // the `type`/`*_value` shape mirrors exactly what is sent to the agent + // (String=0, Boolean=1, Integer=2, Double=3, Array=4). + #[wasm_bindgen(js_name = "getSpanEventsJson")] + pub fn get_span_events_json(&self, span_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; + serde_json::to_string(&span.span_events) + .map_err(|e| JsValue::from_str(&format!("getSpanEventsJson: {e}"))) + } + + // Trace-level attributes live on the Segment (keyed by segment_id, which + // JS allocates and shares across spans in the same local trace). + #[wasm_bindgen(js_name = "getTraceMetaAttr")] + pub fn get_trace_meta_attr(&self, segment_id: u64, name: &str) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + Ok(cbs.get_segment(&segment_id) + .and_then(|s| s.meta.get(name)) + .map(|v| JsValue::from_str(v.0.as_ref())) + .unwrap_or(JsValue::NULL)) + } + + #[wasm_bindgen(js_name = "getTraceMetricAttr")] + pub fn get_trace_metric_attr(&self, segment_id: u64, name: &str) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + Ok(cbs.get_segment(&segment_id) + .and_then(|s| s.metrics.get(name)) + .map(|v| JsValue::from_f64(*v)) + .unwrap_or(JsValue::NULL)) + } + + #[wasm_bindgen(js_name = "getTraceOrigin")] + pub fn get_trace_origin(&self, segment_id: u64) -> Result { + self.flush_change_queue()?; + let cbs = self.cbs.borrow(); + Ok(cbs.get_segment(&segment_id) + .and_then(|s| s.origin.as_ref()) + .map(|v| JsValue::from_str(v.0.as_ref())) + .unwrap_or(JsValue::NULL)) + } +} + +/// Export WASM memory so JS can create views into it +#[wasm_bindgen(js_name = "getWasmMemory")] +pub fn get_wasm_memory() -> JsValue { + wasm_bindgen::memory() +} + +/// Export OpCode values as a JS object. +/// Values match the `#[repr(u64)]` OpCode enum in libdd-trace-utils. +#[wasm_bindgen(js_name = "getOpCodes")] +pub fn get_op_codes() -> JsValue { + let obj = js_sys::Object::new(); + let entries: &[(&str, u32)] = &[ + ("Create", 0), + ("SetMetaAttr", 1), + ("SetMetricAttr", 2), + ("SetServiceName", 3), + ("SetResourceName", 4), + ("SetError", 5), + ("SetStart", 6), + ("SetDuration", 7), + ("SetType", 8), + ("SetName", 9), + ("SetTraceMetaAttr", 10), + ("SetTraceMetricsAttr", 11), + ("SetTraceOrigin", 12), + ]; + for (name, val) in entries { + js_sys::Reflect::set(&obj, &JsValue::from_str(name), &JsValue::from_f64(*val as f64)) + .expect("Reflect::set on a freshly created object cannot fail"); + } + obj.into() +} + +/// Build a JS `Error` tagged `NativeExporterBuildError` so the host can +/// recognise a fatal exporter-build failure (bad config) and stop retrying, +/// rather than treating it as a transient send error. +fn build_failure_error(msg: &str) -> JsValue { + let err = js_sys::Error::new(msg); + err.set_name("NativeExporterBuildError"); + err.into() +} + +#[wasm_bindgen(js_name = "setStorage")] +pub fn set_storage(new_storage: &JsValue) { + libdatadog_nodejs_capabilities::http::set_storage(new_storage); +} + +#[wasm_bindgen(js_name = "setResponseHeaderObserver")] +pub fn set_response_header_observer(observer: &JsValue) { + libdatadog_nodejs_capabilities::http::set_response_header_observer(observer); +} diff --git a/crates/pipeline/src/span_bytes.rs b/crates/pipeline/src/span_bytes.rs new file mode 100644 index 00000000..3dfaf1a4 --- /dev/null +++ b/crates/pipeline/src/span_bytes.rs @@ -0,0 +1,25 @@ +use libdd_trace_utils::span::SpanBytes; +use serde::Serialize; +use std::borrow::Borrow; +use std::hash::{Hash, Hasher}; + +#[derive(Default, Debug, Eq, PartialEq, Clone, Serialize)] +pub struct SpanBytesImpl(pub Vec); + +impl Hash for SpanBytesImpl { + fn hash(&self, state: &mut H) { + self.0.hash(state); + } +} + +impl Borrow<[u8]> for SpanBytesImpl { + fn borrow(&self) -> &[u8] { + &self.0 + } +} + +impl SpanBytes for SpanBytesImpl { + fn from_static_bytes(value: &'static [u8]) -> Self { + SpanBytesImpl(value.to_vec()) + } +} diff --git a/crates/pipeline/src/span_string.rs b/crates/pipeline/src/span_string.rs new file mode 100644 index 00000000..ee752805 --- /dev/null +++ b/crates/pipeline/src/span_string.rs @@ -0,0 +1,46 @@ +use libdd_trace_utils::span::SpanText; +use serde::Serialize; +use std::borrow::Borrow; +use std::fmt::*; +use std::hash::{Hash, Hasher}; +use std::sync::Arc; + +#[derive(Default, Debug, Eq, PartialEq, Serialize, Clone)] +pub struct SpanString(pub Arc); + +impl Hash for SpanString { + fn hash(&self, state: &mut H) { + // Hash the string content, not the Arc pointer + self.0.as_ref().hash(state); + } +} + +impl Borrow for SpanString { + fn borrow(&self) -> &str { + &self.0 + } +} + +impl SpanText for SpanString { + fn from_static_str(value: &'static str) -> Self { + SpanString(Arc::from(value)) + } +} + +impl From for SpanString { + fn from(s: String) -> SpanString { + SpanString(Arc::from(s)) + } +} + +impl From<&str> for SpanString { + fn from(value: &str) -> SpanString { + SpanString(Arc::from(value)) + } +} + +impl Display for SpanString { + fn fmt(&self, formatter: &mut Formatter) -> Result { + write!(formatter, "{}", self.0) + } +} diff --git a/crates/pipeline/src/stats.rs b/crates/pipeline/src/stats.rs new file mode 100644 index 00000000..24580bb8 --- /dev/null +++ b/crates/pipeline/src/stats.rs @@ -0,0 +1,153 @@ +// Copyright 2026-Present Datadog, Inc. https://www.datadoghq.com/ +// SPDX-License-Identifier: Apache-2.0 + +//! Native stats collection for the pipeline WASM module. +//! +//! Wraps `SpanConcentrator` from `libdd-trace-stats` and provides encoding + +//! HTTP transport for flushing stats to the Datadog agent's `/v0.6/stats` +//! endpoint. + +use std::time::{Duration, SystemTime}; + +/// Wall-clock now() for wasm. `std::time::SystemTime::now()` is unimplemented on +/// `wasm32-unknown-unknown` (it panics/traps), so derive the time from JS +/// `Date.now()` (milliseconds since the Unix epoch). +fn now() -> SystemTime { + SystemTime::UNIX_EPOCH + Duration::from_millis(js_sys::Date::now() as u64) +} + +use bytes::Bytes; +use libdd_capabilities::http::HttpClientCapability; +use libdd_trace_protobuf::pb; +use libdd_trace_stats::span_concentrator::SpanConcentrator; +use libdatadog_nodejs_capabilities::WasmHttpClient; + +use crate::trace_data::WasmTraceData; + +const STATS_ENDPOINT_PATH: &str = "/v0.6/stats"; + +/// Metadata for the stats payload envelope. +pub struct StatsMeta { + pub hostname: String, + pub env: String, + pub version: String, + pub lang: String, + pub tracer_version: String, + pub runtime_id: String, + pub service: String, +} + +/// Manages stats aggregation and flushing. +pub struct StatsCollector { + concentrator: SpanConcentrator, + meta: StatsMeta, + agent_url: String, + sequence: u64, +} + +impl StatsCollector { + /// Create a new stats collector. + pub fn new(bucket_size: Duration, agent_url: String, meta: StatsMeta) -> Self { + StatsCollector { + concentrator: SpanConcentrator::new( + bucket_size, + now(), + vec![ + "client".to_string(), + "server".to_string(), + "producer".to_string(), + "consumer".to_string(), + ], + Vec::new(), + ), + meta, + agent_url, + sequence: 0, + } + } + + /// Add spans to the concentrator for stats aggregation. + /// + /// The spans should already have `_dd.top_level` and `_dd.measured` metrics + /// set (done by `ChangeBufferState::flush_chunk`). + pub fn add_spans(&mut self, spans: &[libdd_trace_utils::span::v04::Span]) { + for span in spans { + self.concentrator.add_span(span); + } + } + + /// Drain aggregated stats into a ready-to-send request, **synchronously**. + /// + /// Returns `Ok(None)` when there is nothing to flush. The concentrator is + /// drained and the sequence advanced as part of this call, so the returned + /// request must be sent (see `send_request`). Kept synchronous and separate + /// from the send so a caller can build the request under a brief borrow and + /// release the collector *before* the async send — leaving it available for + /// `add_spans` while the stats request is in flight. + pub fn prepare_request(&mut self, force: bool) -> Result>, String> { + let buckets = self.concentrator.flush(now(), force); + if buckets.is_empty() { + return Ok(None); + } + + self.sequence += 1; + let payload = encode_stats_payload(&buckets, &self.meta, self.sequence); + + let body = rmp_serde::encode::to_vec_named(&payload) + .map_err(|e| format!("stats msgpack encode error: {e}"))?; + + let stats_url = format!("{}{}", self.agent_url, STATS_ENDPOINT_PATH); + let uri: http::Uri = stats_url + .parse() + .map_err(|e| format!("invalid stats URL: {e}"))?; + + let req = http::Request::builder() + .method(http::Method::PUT) + .uri(uri) + .header("Content-Type", "application/msgpack") + .header("Datadog-Meta-Lang", &self.meta.lang) + .header("Datadog-Meta-Tracer-Version", &self.meta.tracer_version) + .body(Bytes::from(body)) + .map_err(|e| format!("failed to build stats request: {e}"))?; + + Ok(Some(req)) + } + + /// Send a prepared stats request to the agent. Does **not** borrow the + /// collector, so trace export (`add_spans`) can proceed during the await. + pub async fn send_request(req: http::Request) -> Result<(), String> { + let client = WasmHttpClient::new_client(); + client + .request(req) + .await + .map_err(|e| format!("stats send error: {e:?}"))?; + Ok(()) + } +} + +/// Encode flushed stats buckets into a `ClientStatsPayload` for msgpack +/// serialization. +fn encode_stats_payload( + buckets: &[pb::ClientStatsBucket], + meta: &StatsMeta, + sequence: u64, +) -> pb::ClientStatsPayload { + pb::ClientStatsPayload { + hostname: meta.hostname.clone(), + env: meta.env.clone(), + version: meta.version.clone(), + lang: meta.lang.clone(), + tracer_version: meta.tracer_version.clone(), + runtime_id: meta.runtime_id.clone(), + sequence, + stats: buckets.to_vec(), + service: meta.service.clone(), + container_id: String::new(), + tags: Vec::new(), + agent_aggregation: String::new(), + git_commit_sha: String::new(), + image_tag: String::new(), + process_tags: String::new(), + process_tags_hash: 0, + } +} diff --git a/crates/pipeline/src/trace_data.rs b/crates/pipeline/src/trace_data.rs new file mode 100644 index 00000000..94cbcfe2 --- /dev/null +++ b/crates/pipeline/src/trace_data.rs @@ -0,0 +1,16 @@ +use libdd_trace_utils::span::TraceData; +use serde::Serialize; + +use crate::span_bytes::SpanBytesImpl; +use crate::span_string::SpanString; + +// `Serialize` is derived only so the test helper `getSpanEventsJson` can +// serialize `Vec>` (serde's derive on the generic +// `SpanEvent` requires `T: Serialize`). The unit struct carries no data. +#[derive(Clone, Default, Debug, PartialEq, Serialize)] +pub struct WasmTraceData; + +impl TraceData for WasmTraceData { + type Text = SpanString; + type Bytes = SpanBytesImpl; +} diff --git a/crates/pipeline/src/utils.rs b/crates/pipeline/src/utils.rs new file mode 100644 index 00000000..11922621 --- /dev/null +++ b/crates/pipeline/src/utils.rs @@ -0,0 +1,44 @@ +pub trait FromBytes: Sized { + type Bytes: ?Sized; + fn from_bytes(bytes: &[u8]) -> Self; +} + +macro_rules! impl_from_bytes { + ($ty:ty, $len:expr) => { + impl FromBytes for $ty { + type Bytes = $ty; + + // Note that this always does a copy into a new variable. This is + // because the values in the buffer are not aligned. We could save + // ourselves a copy by ensuring alignment from the managed side. + fn from_bytes(bytes: &[u8]) -> Self { + let mut code_buf = [0u8; $len]; + code_buf.copy_from_slice(bytes); + <$ty>::from_le_bytes(code_buf) + } + } + }; +} + +impl_from_bytes!(u128, 16); +impl_from_bytes!(u64, 8); +impl_from_bytes!(f64, 8); +impl_from_bytes!(i64, 8); +impl_from_bytes!(i32, 4); +impl_from_bytes!(u32, 4); + +/// Read a `T` from `buf` at `*index` (little-endian) and advance `*index`. +/// +/// Returns `None` if the buffer is too short, so callers can't index out of +/// bounds — the bounds check lives here rather than relying on every call site. +/// The remaining-bytes form (`size > buf.len() - id`) is overflow-safe. +pub(crate) fn get_num(buf: &[u8], index: &mut usize) -> Option { + let id: usize = *index; + let size = std::mem::size_of::(); + if id > buf.len() || size > buf.len() - id { + return None; + } + let result: T = T::from_bytes(&buf[id..id + size]); + *index += size; + Some(result) +} diff --git a/eslint.config.js b/eslint.config.js index a264f442..e7b67365 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -66,6 +66,27 @@ module.exports = [ 'unicorn/prefer-node-protocol': 'off', }, }, + { + // Test files use the `node:test` runner (describe/it/before/...). eslint-plugin-n + // flags these as "experimental" for the >=18 floor, but they are available on + // every Node version the test matrix runs (18.20+). Test harnesses also pass + // `null` to mirror the real inputs the wasm bindings receive. + files: ['test/**/*.js'], + rules: { + 'n/no-unsupported-features/node-builtins': 'off', + 'unicorn/no-null': 'off', + // Test helpers are commonly scoped inside their describe block. + 'unicorn/consistent-function-scoping': 'off', + }, + }, + { + // Loaded by Rust via `wasm_bindgen(module = ".../http_transport.js")`, so the + // snake_case filename must match the Rust module path. + files: ['**/http_transport.js'], + rules: { + 'unicorn/filename-case': 'off', + }, + }, { ignores: ['build/', 'target/', 'prebuilds/'], }, diff --git a/package.json b/package.json index 6af66370..ca72c8b6 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts", "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts", "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", - "build-wasm": "yarn -s install-wasm-pack && node scripts/build-wasm.js library_config && node scripts/build-wasm.js datadog-js-zstd", + "build-wasm": "yarn -s install-wasm-pack && node scripts/build-wasm.js library_config && node scripts/build-wasm.js datadog-js-zstd && node scripts/build-wasm.js pipeline", "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 9b112d47..4001ea7a 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.87.0" +channel = "1.90.0" profile = "minimal" components = ["clippy", "rustfmt", "rust-src"] diff --git a/scripts/test.sh b/scripts/test.sh index cfd0ca4e..181afd39 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -9,11 +9,38 @@ run_test() { yarn --cwd "$dir" install fi echo "Running $1" - node "$1" + # node:test does not force the process to exit when the event loop is kept + # active by async work that has already settled (e.g. the wasm trace + # exporter's runtime machinery after a flush). For the long-lived real + # consumer that is expected; for the test runner we force a clean exit once + # all tests have finished. Only applies to files that use node:test. + # + # `--test-force-exit` exists on Node >= 20.14/22 but Node 18 rejects it as an + # unknown option. The wasm transport unref's its timeout/backoff timers so the + # process still exits cleanly without the flag; probe for support and degrade + # gracefully on Node 18. + if grep -q "node:test" "$1"; then + if node --test-force-exit --eval '' >/dev/null 2>&1; then + node --test-force-exit "$1" + else + node "$1" + fi + else + node "$1" + fi } # Run top-level test files for f in test/*.js; do + # pipeline.js's wasm exporter keeps the event loop alive after a flush, so it + # needs --test-force-exit. Node 18 lacks that flag AND the wasm HTTP client + # leaves a mock-agent socket open, so node:test cannot exit cleanly there. The + # pipeline wasm is fully exercised by the build-test-wasm job and by the + # Node 20/22/24/26 runs here, so skip it on a Node without --test-force-exit. + if [ "$f" = "test/pipeline.js" ] && ! node --test-force-exit --eval '' >/dev/null 2>&1; then + echo "Skipping $f (no --test-force-exit on this Node; covered by build-test-wasm + newer Node)" + continue + fi run_test "$f" done diff --git a/test/http_transport.js b/test/http_transport.js new file mode 100644 index 00000000..656f7133 --- /dev/null +++ b/test/http_transport.js @@ -0,0 +1,173 @@ +'use strict' + +// Unit tests for the response-header observer hook in the WASM HTTP transport +// shim. The shim is plain CommonJS (no wasm needed), so we drive `httpRequest` +// directly against a local HTTP server. `httpRequest` reads the request head +// from a Uint8Array view over `wasm_memory.buffer`, so we hand it a fake memory +// object containing a well-formed HTTP/1.1 request head. + +const { describe, it, before, after, beforeEach } = require('node:test') +const assert = require('node:assert') +const http = require('node:http') +const os = require('node:os') +const path = require('node:path') +const fs = require('node:fs') + +const transport = require('../crates/capabilities/src/http_transport') + +// Distinctive, multi-byte body so the pooled-buffer slicing in httpRequest +// (the reason for `new Uint8Array(body)` over `body.buffer`) is exercised: +// a small Buffer.concat result lands at a non-zero offset in Node's shared pool. +const RESPONSE_BODY = '{"rate_by_service":{"service:test,env:":0.5}}' + +function fakeWasmMemory (headBytes) { + const buf = new ArrayBuffer(headBytes.length) + new Uint8Array(buf).set(headBytes) + return { buffer: buf } +} + +describe('http_transport response header observer', () => { + let server + let port + + before(async () => { + server = http.createServer((req, res) => { + req.on('data', () => {}) + req.on('end', () => { + res.setHeader('Datadog-Container-Tags-Hash', 'testhash123') + res.end(RESPONSE_BODY) + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + port = server.address().port + }) + + after(() => new Promise(resolve => server.close(resolve))) + + beforeEach(() => { + transport.setResponseHeaderObserver(null) + }) + + function doRequest () { + const head = Buffer.from( + `POST /v0.4/traces HTTP/1.1\r\nHost: 127.0.0.1:${port}\r\n` + + 'Content-Length: 0\r\nConnection: close\r\n\r\n', + 'utf8', + ) + // head occupies [0, head.length); body is empty (offset 0, length 0). + // Empty socketPath -> TCP transport. + return transport.httpRequest('127.0.0.1', port, false, '', 0, head.length, 0, 0, fakeWasmMemory(head)) + } + + it('invokes the observer with the raw response headers', async () => { + let observed + transport.setResponseHeaderObserver((rawHeaders) => { + observed = rawHeaders + }) + + await doRequest() + + assert.ok(Array.isArray(observed), 'observer received the raw headers array') + const idx = observed.findIndex(h => h.toLowerCase() === 'datadog-container-tags-hash') + assert.notStrictEqual(idx, -1, 'container-tags hash header present') + assert.strictEqual(observed[idx + 1], 'testhash123') + }) + + it('still delivers the response when the observer throws, logging the error', async () => { + transport.setResponseHeaderObserver(() => { + throw new Error('boom') + }) + + const originalWrite = process.stderr.write + let logged = '' + process.stderr.write = (chunk) => { + logged += chunk + return true + } + try { + const [status] = await doRequest() + assert.strictEqual(status, 200) + } finally { + process.stderr.write = originalWrite + } + assert.match(logged, /responseHeaderObserver error: boom/) + }) + + it('tolerates an observer throwing a non-Error value', async () => { + // Hardened logging reads only err.message, so a thrown string must not + // crash the transport (it logs `undefined` for the missing message). + transport.setResponseHeaderObserver(() => { + throw 'boom' + }) + + const originalWrite = process.stderr.write + let logged = '' + process.stderr.write = (chunk) => { + logged += chunk + return true + } + try { + const [status] = await doRequest() + assert.strictEqual(status, 200) + } finally { + process.stderr.write = originalWrite + } + assert.match(logged, /responseHeaderObserver error: undefined/) + }) + + it('works when no observer is registered', async () => { + const [status] = await doRequest() + assert.strictEqual(status, 200) + }) + + it('returns the exact response body bytes', async () => { + const [status, , body] = await doRequest() + assert.strictEqual(status, 200) + assert.ok(body instanceof Uint8Array, 'body is a Uint8Array') + // Must be exactly the agent's body — not whole-pool bytes or wrong length. + assert.strictEqual(body.length, Buffer.byteLength(RESPONSE_BODY)) + assert.strictEqual(Buffer.from(body).toString('utf8'), RESPONSE_BODY) + }) +}) + +// Unix-domain-socket transport: a non-empty socketPath must route the request +// over the socket instead of TCP. Skipped on Windows (no AF_UNIX path here). +describe('http_transport unix socket', { skip: process.platform === 'win32' }, () => { + let server + let socketPath + + before(async () => { + socketPath = path.join(os.tmpdir(), `libdd-uds-test-${process.pid}-${Date.now()}.sock`) + try { + fs.unlinkSync(socketPath) + } catch { /* unlink is best-effort */ } + server = http.createServer((req, res) => { + req.on('data', () => {}) + req.on('end', () => { + res.end(RESPONSE_BODY) + }) + }) + await new Promise(resolve => server.listen(socketPath, resolve)) + }) + + after(() => new Promise(resolve => server.close(() => { + try { + fs.unlinkSync(socketPath) + } catch { /* unlink is best-effort */ } + resolve() + }))) + + it('delivers the request over a unix socket and returns the response', async () => { + const head = Buffer.from( + 'POST /v0.4/traces HTTP/1.1\r\nHost: localhost\r\n' + + 'Content-Length: 0\r\nConnection: close\r\n\r\n', + 'utf8', + ) + // host/port empty/0; socketPath drives the connection. + const [status, , body] = await transport.httpRequest( + '', 0, false, socketPath, 0, head.length, 0, 0, fakeWasmMemory(head), + ) + assert.strictEqual(status, 200) + assert.strictEqual(Buffer.from(body).toString('utf8'), RESPONSE_BODY) + }) +}) diff --git a/test/pipeline.js b/test/pipeline.js index 239b3de8..68273054 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -1,10 +1,1041 @@ 'use strict' +const { describe, it, before, beforeEach } = require('node:test') +const assert = require('node:assert') +const crypto = require('node:crypto') + const pipeline = require('..').maybeLoad('pipeline') +// The pipeline binding is wasm-only and is absent in the native +// (action-prebuildify) test matrix, where `maybeLoad` returns undefined. Skip +// the suite there instead of crashing on the destructure below; the pipeline +// wasm is built and these tests run for real in the `build-test-wasm` job. +const skip = pipeline === undefined +const { WasmSpanState } = pipeline ?? {} +const OpCode = pipeline ? pipeline.getOpCodes() : {} +const wasmMemory = pipeline ? pipeline.getWasmMemory() : undefined + +function getRandomBytes (byteCount) { + return new Uint8Array(crypto.randomBytes(byteCount)) +} + +function bytesToBigInt (bytes) { + let val = 0n + for (const byte of bytes) { + val = (val << 8n) | BigInt(byte) + } + return val +} + +// The Span and NativeSpansInterface classes act as a sketch of what should +// be implemented in dd-trace-js. + +// TODO should NativeSpansInterface actually be implemented in this package? + +class Span { + constructor (nativeSpans, traceId, parentId) { + this.nativeSpans = nativeSpans + this.traceId = traceId || [getRandomBytes(8), getRandomBytes(8)] + this.parentId = parentId || new Uint8Array(8) + this.spanId = getRandomBytes(8) + // Spans are addressed by their span_id (u64). Operations carry the raw + // 8-byte id in their header; getters take the numeric id as a BigInt. + this.spanIdBig = bytesToBigInt(this.spanId) + // Trace-level attributes live on a Segment (a local trace chunk). JS owns + // segment_id allocation and shares it across spans in the same trace. + this.segmentId = nativeSpans.allocSegment(this.traceId) + this._startTime = BigInt(Date.now()) * 1_000_000n + + this.nativeSpans.queueOp(OpCode.Create, this.spanId, ['u128', this.traceId], ['u64n', this.segmentId], ['u64', this.parentId]) + this.nativeSpans.queueOp(OpCode.SetStart, this.spanId, ['i64', this._startTime]) + } + + setTag (key, value) { + if (typeof value === 'number') { + this.nativeSpans.queueOp(OpCode.SetMetricAttr, this.spanId, key, ['f64', value]) + } else { + this.nativeSpans.queueOp(OpCode.SetMetaAttr, this.spanId, key, value) + } + return this + } + + getTag (key) { + return this.nativeSpans.state.getMetaAttr(this.spanIdBig, key) + ?? this.nativeSpans.state.getMetricAttr(this.spanIdBig, key) + } + + setTraceTag (key, value) { + const opcode = OpCode[typeof value === 'number' ? 'SetTraceMetricsAttr' : 'SetTraceMetaAttr'] + if (typeof value === 'number') { + value = ['f64', value] + } + this.nativeSpans.queueOp(opcode, this.spanId, key, value) + return this + } + + getTraceTag (key) { + return this.nativeSpans.state.getTraceMetaAttr(this.segmentId, key) + ?? this.nativeSpans.state.getTraceMetricAttr(this.segmentId, key) + } + + setTraceOrigin (origin) { + this.nativeSpans.queueOp(OpCode.SetTraceOrigin, this.spanId, origin) + return this + } + + getTraceOrigin () { + return this.nativeSpans.state.getTraceOrigin(this.segmentId) + } + + setMetaStruct (key, bytes) { + this.nativeSpans.state.setMetaStruct(this.spanIdBig, key, bytes) + return this + } + + getMetaStruct (key) { + return this.nativeSpans.state.getMetaStruct(this.spanIdBig, key) + } + + addSpanEvent (name, timeUnixNano, attributes = {}) { + this.nativeSpans.state.addSpanEvent( + this.spanIdBig, + name, + BigInt(timeUnixNano), + encodeSpanEventAttrs(attributes), + ) + return this + } + + getSpanEvents () { + return JSON.parse(this.nativeSpans.state.getSpanEventsJson(this.spanIdBig)) + } + + finish () { + this.duration = BigInt(Date.now()) * 1_000_000n - this._startTime + return this + } +} + +const spanAccessors = { + // [getterName, opCode, valueType (null for string)] + name: ['getName', 'SetName', null], + service: ['getServiceName', 'SetServiceName', null], + resource: ['getResourceName', 'SetResourceName', null], + type: ['getType', 'SetType', null], + error: ['getError', 'SetError', 'i32'], + start: ['getStart', null, null], + duration: ['getDuration', 'SetDuration', 'i64'], +} + +for (const [prop, [getter, setter, valueType]] of Object.entries(spanAccessors)) { + Object.defineProperty(Span.prototype, prop, { + get () { + return this.nativeSpans.state[getter](this.spanIdBig) + }, + set (val) { + val = valueType ? [valueType, val] : val + this.nativeSpans.queueOp(OpCode[setter], this.spanId, val) + }, + }) +} + +const CHANGE_QUEUE_SIZE = 64 * 1024 +const STRING_TABLE_INPUT_SIZE = 10 * 1024 + +class NativeSpansInterface { + constructor (options = {}) { + this.flushBuffer = Buffer.alloc(10 * 1024) + + this.cqbIndex = 8 // Start at 8 since first u64 is count + this.cqbCount = 0 + this.stibCount = 0 + this.segmentCount = 0 // Monotonic segment_id allocator + this.segmentByTrace = new Map() // trace key -> segment_id (BigInt) + this.stringMap = new Map() + + this.state = new WasmSpanState( + options.agentUrl || process.env.AGENT_URL || 'http://127.0.0.1:8126', + options.tracerVersion || '1.0.0', + options.lang || 'nodejs', + options.langVersion || process.version, + options.langInterpreter || 'v8', + CHANGE_QUEUE_SIZE, + STRING_TABLE_INPUT_SIZE, + options.pid ?? process.pid, + options.tracerService || 'test-service', + options.statsEnabled ?? false, + options.hostname || 'test-host', + options.env || 'test-env', + options.appVersion || '1.0.0', + options.runtimeId || '00000000-0000-0000-0000-000000000000', + ) + + // Get pointers into WASM memory for direct buffer access + this._wasmMemory = wasmMemory + this._cqbPtr = this.state.change_queue_ptr() + this._refreshViews() + } -if (pipeline) { - pipeline.init_trace_exporter('127.0.0.1', 8126, 10_000, '1.0', 'nodejs', '18.0', 'v8') + _refreshViews () { + this._cqbView = new DataView(this._wasmMemory.buffer, this._cqbPtr) + this._cqbBytes = new Uint8Array(this._wasmMemory.buffer, this._cqbPtr) + } - const ret = pipeline.send_traces(Buffer.alloc(1), 1) - console.log(ret) + resetChangeQueue () { + this.cqbIndex = 8 + this.cqbCount = 0 + // Check if WASM memory was detached/grown + if (this._wasmMemory.buffer !== this._cqbView.buffer) { + this._refreshViews() + } + this._cqbView.setUint32(0, 0, true) + this._cqbView.setUint32(4, 0, true) + } + + flushChangeQueue () { + this.state.flushChangeQueue() + this.resetChangeQueue() + } + + getStringId (str) { + let id = this.stringMap.get(str) + if (typeof id === 'number') return id + + id = this.stibCount++ + this.stringMap.set(str, id) + this.state.stringTableInsertOne(id, str) + return id + } + + // Write 8 big-endian bytes as a little-endian u64 into the change buffer + _writeBytesLE (bytes, offset) { + const buf = this._cqbBytes + for (let i = 0; i < 8; i++) { + buf[offset + i] = bytes[7 - i] + } + } + + // Allocate (or reuse) a segment_id for a given trace. Spans sharing a trace + // share a segment so trace-level attributes are visible across them. + allocSegment (traceId) { + const key = traceId.map(b => Buffer.from(b).toString('hex')).join('') + let id = this.segmentByTrace.get(key) + if (id === undefined) { + id = BigInt(this.segmentCount++) + this.segmentByTrace.set(key, id) + } + return id + } + + queueOp (op, spanId, ...args) { + // Check if WASM memory was detached/grown + if (this._wasmMemory.buffer !== this._cqbView.buffer) { + this._refreshViews() + } + + // Check if Rust flushed the queue (wrote 0 to count position) + if (this._cqbView.getUint32(0, true) === 0 && this.cqbCount > 0) { + this.cqbIndex = 8 + this.cqbCount = 0 + } + + const view = this._cqbView + // Op header: opcode (u16 LE) + span_id (u64 LE) = 10 bytes. Rust reads the + // opcode as a u16, then the span_id as a u64. + view.setUint16(this.cqbIndex, op, true) + this.cqbIndex += 2 + this._writeBytesLE(spanId, this.cqbIndex) + this.cqbIndex += 8 + + for (const arg of args) { + if (typeof arg === 'string') { + const stringId = this.getStringId(arg) + view.setUint32(this.cqbIndex, stringId, true) + this.cqbIndex += 4 + } else { + const [typ, num] = arg + switch (typ) { + case 'u64': { + this._writeBytesLE(num, this.cqbIndex) + this.cqbIndex += 8 + break + } + case 'u64n': { + view.setBigUint64(this.cqbIndex, BigInt(num), true) + this.cqbIndex += 8 + break + } + case 'u32n': { // raw, pre-resolved string-table id + view.setUint32(this.cqbIndex, num, true) + this.cqbIndex += 4 + break + } + case 'u128': { + this._writeBytesLE(num[0], this.cqbIndex) + this.cqbIndex += 8 + this._writeBytesLE(num[1], this.cqbIndex) + this.cqbIndex += 8 + break + } + case 'i64': { + view.setBigInt64(this.cqbIndex, num, true) + this.cqbIndex += 8 + break + } + case 'i32': { + view.setInt32(this.cqbIndex, num, true) + this.cqbIndex += 4 + break + } + case 'f64': { + view.setFloat64(this.cqbIndex, num, true) + this.cqbIndex += 8 + break + } + default: { + throw new Error('unsupported number type: ' + typ) + } + } + } + } + + this.cqbCount++ + view.setBigUint64(0, BigInt(this.cqbCount), true) + } + + createSpan (traceId, parentId) { + return new Span(this, traceId, parentId) + } + + async flushSpans (...spans) { + this.flushBuffer.fill(0) // TODO is this necessary, since we're sending the length? + let index = 0 + for (const span of spans) { + // The chunk buffer carries u64 span IDs (8 bytes LE each). + const spanId = span.spanId ?? span + for (let i = 0; i < 8; i++) { + this.flushBuffer[index + i] = spanId[7 - i] + } + index += 8 + } + const hasSpans = this.state.prepareChunk(spans.length, true, this.flushBuffer) + if (!hasSpans) return false + return this.state.sendPreparedChunk() + } } + +// Build the flat span-event attribute buffer consumed by the Rust decoder +// (`decode_span_event_attributes` in crates/pipeline/src/lib.rs). This mirrors +// what dd-trace-js's `addSpanEvent` wrapper produces. Tags: String=0, +// Boolean=1, Integer=2, Double=3, Array=4 (matching libdatadog's +// AttributeArrayValue discriminants). +function encodeSpanEventAttrs (attributes) { + const enc = new TextEncoder() + const chunks = [] + const u32 = (n) => { + const b = Buffer.alloc(4) + b.writeUInt32LE(n >>> 0, 0) + return b + } + const i64 = (n) => { + const b = Buffer.alloc(8) + b.writeBigInt64LE(BigInt(n), 0) + return b + } + const f64 = (n) => { + const b = Buffer.alloc(8) + b.writeDoubleLE(n, 0) + return b + } + const str = (s) => { + const sb = Buffer.from(enc.encode(s)) + return Buffer.concat([u32(sb.length), sb]) + } + // Returns `[tag][value]` — used both for single values and array items. + const scalar = (v) => { + if (typeof v === 'string') return Buffer.concat([Buffer.from([0]), str(v)]) + if (typeof v === 'boolean') return Buffer.concat([Buffer.from([1]), Buffer.from([v ? 1 : 0])]) + if (typeof v === 'number') { + return Number.isInteger(v) + ? Buffer.concat([Buffer.from([2]), i64(v)]) + : Buffer.concat([Buffer.from([3]), f64(v)]) + } + throw new TypeError(`unsupported span-event attribute value: ${typeof v}`) + } + for (const [key, value] of Object.entries(attributes)) { + chunks.push(str(key)) + if (Array.isArray(value)) { + chunks.push(Buffer.from([4]), u32(value.length)) + for (const item of value) chunks.push(scalar(item)) + } else { + chunks.push(scalar(value)) + } + } + return new Uint8Array(Buffer.concat(chunks)) +} + +describe('pipeline', { skip }, () => { + let nativeSpans + + before(() => { + nativeSpans = new NativeSpansInterface() + }) + + beforeEach(() => { + nativeSpans.resetChangeQueue() + }) + + describe('module exports', () => { + it('should export WasmSpanState', () => { + assert(WasmSpanState) + }) + + it('should export OpCode', () => { + assert(OpCode) + }) + + it('should export all OpCodes', () => { + const expectedOpCodes = [ + 'Create', 'SetMetaAttr', 'SetMetricAttr', 'SetServiceName', + 'SetResourceName', 'SetError', 'SetStart', 'SetDuration', + 'SetType', 'SetName', 'SetTraceMetaAttr', 'SetTraceMetricsAttr', + 'SetTraceOrigin', + ] + for (const opCode of expectedOpCodes) { + assert.strictEqual(typeof OpCode[opCode], 'number') + } + }) + }) + + describe('WasmSpanState', () => { + it('should create an instance', () => { + assert(nativeSpans.state instanceof WasmSpanState) + }) + }) + + describe('span creation', () => { + it('should create a span with basic attributes', () => { + const span = nativeSpans.createSpan() + span.name = 'test-span' + span.service = 'test-service' + span.resource = '/api/test' + span.type = 'web' + span.error = 0 + + assert.strictEqual(span.name, 'test-span') + assert.strictEqual(span.service, 'test-service') + assert.strictEqual(span.resource, '/api/test') + assert.strictEqual(span.type, 'web') + assert.strictEqual(span.error, 0) + }) + + it('should create a child span with parent', () => { + const parent = nativeSpans.createSpan() + parent.name = 'parent-span' + + const child = nativeSpans.createSpan(parent.traceId, parent.spanId) + child.name = 'child-span' + + assert.strictEqual(child.name, 'child-span') + }) + }) + + describe('span attributes', () => { + it('should set and get string tags', () => { + const span = nativeSpans.createSpan() + span.setTag('http.method', 'GET') + span.setTag('http.url', 'http://example.com/api') + + assert.strictEqual(span.getTag('http.method'), 'GET') + assert.strictEqual(span.getTag('http.url'), 'http://example.com/api') + }) + + it('should set and get numeric tags', () => { + const span = nativeSpans.createSpan() + span.setTag('http.status_code', 200) + span.setTag('custom.metric', 3.141_59) + + assert.strictEqual(span.getTag('http.status_code'), 200) + assert.strictEqual(span.getTag('custom.metric'), 3.141_59) + }) + + it('should set and get error state', () => { + const span = nativeSpans.createSpan() + span.error = 0 + assert.strictEqual(span.error, 0) + + span.error = 1 + assert.strictEqual(span.error, 1) + }) + }) + + describe('meta_struct', () => { + it('round-trips raw bytes by key', () => { + const span = nativeSpans.createSpan() + const value = new Uint8Array([0x82, 0xA1, 0x61, 0x01, 0xA1, 0x62, 0x02]) + span.setMetaStruct('appsec', value) + + assert.deepStrictEqual(span.getMetaStruct('appsec'), value) + }) + + it('returns null for an unset meta_struct key', () => { + const span = nativeSpans.createSpan() + assert.strictEqual(span.getMetaStruct('missing'), null) + }) + + it('overwrites an existing key on repeated set', () => { + const span = nativeSpans.createSpan() + span.setMetaStruct('k', new Uint8Array([1, 2, 3])) + span.setMetaStruct('k', new Uint8Array([9])) + + assert.deepStrictEqual(span.getMetaStruct('k'), new Uint8Array([9])) + }) + }) + + describe('span_events', () => { + it('appends an event with no attributes', () => { + const span = nativeSpans.createSpan() + span.addSpanEvent('exception', 1_727_211_691_770_716_000n) + + const events = span.getSpanEvents() + assert.strictEqual(events.length, 1) + assert.strictEqual(events[0].name, 'exception') + assert.strictEqual(events[0].time_unix_nano, 1_727_211_691_770_716_000) + // Empty attributes are skipped by libdatadog's serializer. + assert.strictEqual(events[0].attributes, undefined) + }) + + it('round-trips scalar attributes of every type with correct type tags', () => { + const span = nativeSpans.createSpan() + span.addSpanEvent('evt', 1000n, { + s: 'hello', + b: true, + i: 42, + d: 3.5, + }) + + const [event] = span.getSpanEvents() + assert.strictEqual(event.name, 'evt') + assert.strictEqual(event.time_unix_nano, 1000) + // type tags: String=0, Boolean=1, Integer=2, Double=3 + assert.deepStrictEqual(event.attributes.s, { type: 0, string_value: 'hello' }) + assert.deepStrictEqual(event.attributes.b, { type: 1, bool_value: true }) + assert.deepStrictEqual(event.attributes.i, { type: 2, int_value: 42 }) + assert.deepStrictEqual(event.attributes.d, { type: 3, double_value: 3.5 }) + }) + + it('round-trips an array attribute (type 4) with typed items', () => { + const span = nativeSpans.createSpan() + span.addSpanEvent('evt', 1n, { tags: ['a', 'b'], nums: [1, 2, 3] }) + + const [event] = span.getSpanEvents() + assert.deepStrictEqual(event.attributes.tags, { + type: 4, + array_value: { values: [{ type: 0, string_value: 'a' }, { type: 0, string_value: 'b' }] }, + }) + assert.deepStrictEqual(event.attributes.nums, { + type: 4, + array_value: { values: [{ type: 2, int_value: 1 }, { type: 2, int_value: 2 }, { type: 2, int_value: 3 }] }, + }) + }) + + it('appends multiple events in order', () => { + const span = nativeSpans.createSpan() + span.addSpanEvent('first', 1n) + span.addSpanEvent('second', 2n, { k: 'v' }) + + const events = span.getSpanEvents() + assert.strictEqual(events.length, 2) + assert.strictEqual(events[0].name, 'first') + assert.strictEqual(events[1].name, 'second') + assert.deepStrictEqual(events[1].attributes.k, { type: 0, string_value: 'v' }) + }) + + it('returns an empty array for a span with no events', () => { + const span = nativeSpans.createSpan() + assert.deepStrictEqual(span.getSpanEvents(), []) + }) + + it('rejects a truncated attribute buffer instead of panicking', () => { + const span = nativeSpans.createSpan() + // key_len=5 but no key bytes follow → bounded read must error. + const bad = new Uint8Array([5, 0, 0, 0]) + assert.throws( + () => span.nativeSpans.state.addSpanEvent(span.spanIdBig, 'evt', 1n, bad), + /truncated span-event attribute buffer/, + ) + }) + + it('rejects an overflowing key_len without trapping (wasm32 usize)', () => { + const span = nativeSpans.createSpan() + // key_len = 0xFFFFFFFF: on wasm32 `idx + key_len` would wrap and slip + // past the bound, trapping on the slice. The remaining-byte form must + // reject it as a truncated buffer instead. + const bad = new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00]) + assert.throws( + () => span.nativeSpans.state.addSpanEvent(span.spanIdBig, 'evt', 1n, bad), + /truncated span-event attribute buffer/, + ) + }) + }) + + describe('span timing', () => { + it('should set and get start time', () => { + const span = nativeSpans.createSpan() + assert(span.start > 0n) // populated from the constructor's SetStart (BigInt ns) + + // Verify an exact round-trip. getStart returns an f64, so real ns + // timestamps (> 2^53) can't be checked to the nanosecond; use a small, + // exactly-representable value so an off-by-one would actually be caught. + nativeSpans.queueOp(OpCode.SetStart, span.spanId, ['i64', 12_345n]) + assert.strictEqual(span.start, 12_345n) + }) + + it('should set and get duration', () => { + const duration = 1_000_000n + const span = nativeSpans.createSpan() + span.duration = duration + // getDuration returns i64 nanoseconds as a BigInt (no f64 truncation). + assert.strictEqual(span.duration, duration) + }) + }) + + describe('trace-level attributes', () => { + it('should set and get trace string tags', () => { + const span = nativeSpans.createSpan() + span.setTraceTag('_dd.p.dm', '-0') + assert.strictEqual(span.getTraceTag('_dd.p.dm'), '-0') + }) + + it('should set and get trace numeric tags', () => { + const span = nativeSpans.createSpan() + span.setTraceTag('_sampling_priority_v1', 1) + assert.strictEqual(span.getTraceTag('_sampling_priority_v1'), 1) + }) + + it('should set and get trace origin', () => { + const span = nativeSpans.createSpan() + span.setTraceOrigin('synthetics') + assert.strictEqual(span.getTraceOrigin(), 'synthetics') + }) + + it('should share trace attributes across spans in same trace', () => { + const parent = nativeSpans.createSpan() + parent.setTraceTag('shared_key', 'shared_value') + parent.setTraceTag('shared_metric', 42) + parent.setTraceOrigin('lambda') + + const child = nativeSpans.createSpan(parent.traceId, parent.spanId) + + assert.strictEqual(child.getTraceTag('shared_key'), 'shared_value') + assert.strictEqual(child.getTraceTag('shared_metric'), 42) + assert.strictEqual(child.getTraceOrigin(), 'lambda') + }) + + it('should isolate trace attributes across different traces', () => { + const a = nativeSpans.createSpan() + a.setTraceTag('iso_key', 'a_value') + a.setTraceOrigin('origin-a') + + // A span in a DIFFERENT trace must not see trace a's segment data. + const b = nativeSpans.createSpan() + assert.notStrictEqual(a.segmentId, b.segmentId) + assert.strictEqual(b.getTraceTag('iso_key'), null) + assert.strictEqual(b.getTraceOrigin(), null) + }) + }) + + describe('absent values and error handling', () => { + it('returns null for tags that were never set', () => { + const span = nativeSpans.createSpan() + assert.strictEqual(nativeSpans.state.getMetaAttr(span.spanIdBig, 'never-set'), null) + assert.strictEqual(nativeSpans.state.getMetricAttr(span.spanIdBig, 'never-set'), null) + assert.strictEqual(span.getTag('never-set'), null) + }) + + it('throws when reading an unknown span id', () => { + // Convention: span-level getters throw on an unknown span_id, while + // trace-level getters return null for an unknown segment. All span + // getters share the get_span error path, so assert each one throws. + const bogus = 0xDE_AD_BE_EFn + for (const getter of [ + 'getName', 'getServiceName', 'getResourceName', + 'getType', 'getError', 'getStart', 'getDuration', + ]) { + assert.throws(() => nativeSpans.state[getter](bogus), `${getter} should throw`) + } + }) + }) + + describe('default meta', () => { + it('applies default meta to new spans and validates inputs', () => { + // Fresh interface so the default doesn't leak into the shared instance. + const ns = new NativeSpansInterface() + ns.state.setDefaultMeta(['dk', 'dv']) + const span = ns.createSpan() + assert.strictEqual(span.getTag('dk'), 'dv') + + // Non-string key or value must throw. + assert.throws(() => ns.state.setDefaultMeta(['k', 123])) + assert.throws(() => ns.state.setDefaultMeta([123, 'v'])) + // A trailing unpaired key is ignored, not an error. + assert.doesNotThrow(() => ns.state.setDefaultMeta(['lonely'])) + }) + }) + + describe('sampling', () => { + it('should not expose sample() in WASM module', () => { + // Sampling is handled JS-side; the WASM module does not expose a sample() method + assert.strictEqual(typeof nativeSpans.state.sample, 'undefined') + }) + }) + + describe('string table', () => { + it('should evict strings from the table', () => { + const testKey = 'eviction-test-key-' + Math.random() + const testVal = 'eviction-test-value' + const span = nativeSpans.createSpan() + span.setTag(testKey, testVal) + + assert.strictEqual(span.getTag(testKey), testVal) + + const keyId = nativeSpans.stringMap.get(testKey) + assert.strictEqual(typeof keyId, 'number', 'key was interned in the string table') + nativeSpans.state.stringTableEvict(keyId) + + // Evicting the key from the string table must not affect spans that have + // already resolved it: the tag was materialized onto the span at flush + // time, so the span keeps its own copy of the value. + assert.strictEqual(span.getTag(testKey), testVal) + }) + + it('bulk-inserts strings via stringTableInsertMany', () => { + // Wire format per entry: [key:u32 LE][cstr bytes][NUL]. Two entries + // exercise the NUL-terminator advance (a missing +1 would misparse the + // second entry). + const ptr = nativeSpans.state.string_table_input_ptr() + const view = new DataView(wasmMemory.buffer, ptr) + const bytes = new Uint8Array(wasmMemory.buffer, ptr) + const entries = [[60_001, 'bulk-key'], [60_002, 'bulk-val']] + let off = 0 + for (const [key, str] of entries) { + view.setUint32(off, key, true) + off += 4 + for (let i = 0; i < str.length; i++) bytes[off++] = str.codePointAt(i) + bytes[off++] = 0 + } + nativeSpans.state.stringTableInsertMany(entries.length) + + // Reference the pre-inserted ids directly (raw u32, not via getStringId) + // in a SetMetaAttr op; at flush they must resolve to the bulk strings. + const span = nativeSpans.createSpan() + nativeSpans.queueOp(OpCode.SetMetaAttr, span.spanId, ['u32n', 60_001], ['u32n', 60_002]) + assert.strictEqual(span.getTag('bulk-key'), 'bulk-val') + }) + + it('rejects a malformed (non-terminated) stringTableInsertMany entry', () => { + const ptr = nativeSpans.state.string_table_input_ptr() + const len = nativeSpans.state.string_table_input_len() + const view = new DataView(wasmMemory.buffer, ptr) + const bytes = new Uint8Array(wasmMemory.buffer, ptr, len) + bytes.fill(0xFF) // no NUL terminator anywhere in the buffer + view.setUint32(0, 70_001, true) + // from_bytes_until_nul finds no terminator -> error surfaced as a throw, + // not an out-of-bounds read. + assert.throws(() => nativeSpans.state.stringTableInsertMany(1)) + }) + + it('rejects a stringTableInsertMany count larger than the buffer holds', () => { + const ptr = nativeSpans.state.string_table_input_ptr() + const len = nativeSpans.state.string_table_input_len() + const view = new DataView(wasmMemory.buffer, ptr) + const bytes = new Uint8Array(wasmMemory.buffer, ptr, len) + bytes.fill(0) + // One valid entry consuming almost the whole buffer, so claiming a count + // of 2 makes the second u32 key read run past the end -> bounded error, + // not an out-of-bounds panic. + view.setUint32(0, 71_000, true) + for (let i = 4; i < len - 1; i++) bytes[i] = 0x61 // 'a' + bytes[len - 1] = 0 // NUL terminator at the very end + assert.throws(() => nativeSpans.state.stringTableInsertMany(2), /exceeds the entries/) + }) + }) + + describe('input validation', () => { + it('throws when prepareChunk len exceeds the chunk size', () => { + // 100 span ids would need 800 bytes; the chunk only has 8. + assert.throws(() => nativeSpans.state.prepareChunk(100, true, Buffer.alloc(8))) + }) + + it('flushSpans with no spans is a no-op returning false', async () => { + assert.strictEqual(await nativeSpans.flushSpans(), false) + }) + }) + + describe('flush to agent', () => { + it('should flush spans to a (mock) agent', async () => { + // Stand up a throwaway HTTP server acting as the agent so the flush path + // (prepareChunk -> build exporter -> serialize -> send) is exercised + // end-to-end in CI, instead of being skipped when no agent is present. + const http = require('node:http') + const payloads = [] + const server = http.createServer((req, res) => { + const chunks = [] + req.on('data', c => chunks.push(c)) + req.on('end', () => { + payloads.push(Buffer.concat(chunks)) + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}` }) + const span = ns.createSpan() + span.name = 'flush-test-span' + span.service = 'test-service' + span.resource = 'test-resource' + span.type = 'web' + span.duration = 1_000_000n + + try { + const result = await ns.flushSpans(span) + assert(result, 'exporter returned an agent response') + assert(payloads.length > 0, 'agent received a trace payload') + assert(payloads[0].length > 0, 'trace payload is non-empty') + } finally { + server.closeAllConnections?.() + server.close() + } + }) + }) + + describe('v0.5 output format', () => { + // Spin up a mock agent that records the request path, so we can assert the + // exporter targets /v0.4/traces by default and /v0.5/traces after + // setUseV05(true). (v0.5 itself drops meta_struct/span_events by design; + // here we only verify endpoint routing, which is the observable behavior.) + async function flushAndCapturePath (useV05) { + const http = require('node:http') + const seen = [] + const server = http.createServer((req, res) => { + req.on('data', () => {}) + req.on('end', () => { + seen.push({ method: req.method, url: req.url }) + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}` }) + if (useV05) ns.state.setUseV05(true) + const span = ns.createSpan() + span.name = 'v05-span' + span.service = 'test-service' + span.resource = 'test-resource' + span.type = 'web' + span.duration = 1_000_000n + try { + await ns.flushSpans(span) + return seen.find(r => r.method === 'POST') + } finally { + server.closeAllConnections?.() + server.close() + } + } + + it('targets /v0.4/traces by default', async () => { + const req = await flushAndCapturePath(false) + assert.ok(req, 'agent received a POST') + assert.strictEqual(req.url, '/v0.4/traces') + }) + + it('targets /v0.5/traces after setUseV05(true)', async () => { + const req = await flushAndCapturePath(true) + assert.ok(req, 'agent received a POST') + assert.strictEqual(req.url, '/v0.5/traces') + }) + + it('exports via OTLP HTTP after setOtlpEndpoint(url)', async () => { + // libdatadog maps its internal traces to OTLP and POSTs them to the + // configured endpoint instead of the Datadog agent. Confirms the OTLP + // path runs end-to-end over the wasm HTTP transport. + const http = require('node:http') + const seen = [] + const server = http.createServer((req, res) => { + const chunks = [] + req.on('data', c => chunks.push(c)) + req.on('end', () => { + seen.push({ + method: req.method, + url: req.url, + ct: req.headers['content-type'], + len: Buffer.concat(chunks).length, + }) + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}` }) + ns.state.setOtlpEndpoint(`http://127.0.0.1:${port}/v1/traces`) + const span = ns.createSpan() + span.name = 'otlp-span' + span.service = 'test-service' + span.resource = 'test-resource' + span.type = 'web' + span.duration = 1_000_000n + try { + await ns.flushSpans(span) + const req = seen.find(r => r.method === 'POST') + assert.ok(req, 'OTLP endpoint received a POST') + assert.strictEqual(req.url, '/v1/traces') + // No setOtlpProtocol call — pins the default wire protocol (http/json). + assert.match(req.ct || '', /json/) + assert.ok(req.len > 0, 'OTLP body is non-empty') + } finally { + server.closeAllConnections?.() + server.close() + } + }) + + it('honors setOtlpProtocol(http/protobuf) and setOtlpHeaders', async () => { + const http = require('node:http') + let captured + const server = http.createServer((req, res) => { + req.on('data', () => {}) + req.on('end', () => { + if (req.method === 'POST') { + captured = { + ct: req.headers['content-type'], + auth: req.headers.authorization, + custom: req.headers['x-custom'], + } + } + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}` }) + ns.state.setOtlpEndpoint(`http://127.0.0.1:${port}/v1/traces`) + ns.state.setOtlpProtocol('http/protobuf') + // Two header pairs plus a trailing unpaired element (odd length): both + // pairs are applied and the stray 'ignored-no-pair' is dropped. + ns.state.setOtlpHeaders(['authorization', 'Bearer test-token', 'x-custom', 'cval', 'ignored-no-pair']) + const span = ns.createSpan() + span.name = 'otlp-span' + span.service = 'test-service' + span.resource = 'test-resource' + span.type = 'web' + span.duration = 1_000_000n + try { + await ns.flushSpans(span) + assert.ok(captured, 'OTLP endpoint received a POST') + assert.match(captured.ct || '', /protobuf/) + assert.strictEqual(captured.auth, 'Bearer test-token') + assert.strictEqual(captured.custom, 'cval') + } finally { + server.closeAllConnections?.() + server.close() + } + }) + + it('rejects unsupported OTLP protocols (e.g. grpc)', () => { + const ns = new NativeSpansInterface({ agentUrl: 'http://127.0.0.1:8126' }) + assert.throws(() => ns.state.setOtlpProtocol('grpc'), /setOtlpProtocol|not supported/) + }) + }) + + describe('client-side stats', () => { + it('aggregates and flushes stats to /v0.6/stats', async () => { + const http = require('node:http') + const seen = [] + const server = http.createServer((req, res) => { + const chunks = [] + req.on('data', c => chunks.push(c)) + req.on('end', () => { + seen.push({ method: req.method, url: req.url, len: Buffer.concat(chunks).length }) + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + + // statsEnabled:true builds the StatsCollector; prepareChunk feeds spans + // into it, and flushStats(true) force-flushes to /v0.6/stats. + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}`, statsEnabled: true }) + const span = ns.createSpan() + span.name = 'stats-span' + span.service = 'stats-svc' + span.resource = '/stats' + span.type = 'web' + span.duration = 5_000_000n + + try { + await ns.flushSpans(span) + const sent = await ns.state.flushStats(true) + assert.strictEqual(sent, true, 'flushStats reported a send') + const statsReq = seen.find(r => r.url === '/v0.6/stats') + assert.ok(statsReq, 'agent received a /v0.6/stats request') + assert.strictEqual(statsReq.method, 'PUT') + assert.ok(statsReq.len > 0, 'stats payload is non-empty') + + // Nothing new aggregated -> a second forced flush is a no-op. + assert.strictEqual(await ns.state.flushStats(true), false, 'second flush has nothing to send') + } finally { + server.closeAllConnections?.() + server.close() + } + }) + + it('flushStats returns false when stats are disabled', async () => { + const ns = new NativeSpansInterface({ statsEnabled: false }) + assert.strictEqual(await ns.state.flushStats(true), false) + }) + }) + + describe('send re-entrancy', () => { + it('rejects an overlapping sendPreparedChunk call', async () => { + const http = require('node:http') + const server = http.createServer((req, res) => { + req.resume() + req.on('end', () => { + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}` }) + const span = ns.createSpan() + span.name = 'reentrancy' + ns.flushBuffer.fill(0) + for (let i = 0; i < 8; i++) ns.flushBuffer[i] = span.spanId[7 - i] + assert.ok(ns.state.prepareChunk(1, true, ns.flushBuffer)) + + try { + // Two calls without awaiting the first: the in-flight guard must reject + // the second instead of aliasing the exporter (UB). + const settled = await Promise.allSettled([ + ns.state.sendPreparedChunk(), + ns.state.sendPreparedChunk(), + ]) + const reasons = settled + .filter(s => s.status === 'rejected') + .map(s => String(s.reason)) + assert.ok( + reasons.some(r => /already in flight/.test(r)), + 'one overlapping call rejected as already-in-flight', + ) + } finally { + server.closeAllConnections?.() + server.close() + } + }) + }) +}) diff --git a/yarn.lock b/yarn.lock index c86291bd..5c4d745d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -105,6 +105,386 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== +"@inquirer/ansi@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-2.0.7.tgz#86de22810cac3ed406ec10f8d66016815b8226b4" + integrity sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q== + +"@inquirer/checkbox@^5.2.1": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-5.2.1.tgz#7f148b3153a776cee202015b10f9a985068d188d" + integrity sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/core" "^11.2.1" + "@inquirer/figures" "^2.0.7" + "@inquirer/type" "^4.0.7" + +"@inquirer/confirm@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-6.1.1.tgz#9c6a7d79c6132b2af57fdb75747f056204e55356" + integrity sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ== + dependencies: + "@inquirer/core" "^11.2.1" + "@inquirer/type" "^4.0.7" + +"@inquirer/core@^11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-11.2.1.tgz#54ccd8f7d47852140b6066cbd77d63b2c2b168fd" + integrity sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/figures" "^2.0.7" + "@inquirer/type" "^4.0.7" + cli-width "^4.1.0" + fast-wrap-ansi "^0.2.0" + mute-stream "^3.0.0" + signal-exit "^4.1.0" + +"@inquirer/editor@^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-5.2.2.tgz#7c73e2fc0e7bd4c40cfd38a180ae5bbd24d32b90" + integrity sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg== + dependencies: + "@inquirer/core" "^11.2.1" + "@inquirer/external-editor" "^3.0.3" + "@inquirer/type" "^4.0.7" + +"@inquirer/expand@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-5.1.1.tgz#e2afeac247d97dd64ee18aa81e902bdd1fe0ea70" + integrity sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g== + dependencies: + "@inquirer/core" "^11.2.1" + "@inquirer/type" "^4.0.7" + +"@inquirer/external-editor@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-3.0.3.tgz#d79e772542cf8d340642e9dabd3a1ea7f5a30104" + integrity sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA== + dependencies: + chardet "^2.1.1" + iconv-lite "^0.7.2" + +"@inquirer/figures@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-2.0.7.tgz#f5cc5843732a81304d06a0db4b53cc7dbda15541" + integrity sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw== + +"@inquirer/input@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-5.1.2.tgz#9305cb170dfc3a5323e5eac885a945e7cddd5c4b" + integrity sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg== + dependencies: + "@inquirer/core" "^11.2.1" + "@inquirer/type" "^4.0.7" + +"@inquirer/number@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-4.1.1.tgz#b133668d8e0e099b4133abb915221501e0ff75d7" + integrity sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA== + dependencies: + "@inquirer/core" "^11.2.1" + "@inquirer/type" "^4.0.7" + +"@inquirer/password@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-5.1.1.tgz#f21efb614da9c905095262f51781fd2a721fceac" + integrity sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/core" "^11.2.1" + "@inquirer/type" "^4.0.7" + +"@inquirer/prompts@^8.5.2": + version "8.5.2" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-8.5.2.tgz#09c0132ada2bbba94c91d341115e1e41cb3f1525" + integrity sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g== + dependencies: + "@inquirer/checkbox" "^5.2.1" + "@inquirer/confirm" "^6.1.1" + "@inquirer/editor" "^5.2.2" + "@inquirer/expand" "^5.1.1" + "@inquirer/input" "^5.1.2" + "@inquirer/number" "^4.1.1" + "@inquirer/password" "^5.1.1" + "@inquirer/rawlist" "^5.3.1" + "@inquirer/search" "^4.2.1" + "@inquirer/select" "^5.2.1" + +"@inquirer/rawlist@^5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-5.3.1.tgz#66f6b8e6aa82d47399c433b8262128e7c1a4f9ce" + integrity sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og== + dependencies: + "@inquirer/core" "^11.2.1" + "@inquirer/type" "^4.0.7" + +"@inquirer/search@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-4.2.1.tgz#c8f4b78ab3f866fdf0503fac0cd08c4a6661c11e" + integrity sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g== + dependencies: + "@inquirer/core" "^11.2.1" + "@inquirer/figures" "^2.0.7" + "@inquirer/type" "^4.0.7" + +"@inquirer/select@^5.2.1": + version "5.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-5.2.1.tgz#3a05e76e58d9e1bb095e912c3e7093aa04cd4604" + integrity sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw== + dependencies: + "@inquirer/ansi" "^2.0.7" + "@inquirer/core" "^11.2.1" + "@inquirer/figures" "^2.0.7" + "@inquirer/type" "^4.0.7" + +"@inquirer/type@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-4.0.7.tgz#9c6f0d857fe6ad549a3a932343b64e76acb34b10" + integrity sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g== + +"@napi-rs/cli@^3.6.0": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-3.7.2.tgz#4a43d7bc7703159da0de1a7e3b1cd94141132b10" + integrity sha512-shDW0Td/XZQpP04Yy+OsMt1ILMKGGkoLcy1zVAsSAK0fLfWm0Upgkmfs/NOV2ZhMQwkgpR3ZEdyHmTwgrUDQuA== + dependencies: + "@inquirer/prompts" "^8.5.2" + "@napi-rs/cross-toolchain" "^1.0.3" + "@napi-rs/wasm-tools" "^1.0.1" + "@octokit/rest" "^22.0.1" + clipanion "^4.0.0-rc.4" + colorette "^2.0.20" + emnapi "^1.11.1" + es-toolkit "^1.47.0" + js-yaml "^4.2.0" + obug "^2.1.2" + semver "^7.8.2" + typanion "^3.14.0" + +"@napi-rs/cross-toolchain@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@napi-rs/cross-toolchain/-/cross-toolchain-1.0.3.tgz#8e345d0c9a8aeeaf9287e7af1d4ce83476681373" + integrity sha512-ENPfLe4937bsKVTDA6zdABx4pq9w0tHqRrJHyaGxgaPq03a2Bd1unD5XSKjXJjebsABJ+MjAv1A2OvCgK9yehg== + dependencies: + "@napi-rs/lzma" "^1.4.5" + "@napi-rs/tar" "^1.1.0" + debug "^4.4.1" + +"@napi-rs/lzma-android-arm-eabi@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-android-arm-eabi/-/lzma-android-arm-eabi-1.4.5.tgz#c6722a1d7201e269fdb6ba997d28cb41223e515c" + integrity sha512-Up4gpyw2SacmyKWWEib06GhiDdF+H+CCU0LAV8pnM4aJIDqKKd5LHSlBht83Jut6frkB0vwEPmAkv4NjQ5u//Q== + +"@napi-rs/lzma-android-arm64@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-android-arm64/-/lzma-android-arm64-1.4.5.tgz#05df61667e84419e0550200b48169057b734806f" + integrity sha512-uwa8sLlWEzkAM0MWyoZJg0JTD3BkPknvejAFG2acUA1raXM8jLrqujWCdOStisXhqQjZ2nDMp3FV6cs//zjfuQ== + +"@napi-rs/lzma-darwin-arm64@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-darwin-arm64/-/lzma-darwin-arm64-1.4.5.tgz#c37a01c53f25cb7f014870d2ea6c5576138bcaaa" + integrity sha512-0Y0TQLQ2xAjVabrMDem1NhIssOZzF/y/dqetc6OT8mD3xMTDtF8u5BqZoX3MyPc9FzpsZw4ksol+w7DsxHrpMA== + +"@napi-rs/lzma-darwin-x64@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-darwin-x64/-/lzma-darwin-x64-1.4.5.tgz#555b1dd65d7b104d28b2a12d925d7059226c7f4b" + integrity sha512-vR2IUyJY3En+V1wJkwmbGWcYiT8pHloTAWdW4pG24+51GIq+intst6Uf6D/r46citObGZrlX0QvMarOkQeHWpw== + +"@napi-rs/lzma-freebsd-x64@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-freebsd-x64/-/lzma-freebsd-x64-1.4.5.tgz#683beff15b37774ec91e1de7b4d337894bf43694" + integrity sha512-XpnYQC5SVovO35tF0xGkbHYjsS6kqyNCjuaLQ2dbEblFRr5cAZVvsJ/9h7zj/5FluJPJRDojVNxGyRhTp4z2lw== + +"@napi-rs/lzma-linux-arm-gnueabihf@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm-gnueabihf/-/lzma-linux-arm-gnueabihf-1.4.5.tgz#505f659a9131474b7270afa4a4e9caf709c4d213" + integrity sha512-ic1ZZMoRfRMwtSwxkyw4zIlbDZGC6davC9r+2oX6x9QiF247BRqqT94qGeL5ZP4Vtz0Hyy7TEViWhx5j6Bpzvw== + +"@napi-rs/lzma-linux-arm64-gnu@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm64-gnu/-/lzma-linux-arm64-gnu-1.4.5.tgz#ecbb944635fa004a9415d1f50f165bc0d26d3807" + integrity sha512-asEp7FPd7C1Yi6DQb45a3KPHKOFBSfGuJWXcAd4/bL2Fjetb2n/KK2z14yfW8YC/Fv6x3rBM0VAZKmJuz4tysg== + +"@napi-rs/lzma-linux-arm64-musl@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm64-musl/-/lzma-linux-arm64-musl-1.4.5.tgz#c0d17f40ce2db0b075469a28f233fd8ce31fbb95" + integrity sha512-yWjcPDgJ2nIL3KNvi4536dlT/CcCWO0DUyEOlBs/SacG7BeD6IjGh6yYzd3/X1Y3JItCbZoDoLUH8iB1lTXo3w== + +"@napi-rs/lzma-linux-ppc64-gnu@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-ppc64-gnu/-/lzma-linux-ppc64-gnu-1.4.5.tgz#2f17b9d1fc920c6c511d2086c7623752172c2f07" + integrity sha512-0XRhKuIU/9ZjT4WDIG/qnX7Xz7mSQHYZo9Gb3MP2gcvBgr6BA4zywQ9k3gmQaPn9ECE+CZg2V7DV7kT+x2pUMQ== + +"@napi-rs/lzma-linux-riscv64-gnu@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-riscv64-gnu/-/lzma-linux-riscv64-gnu-1.4.5.tgz#63c2a4e1157586252186e39604370d5b29c6db85" + integrity sha512-QrqDIPEUUB23GCpyQj/QFyMlr8SGxxyExeZz9OWFnHfb70kXdTLWrHS/hEI1Ru+lSbQ/6xRqeoGyQ4Aqdg+/RA== + +"@napi-rs/lzma-linux-s390x-gnu@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-s390x-gnu/-/lzma-linux-s390x-gnu-1.4.5.tgz#6f2ca44bf5c5bef1b31d7516bf15d63c35cdf59f" + integrity sha512-k8RVM5aMhW86E9H0QXdquwojew4H3SwPxbRVbl49/COJQWCUjGi79X6mYruMnMPEznZinUiT1jgKbFo2A00NdA== + +"@napi-rs/lzma-linux-x64-gnu@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.4.5.tgz#54879d88a9c370687b5463c7c1b6208b718c1ab2" + integrity sha512-6rMtBgnIq2Wcl1rQdZsnM+rtCcVCbws1nF8S2NzaUsVaZv8bjrPiAa0lwg4Eqnn1d9lgwqT+cZgm5m+//K08Kw== + +"@napi-rs/lzma-linux-x64-musl@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-musl/-/lzma-linux-x64-musl-1.4.5.tgz#412705f6925f10f45122bd0f3e2fb6e597bed4f8" + integrity sha512-eiadGBKi7Vd0bCArBUOO/qqRYPHt/VQVvGyYvDFt6C2ZSIjlD+HuOl+2oS1sjf4CFjK4eDIog6EdXnL0NE6iyQ== + +"@napi-rs/lzma-wasm32-wasi@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-wasm32-wasi/-/lzma-wasm32-wasi-1.4.5.tgz#4b74abfd144371123cb6f5b7bad5bae868206ecf" + integrity sha512-+VyHHlr68dvey6fXc2hehw9gHVFIW3TtGF1XkcbAu65qVXsA9D/T+uuoRVqhE+JCyFHFrO0ixRbZDRK1XJt1sA== + dependencies: + "@napi-rs/wasm-runtime" "^1.0.3" + +"@napi-rs/lzma-win32-arm64-msvc@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-arm64-msvc/-/lzma-win32-arm64-msvc-1.4.5.tgz#7ed8c80d588fa244a7fd55249cb0d011d04bf984" + integrity sha512-eewnqvIyyhHi3KaZtBOJXohLvwwN27gfS2G/YDWdfHlbz1jrmfeHAmzMsP5qv8vGB+T80TMHNkro4kYjeh6Deg== + +"@napi-rs/lzma-win32-ia32-msvc@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-ia32-msvc/-/lzma-win32-ia32-msvc-1.4.5.tgz#e6f70ca87bd88370102aa610ee9e44ec28911b46" + integrity sha512-OeacFVRCJOKNU/a0ephUfYZ2Yt+NvaHze/4TgOwJ0J0P4P7X1mHzN+ig9Iyd74aQDXYqc7kaCXA2dpAOcH87Cg== + +"@napi-rs/lzma-win32-x64-msvc@1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-x64-msvc/-/lzma-win32-x64-msvc-1.4.5.tgz#ecfcfe364e805915608ce0ff41ed4c950fdb51b8" + integrity sha512-T4I1SamdSmtyZgDXGAGP+y5LEK5vxHUFwe8mz6D4R7Sa5/WCxTcCIgPJ9BD7RkpO17lzhlaM2vmVvMy96Lvk9Q== + +"@napi-rs/lzma@^1.4.5": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@napi-rs/lzma/-/lzma-1.4.5.tgz#43e17cdfe332a3f33fa640422da348db3d8825e1" + integrity sha512-zS5LuN1OBPAyZpda2ZZgYOEDC+xecUdAGnrvbYzjnLXkrq/OBC3B9qcRvlxbDR3k5H/gVfvef1/jyUqPknqjbg== + optionalDependencies: + "@napi-rs/lzma-android-arm-eabi" "1.4.5" + "@napi-rs/lzma-android-arm64" "1.4.5" + "@napi-rs/lzma-darwin-arm64" "1.4.5" + "@napi-rs/lzma-darwin-x64" "1.4.5" + "@napi-rs/lzma-freebsd-x64" "1.4.5" + "@napi-rs/lzma-linux-arm-gnueabihf" "1.4.5" + "@napi-rs/lzma-linux-arm64-gnu" "1.4.5" + "@napi-rs/lzma-linux-arm64-musl" "1.4.5" + "@napi-rs/lzma-linux-ppc64-gnu" "1.4.5" + "@napi-rs/lzma-linux-riscv64-gnu" "1.4.5" + "@napi-rs/lzma-linux-s390x-gnu" "1.4.5" + "@napi-rs/lzma-linux-x64-gnu" "1.4.5" + "@napi-rs/lzma-linux-x64-musl" "1.4.5" + "@napi-rs/lzma-wasm32-wasi" "1.4.5" + "@napi-rs/lzma-win32-arm64-msvc" "1.4.5" + "@napi-rs/lzma-win32-ia32-msvc" "1.4.5" + "@napi-rs/lzma-win32-x64-msvc" "1.4.5" + +"@napi-rs/tar-android-arm-eabi@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-android-arm-eabi/-/tar-android-arm-eabi-1.1.0.tgz#08ae6ebbaf38d416954a28ca09bf77410d5b0c2b" + integrity sha512-h2Ryndraj/YiKgMV/r5by1cDusluYIRT0CaE0/PekQ4u+Wpy2iUVqvzVU98ZPnhXaNeYxEvVJHNGafpOfaD0TA== + +"@napi-rs/tar-android-arm64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-android-arm64/-/tar-android-arm64-1.1.0.tgz#825a76140116f89d7e930245bda9f70b196da565" + integrity sha512-DJFyQHr1ZxNZorm/gzc1qBNLF/FcKzcH0V0Vwan5P+o0aE2keQIGEjJ09FudkF9v6uOuJjHCVDdK6S6uHtShAw== + +"@napi-rs/tar-darwin-arm64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-darwin-arm64/-/tar-darwin-arm64-1.1.0.tgz#8821616c40ea52ec2c00a055be56bf28dee76013" + integrity sha512-Zz2sXRzjIX4e532zD6xm2SjXEym6MkvfCvL2RMpG2+UwNVDVscHNcz3d47Pf3sysP2e2af7fBB3TIoK2f6trPw== + +"@napi-rs/tar-darwin-x64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-darwin-x64/-/tar-darwin-x64-1.1.0.tgz#4a975e41932a145c58181cb43c8f483c3858e359" + integrity sha512-EI+CptIMNweT0ms9S3mkP/q+J6FNZ1Q6pvpJOEcWglRfyfQpLqjlC0O+dptruTPE8VamKYuqdjxfqD8hifZDOA== + +"@napi-rs/tar-freebsd-x64@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-freebsd-x64/-/tar-freebsd-x64-1.1.0.tgz#5ebc0633f257b258aacc59ac1420835513ed0967" + integrity sha512-J0PIqX+pl6lBIAckL/c87gpodLbjZB1OtIK+RDscKC9NLdpVv6VGOxzUV/fYev/hctcE8EfkLbgFOfpmVQPg2g== + +"@napi-rs/tar-linux-arm-gnueabihf@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm-gnueabihf/-/tar-linux-arm-gnueabihf-1.1.0.tgz#1d309bd4f46f0490353d9608e79d260cf6c7cd43" + integrity sha512-SLgIQo3f3EjkZ82ZwvrEgFvMdDAhsxCYjyoSuWfHCz0U16qx3SuGCp8+FYOPYCECHN3ZlGjXnoAIt9ERd0dEUg== + +"@napi-rs/tar-linux-arm64-gnu@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm64-gnu/-/tar-linux-arm64-gnu-1.1.0.tgz#88d974821f3f8e9ee6948b4d51c78c019dee88ad" + integrity sha512-d014cdle52EGaH6GpYTQOP9Py7glMO1zz/+ynJPjjzYFSxvdYx0byrjumZk2UQdIyGZiJO2MEFpCkEEKFSgPYA== + +"@napi-rs/tar-linux-arm64-musl@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm64-musl/-/tar-linux-arm64-musl-1.1.0.tgz#ab2baee7b288df5e68cef0b2d12fa79d2a551b58" + integrity sha512-L/y1/26q9L/uBqiW/JdOb/Dc94egFvNALUZV2WCGKQXc6UByPBMgdiEyW2dtoYxYYYYc+AKD+jr+wQPcvX2vrQ== + +"@napi-rs/tar-linux-ppc64-gnu@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-ppc64-gnu/-/tar-linux-ppc64-gnu-1.1.0.tgz#7500e60d27849ba36fa4802a346249974e7ecf74" + integrity sha512-EPE1K/80RQvPbLRJDJs1QmCIcH+7WRi0F73+oTe1582y9RtfGRuzAkzeBuAGRXAQEjRQw/RjtNqr6UTJ+8UuWQ== + +"@napi-rs/tar-linux-s390x-gnu@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-s390x-gnu/-/tar-linux-s390x-gnu-1.1.0.tgz#cfc0923bfad1dea8ef9da22148a8d4932aa52d08" + integrity sha512-B2jhWiB1ffw1nQBqLUP1h4+J1ovAxBOoe5N2IqDMOc63fsPZKNqF1PvO/dIem8z7LL4U4bsfmhy3gBfu547oNQ== + +"@napi-rs/tar-linux-x64-gnu@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-x64-gnu/-/tar-linux-x64-gnu-1.1.0.tgz#5fdf9e1bb12b10a951c6ab03268a9f8d9788c929" + integrity sha512-tbZDHnb9617lTnsDMGo/eAMZxnsQFnaRe+MszRqHguKfMwkisc9CCJnks/r1o84u5fECI+J/HOrKXgczq/3Oww== + +"@napi-rs/tar-linux-x64-musl@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-x64-musl/-/tar-linux-x64-musl-1.1.0.tgz#f001fc0a0a2996dcf99e787a15eade8dce215e91" + integrity sha512-dV6cODlzbO8u6Anmv2N/ilQHq/AWz0xyltuXoLU3yUyXbZcnWYZuB2rL8OBGPmqNcD+x9NdScBNXh7vWN0naSQ== + +"@napi-rs/tar-wasm32-wasi@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-wasm32-wasi/-/tar-wasm32-wasi-1.1.0.tgz#c1c7df7738b23f1cdbcff261d5bea6968d0a3c9a" + integrity sha512-jIa9nb2HzOrfH0F8QQ9g3WE4aMH5vSI5/1NYVNm9ysCmNjCCtMXCAhlI3WKCdm/DwHf0zLqdrrtDFXODcNaqMw== + dependencies: + "@napi-rs/wasm-runtime" "^1.0.3" + +"@napi-rs/tar-win32-arm64-msvc@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-arm64-msvc/-/tar-win32-arm64-msvc-1.1.0.tgz#4c8519eab28021e1eda0847433cab949d5389833" + integrity sha512-vfpG71OB0ijtjemp3WTdmBKJm9R70KM8vsSExMsIQtV0lVzP07oM1CW6JbNRPXNLhRoue9ofYLiUDk8bE0Hckg== + +"@napi-rs/tar-win32-ia32-msvc@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-ia32-msvc/-/tar-win32-ia32-msvc-1.1.0.tgz#4f61af0da2c53b23f7d58c77970eaa4449e8eb79" + integrity sha512-hGPyPW60YSpOSgzfy68DLBHgi6HxkAM+L59ZZZPMQ0TOXjQg+p2EW87+TjZfJOkSpbYiEkULwa/f4a2hcVjsqQ== + +"@napi-rs/tar-win32-x64-msvc@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-x64-msvc/-/tar-win32-x64-msvc-1.1.0.tgz#eb63fb44ecde001cce6be238f175e66a06c15035" + integrity sha512-L6Ed1DxXK9YSCMyvpR8MiNAyKNkQLjsHsHK9E0qnHa8NzLFqzDKhvs5LfnWxM2kJ+F7m/e5n9zPm24kHb3LsVw== + +"@napi-rs/tar@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/tar/-/tar-1.1.0.tgz#acecd9e29f705a3f534d5fb3d8aa36b3266727d0" + integrity sha512-7cmzIu+Vbupriudo7UudoMRH2OA3cTw67vva8MxeoAe5S7vPFI7z0vp0pMXiA25S8IUJefImQ90FeJjl8fjEaQ== + optionalDependencies: + "@napi-rs/tar-android-arm-eabi" "1.1.0" + "@napi-rs/tar-android-arm64" "1.1.0" + "@napi-rs/tar-darwin-arm64" "1.1.0" + "@napi-rs/tar-darwin-x64" "1.1.0" + "@napi-rs/tar-freebsd-x64" "1.1.0" + "@napi-rs/tar-linux-arm-gnueabihf" "1.1.0" + "@napi-rs/tar-linux-arm64-gnu" "1.1.0" + "@napi-rs/tar-linux-arm64-musl" "1.1.0" + "@napi-rs/tar-linux-ppc64-gnu" "1.1.0" + "@napi-rs/tar-linux-s390x-gnu" "1.1.0" + "@napi-rs/tar-linux-x64-gnu" "1.1.0" + "@napi-rs/tar-linux-x64-musl" "1.1.0" + "@napi-rs/tar-wasm32-wasi" "1.1.0" + "@napi-rs/tar-win32-arm64-msvc" "1.1.0" + "@napi-rs/tar-win32-ia32-msvc" "1.1.0" + "@napi-rs/tar-win32-x64-msvc" "1.1.0" + "@napi-rs/wasm-runtime@^0.2.11": version "0.2.12" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" @@ -114,6 +494,194 @@ "@emnapi/runtime" "^1.4.3" "@tybys/wasm-util" "^0.10.0" +"@napi-rs/wasm-runtime@^1.0.3": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz#cccd6ebc40b991dea6936f9126b1b8155b6c4c95" + integrity sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q== + dependencies: + "@tybys/wasm-util" "^0.10.2" + +"@napi-rs/wasm-tools-android-arm-eabi@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-android-arm-eabi/-/wasm-tools-android-arm-eabi-1.0.1.tgz#a709f93ddd95508a4ef949b5ceff2b2e85b676f7" + integrity sha512-lr07E/l571Gft5v4aA1dI8koJEmF1F0UigBbsqg9OWNzg80H3lDPO+auv85y3T/NHE3GirDk7x/D3sLO57vayw== + +"@napi-rs/wasm-tools-android-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-android-arm64/-/wasm-tools-android-arm64-1.0.1.tgz#304b5761b4fcc871b876ebd34975c72c9d11a7fc" + integrity sha512-WDR7S+aRLV6LtBJAg5fmjKkTZIdrEnnQxgdsb7Cf8pYiMWBHLU+LC49OUVppQ2YSPY0+GeYm9yuZWW3kLjJ7Bg== + +"@napi-rs/wasm-tools-darwin-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-darwin-arm64/-/wasm-tools-darwin-arm64-1.0.1.tgz#dafb4330986a8b46e8de1603ea2f6932a19634c6" + integrity sha512-qWTI+EEkiN0oIn/N2gQo7+TVYil+AJ20jjuzD2vATS6uIjVz+Updeqmszi7zq7rdFTLp6Ea3/z4kDKIfZwmR9g== + +"@napi-rs/wasm-tools-darwin-x64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-darwin-x64/-/wasm-tools-darwin-x64-1.0.1.tgz#0919e63714ee0a52b1120f6452bbc3a4d793ce3c" + integrity sha512-bA6hubqtHROR5UI3tToAF/c6TDmaAgF0SWgo4rADHtQ4wdn0JeogvOk50gs2TYVhKPE2ZD2+qqt7oBKB+sxW3A== + +"@napi-rs/wasm-tools-freebsd-x64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-freebsd-x64/-/wasm-tools-freebsd-x64-1.0.1.tgz#1f50a2d5d5af041c55634f43f623ae49192bce9c" + integrity sha512-90+KLBkD9hZEjPQW1MDfwSt5J1L46EUKacpCZWyRuL6iIEO5CgWU0V/JnEgFsDOGyyYtiTvHc5bUdUTWd4I9Vg== + +"@napi-rs/wasm-tools-linux-arm64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-arm64-gnu/-/wasm-tools-linux-arm64-gnu-1.0.1.tgz#6106d5e65a25ec2ae417c2fcfebd5c8f14d80e84" + integrity sha512-rG0QlS65x9K/u3HrKafDf8cFKj5wV2JHGfl8abWgKew0GVPyp6vfsDweOwHbWAjcHtp2LHi6JHoW80/MTHm52Q== + +"@napi-rs/wasm-tools-linux-arm64-musl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-arm64-musl/-/wasm-tools-linux-arm64-musl-1.0.1.tgz#0eb3d4d1fbc1938b0edd907423840365ebc53859" + integrity sha512-jAasbIvjZXCgX0TCuEFQr+4D6Lla/3AAVx2LmDuMjgG4xoIXzjKWl7c4chuaD+TI+prWT0X6LJcdzFT+ROKGHQ== + +"@napi-rs/wasm-tools-linux-x64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-x64-gnu/-/wasm-tools-linux-x64-gnu-1.0.1.tgz#5de6a567083a83efed16d046f47b680cbe7c9b53" + integrity sha512-Plgk5rPqqK2nocBGajkMVbGm010Z7dnUgq0wtnYRZbzWWxwWcXfZMPa8EYxrK4eE8SzpI7VlZP1tdVsdjgGwMw== + +"@napi-rs/wasm-tools-linux-x64-musl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-x64-musl/-/wasm-tools-linux-x64-musl-1.0.1.tgz#04cc17ef12b4e5012f2d0e46b09cabe473566e5a" + integrity sha512-GW7AzGuWxtQkyHknHWYFdR0CHmW6is8rG2Rf4V6GNmMpmwtXt/ItWYWtBe4zqJWycMNazpfZKSw/BpT7/MVCXQ== + +"@napi-rs/wasm-tools-wasm32-wasi@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-wasm32-wasi/-/wasm-tools-wasm32-wasi-1.0.1.tgz#6ced3bd03428c854397f00509b1694c3af857a0f" + integrity sha512-/nQVSTrqSsn7YdAc2R7Ips/tnw5SPUcl3D7QrXCNGPqjbatIspnaexvaOYNyKMU6xPu+pc0BTnKVmqhlJJCPLA== + dependencies: + "@napi-rs/wasm-runtime" "^1.0.3" + +"@napi-rs/wasm-tools-win32-arm64-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-arm64-msvc/-/wasm-tools-win32-arm64-msvc-1.0.1.tgz#e776f66eb637eee312b562e987c0a5871ddc6dac" + integrity sha512-PFi7oJIBu5w7Qzh3dwFea3sHRO3pojMsaEnUIy22QvsW+UJfNQwJCryVrpoUt8m4QyZXI+saEq/0r4GwdoHYFQ== + +"@napi-rs/wasm-tools-win32-ia32-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-ia32-msvc/-/wasm-tools-win32-ia32-msvc-1.0.1.tgz#9167919a62d24cb3a46f01fada26fee38aeaf884" + integrity sha512-gXkuYzxQsgkj05Zaq+KQTkHIN83dFAwMcTKa2aQcpYPRImFm2AQzEyLtpXmyCWzJ0F9ZYAOmbSyrNew8/us6bw== + +"@napi-rs/wasm-tools-win32-x64-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-x64-msvc/-/wasm-tools-win32-x64-msvc-1.0.1.tgz#f896ab29a83605795bb12cf2cfc1a215bc830c65" + integrity sha512-rEAf05nol3e3eei2sRButmgXP+6ATgm0/38MKhz9Isne82T4rPIMYsCIFj0kOisaGeVwoi2fnm7O9oWp5YVnYQ== + +"@napi-rs/wasm-tools@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools/-/wasm-tools-1.0.1.tgz#f54caa0132322fd5275690b2aeb581d11539262f" + integrity sha512-enkZYyuCdo+9jneCPE/0fjIta4wWnvVN9hBo2HuiMpRF0q3lzv1J6b/cl7i0mxZUKhBrV3aCKDBQnCOhwKbPmQ== + optionalDependencies: + "@napi-rs/wasm-tools-android-arm-eabi" "1.0.1" + "@napi-rs/wasm-tools-android-arm64" "1.0.1" + "@napi-rs/wasm-tools-darwin-arm64" "1.0.1" + "@napi-rs/wasm-tools-darwin-x64" "1.0.1" + "@napi-rs/wasm-tools-freebsd-x64" "1.0.1" + "@napi-rs/wasm-tools-linux-arm64-gnu" "1.0.1" + "@napi-rs/wasm-tools-linux-arm64-musl" "1.0.1" + "@napi-rs/wasm-tools-linux-x64-gnu" "1.0.1" + "@napi-rs/wasm-tools-linux-x64-musl" "1.0.1" + "@napi-rs/wasm-tools-wasm32-wasi" "1.0.1" + "@napi-rs/wasm-tools-win32-arm64-msvc" "1.0.1" + "@napi-rs/wasm-tools-win32-ia32-msvc" "1.0.1" + "@napi-rs/wasm-tools-win32-x64-msvc" "1.0.1" + +"@octokit/auth-token@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-6.0.0.tgz#b02e9c08a2d8937df09a2a981f226ad219174c53" + integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== + +"@octokit/core@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-7.0.6.tgz#0d58704391c6b681dec1117240ea4d2a98ac3916" + integrity sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q== + dependencies: + "@octokit/auth-token" "^6.0.0" + "@octokit/graphql" "^9.0.3" + "@octokit/request" "^10.0.6" + "@octokit/request-error" "^7.0.2" + "@octokit/types" "^16.0.0" + before-after-hook "^4.0.0" + universal-user-agent "^7.0.0" + +"@octokit/endpoint@^11.0.3": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.3.tgz#acf5f7feddde4e12185d5312ee38ff77235d8205" + integrity sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag== + dependencies: + "@octokit/types" "^16.0.0" + universal-user-agent "^7.0.2" + +"@octokit/graphql@^9.0.3": + version "9.0.3" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-9.0.3.tgz#5b8341c225909e924b466705c13477face869456" + integrity sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA== + dependencies: + "@octokit/request" "^10.0.6" + "@octokit/types" "^16.0.0" + universal-user-agent "^7.0.0" + +"@octokit/openapi-types@^27.0.0": + version "27.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz#374ea53781965fd02a9d36cacb97e152cefff12d" + integrity sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA== + +"@octokit/plugin-paginate-rest@^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz#44dc9fff2dacb148d4c5c788b573ddc044503026" + integrity sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw== + dependencies: + "@octokit/types" "^16.0.0" + +"@octokit/plugin-request-log@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz#de1c1e557df6c08adb631bf78264fa741e01b317" + integrity sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q== + +"@octokit/plugin-rest-endpoint-methods@^17.0.0": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz#8c54397d3a4060356a1c8a974191ebf945924105" + integrity sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw== + dependencies: + "@octokit/types" "^16.0.0" + +"@octokit/request-error@^7.0.2": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-7.1.0.tgz#440fa3cae310466889778f5a222b47a580743638" + integrity sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw== + dependencies: + "@octokit/types" "^16.0.0" + +"@octokit/request@^10.0.6": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.10.tgz#45e46934f3d772f006733be6b5ec18f22e54a00c" + integrity sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w== + dependencies: + "@octokit/endpoint" "^11.0.3" + "@octokit/request-error" "^7.0.2" + "@octokit/types" "^16.0.0" + content-type "^2.0.0" + json-with-bigint "^3.5.3" + universal-user-agent "^7.0.2" + +"@octokit/rest@^22.0.1": + version "22.0.1" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-22.0.1.tgz#4d866c32b76b711d3f736f91992e2b534163b416" + integrity sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw== + dependencies: + "@octokit/core" "^7.0.6" + "@octokit/plugin-paginate-rest" "^14.0.0" + "@octokit/plugin-request-log" "^6.0.0" + "@octokit/plugin-rest-endpoint-methods" "^17.0.0" + +"@octokit/types@^16.0.0": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-16.0.0.tgz#fbd7fa590c2ef22af881b1d79758bfaa234dbb7c" + integrity sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg== + dependencies: + "@octokit/openapi-types" "^27.0.0" + "@package-json/types@^0.0.12": version "0.0.12" resolved "https://registry.yarnpkg.com/@package-json/types/-/types-0.0.12.tgz#4629e833ba128ed9880b6b7a947633ee22952462" @@ -138,6 +706,13 @@ dependencies: tslib "^2.4.0" +"@tybys/wasm-util@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz#12b3a1b33db1f9cad4ddff1f604ab7dd00bf464e" + integrity sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg== + dependencies: + tslib "^2.4.0" + "@types/esrecurse@^4.3.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" @@ -275,6 +850,11 @@ ajv@^6.14.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + balanced-match@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" @@ -285,6 +865,11 @@ baseline-browser-mapping@^2.9.0: resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== +before-after-hook@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-4.0.0.tgz#cf1447ab9160df6a40f3621da64d6ffc36050cb9" + integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== + brace-expansion@^5.0.2: version "5.0.4" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" @@ -318,6 +903,11 @@ change-case@^5.4.4: resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== +chardet@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.1.tgz#5c75593704a642f71ee53717df234031e65373c8" + integrity sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== + ci-info@^4.3.1: version "4.4.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" @@ -330,11 +920,33 @@ clean-regexp@^1.0.0: dependencies: escape-string-regexp "^1.0.5" +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +clipanion@^4.0.0-rc.4: + version "4.0.0-rc.4" + resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-4.0.0-rc.4.tgz#7191a940e47ef197e5f18c9cbbe419278b5f5903" + integrity sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q== + dependencies: + typanion "^3.8.0" + +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + comment-parser@^1.4.1: version "1.4.5" resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.5.tgz#6c595cd090737a1010fe5ff40d86e1d21b7bd6ce" integrity sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw== +content-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-2.0.0.tgz#2fb3ede69dffa0af78ca7c4ce7589680638b56df" + integrity sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ== + core-js-compat@^3.46.0: version "3.48.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" @@ -368,6 +980,11 @@ electron-to-chromium@^1.5.263: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz#09f8973100c39fb0d003b890393cd1d58932b1c8" integrity sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg== +emnapi@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/emnapi/-/emnapi-1.11.1.tgz#9f3da4463d61a89822ac902f95a3e324adfd340e" + integrity sha512-kSRjhIcxjMFsBqk7ORvoc9aA5SBKDmecrtF5RMcmOTao0kD/zamaxsuTxMI8C1//wGUuvE7a+19pCE7AEhGVnA== + enhanced-resolve@^5.17.1: version "5.20.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz#323c2a70d2aa7fb4bdfd6d3c24dfc705c581295d" @@ -376,6 +993,11 @@ enhanced-resolve@^5.17.1: graceful-fs "^4.2.4" tapable "^2.3.0" +es-toolkit@^1.47.0: + version "1.47.1" + resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.47.1.tgz#6f049fef04c2ef27400e8f38255a0dca323e1c3a" + integrity sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q== + escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -586,6 +1208,25 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-string-truncated-width@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz#23afe0da67d752ca0727538f1e6967759728ce49" + integrity sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g== + +fast-string-width@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-string-width/-/fast-string-width-3.0.2.tgz#16dbabb491ce5585b5ecb675b65c165d71688eeb" + integrity sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg== + dependencies: + fast-string-truncated-width "^3.0.2" + +fast-wrap-ansi@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz#95e952a0145bce3f59ad56e179f84c48d4072935" + integrity sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q== + dependencies: + fast-string-width "^3.0.2" + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -658,6 +1299,13 @@ graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +iconv-lite@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore@^5.2.0, ignore@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -697,6 +1345,13 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +js-yaml@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.2.0.tgz#2bd9e85682dd91bd469afb809d816043b3d49524" + integrity sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw== + dependencies: + argparse "^2.0.1" + jsesc@^3.1.0, jsesc@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" @@ -717,6 +1372,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-with-bigint@^3.5.3: + version "3.5.8" + resolved "https://registry.yarnpkg.com/json-with-bigint/-/json-with-bigint-3.5.8.tgz#1b1edb55a1bc4816ca87ac684297591acd822383" + integrity sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw== + keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -751,6 +1411,11 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +mute-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-3.0.0.tgz#cd8014dd2acb72e1e91bb67c74f0019e620ba2d1" + integrity sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw== + napi-postinstall@^0.3.0: version "0.3.4" resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" @@ -766,6 +1431,11 @@ node-releases@^2.0.27: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== +obug@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.3.tgz#c02c60f95abd603409330e767db7f2823193331e" + integrity sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg== + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -844,11 +1514,21 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + semver@^7.5.4, semver@^7.6.3, semver@^7.7.2, semver@^7.7.3: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== +semver@^7.8.2: + version "7.8.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.4.tgz#c73eceebae0616934be8dff28a7fd70757c8e696" + integrity sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -861,6 +1541,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + stable-hash-x@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" @@ -888,6 +1573,11 @@ tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +typanion@^3.14.0, typanion@^3.8.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/typanion/-/typanion-3.14.0.tgz#a766a91810ce8258033975733e836c43a2929b94" + integrity sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -895,6 +1585,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be" + integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== + unrs-resolver@^1.9.2: version "1.11.1" resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz#be9cd8686c99ef53ecb96df2a473c64d304048a9" From 18b6f3f0aaf23ce192157e4921b765d1dcdc8088 Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Thu, 2 Jul 2026 09:29:54 +0200 Subject: [PATCH 49/68] PROF-15218: Update build-test-wasm composite action to Node.js 24 versions (#150) The build-test-wasm composite action still pinned the old Node.js 20 era actions/* versions while the rest of the repo had moved on. Bring it in line: actions/checkout v6.0.2, actions/download-artifact v8.0.1, actions/setup-node v6.3.0, actions/upload-artifact v7.0.1. --- .github/actions/build-test-wasm/action.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/build-test-wasm/action.yaml b/.github/actions/build-test-wasm/action.yaml index 0e1df366..90cafd52 100644 --- a/.github/actions/build-test-wasm/action.yaml +++ b/.github/actions/build-test-wasm/action.yaml @@ -7,10 +7,10 @@ inputs: runs: using: 'composite' steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - name: Setup Node.js - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 - run: yarn install shell: bash - name: Install wasm-pack @@ -32,7 +32,7 @@ runs: node test-wasm.js ${{ inputs.crate }} fi shell: bash - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: prebuilds-wasm-${{ inputs.crate }} if-no-files-found: ignore From e23ce1a292f66aea967714adbeb138fb5b59e1f1 Mon Sep 17 00:00:00 2001 From: Attila Szegedi Date: Thu, 2 Jul 2026 15:34:11 +0200 Subject: [PATCH 50/68] feat!: expose ThreadLocalMetadata via process_discovery (#153) * Expose ThreadLocalMetadata via process_discovery Replaces the flat `threadlocal_attribute_keys` field on the napi TracerMetadata with a `threadlocal_metadata` substruct mirroring the libdatadog Rust API. Lets callers set the schema-version string and extra process-context attributes (strings and 64-bit ints for now) alongside the attribute key map. libdd-library-config and libdd-trace-protobuf are pinned to the merge commit that introduced the new API (7cdeb7896e92d1ba38bde495934e112dac2eda25); swap back to a tagged release once one that includes it is published. This is a breaking change to the process_discovery.TracerMetadata constructor. Downstream (dd-trace-js) will need to migrate from passing threadlocalAttributeKeys directly to passing a threadlocalMetadata object. --- Cargo.lock | 5 +- crates/process_discovery/Cargo.toml | 6 +- crates/process_discovery/src/lib.rs | 99 +++++++++++++++++++++++++---- test/process-discovery.js | 63 ++++++++++++++++-- 4 files changed, 154 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c0007bb..32661c92 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1069,7 +1069,7 @@ dependencies = [ [[package]] name = "libdd-library-config" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" +source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25#7cdeb7896e92d1ba38bde495934e112dac2eda25" dependencies = [ "anyhow", "libc", @@ -1191,7 +1191,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" version = "3.0.2" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" +source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25#7cdeb7896e92d1ba38bde495934e112dac2eda25" dependencies = [ "prost", "serde", @@ -1803,6 +1803,7 @@ version = "0.1.0" dependencies = [ "anyhow", "libdd-library-config 2.0.0", + "libdd-trace-protobuf", "napi", "napi-derive", ] diff --git a/crates/process_discovery/Cargo.toml b/crates/process_discovery/Cargo.toml index 4aa80ce9..44042286 100644 --- a/crates/process_discovery/Cargo.toml +++ b/crates/process_discovery/Cargo.toml @@ -8,7 +8,11 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" -libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v35.0.0", features = ["otel-thread-ctx"] } +# Pointed at the merge commit that introduced ThreadLocalMetadata (caller-supplied +# schema version + extra process-context attributes). Swap back to a tagged release +# once one that includes 7cdeb7896e92d1ba38bde495934e112dac2eda25 is published. +libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", rev = "7cdeb7896e92d1ba38bde495934e112dac2eda25", features = ["otel-thread-ctx"] } +libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "7cdeb7896e92d1ba38bde495934e112dac2eda25" } napi = { version = "2" } napi-derive = { version = "2", default-features = false } diff --git a/crates/process_discovery/src/lib.rs b/crates/process_discovery/src/lib.rs index 3bf3516c..6e042e8f 100644 --- a/crates/process_discovery/src/lib.rs +++ b/crates/process_discovery/src/lib.rs @@ -2,6 +2,7 @@ use napi::{Error, Status}; use napi_derive::napi; use libdd_library_config::tracer_metadata; +use libdd_trace_protobuf::opentelemetry::proto::common::v1::any_value; #[napi] pub struct NapiAnonymousFileHandle { @@ -11,6 +12,44 @@ pub struct NapiAnonymousFileHandle { #[napi] impl NapiAnonymousFileHandle {} +/// Additional OTel process-context attribute the threadlocal writer wants to +/// publish alongside the key map (e.g. language-runtime layout constants). Set +/// exactly one of `string_value` / `int_value` — the other variants of OTel's +/// `AnyValue` (bool, double, bytes, array, kvlist) are not yet exposed. +/// Passing both set or neither set is rejected as invalid input. +#[derive(Clone)] +#[napi(object)] +pub struct ExtraAttribute { + pub key: String, + pub string_value: Option, + pub int_value: Option, +} + +/// Thread-level context metadata the tracer wants to publish as part of the +/// OTel process context. When present on a [`TracerMetadata`], drives the +/// `threadlocal.*` block in the emitted process context; when absent, no such +/// block is emitted. +#[derive(Clone)] +#[napi(object)] +pub struct ThreadLocalMetadata { + /// Ordered list of attribute key names for thread-level OTEP-4947 context + /// records. Wire key indices index into this list. libdatadog implicitly + /// prepends `datadog.local_root_span_id` at wire index 0, so entry 0 here + /// is wire key index 1. + pub attribute_keys: Vec, + + /// Value of the `threadlocal.schema_version` attribute. Identifies the + /// on-the-wire record schema (e.g. `"tlsdesc_v1_dev"` for libdatadog's own + /// TLSDESC writer, `"nodejs_v1_dev"` for a Node.js writer). Defaults to + /// `"tlsdesc_v1_dev"` when omitted. + pub schema_version: Option, + + /// Extra `threadlocal.*` attributes to publish alongside the key map (e.g. + /// V8 layout constants a Node.js reader needs to walk from the discovery + /// TLS symbol into the record). + pub extra_attributes: Vec, +} + #[napi(constructor)] pub struct TracerMetadata { pub runtime_id: Option, @@ -21,16 +60,50 @@ pub struct TracerMetadata { pub service_version: Option, pub process_tags: Option, pub container_id: Option, - /// Ordered list of attribute key names for thread-level OTEP-4947 - /// context records. Key indices on the wire index into this list. - /// libdatadog's OTel process-context conversion prepends the - /// implicit `datadog.local_root_span_id` entry at wire index 0, so - /// callers should only set their additional keys here — entry 0 in - /// this list corresponds to wire key index 1. - /// - /// `null`/omitted (the default) disables the thread-context-related - /// attributes in the OTel process context entirely. - pub threadlocal_attribute_keys: Option>, + /// Optional thread-level context metadata; see [`ThreadLocalMetadata`]. + /// `null`/omitted (the default) disables the `threadlocal.*` block in the + /// emitted OTel process context entirely. + pub threadlocal_metadata: Option, +} + +fn convert_extra_attribute(ea: &ExtraAttribute) -> napi::Result<(String, any_value::Value)> { + let value = match (&ea.string_value, ea.int_value) { + (Some(s), None) => any_value::Value::StringValue(s.clone()), + (None, Some(i)) => any_value::Value::IntValue(i), + (Some(_), Some(_)) => { + return Err(Error::new( + Status::InvalidArg, + format!( + "ExtraAttribute {:?}: exactly one of stringValue / intValue must be set, both are", + ea.key, + ), + )); + } + (None, None) => { + return Err(Error::new( + Status::InvalidArg, + format!( + "ExtraAttribute {:?}: exactly one of stringValue / intValue must be set, neither is", + ea.key, + ), + )); + } + }; + Ok((ea.key.clone(), value)) +} + +fn convert_threadlocal_metadata( + tlm: &ThreadLocalMetadata, +) -> napi::Result { + Ok(tracer_metadata::ThreadLocalMetadata { + attribute_keys: tlm.attribute_keys.clone(), + schema_version: tlm.schema_version.clone(), + extra_attributes: tlm + .extra_attributes + .iter() + .map(convert_extra_attribute) + .collect::>()?, + }) } #[napi] @@ -46,7 +119,11 @@ pub fn store_metadata(data: &TracerMetadata) -> napi::Result process_discovery.storeMetadata(bad_metadata_neither), + /neither is/, +) + +// Setting both stringValue and intValue is also a caller error — the intent +// is ambiguous, so reject. +const bad_metadata_both = new process_discovery.TracerMetadata( + '7938685c-19dd-490f-b9b3-8aae4c22f89a', + '1.0.0', + 'my_hostname', + undefined, undefined, undefined, undefined, undefined, + { + attributeKeys: [], + schemaVersion: undefined, + extraAttributes: [{ key: 'threadlocal.bogus', stringValue: 's', intValue: 1 }], + }, +) +assert.throws( + () => process_discovery.storeMetadata(bad_metadata_both), + /both are/, +) + if (process.platform === 'linux') { const contains_datadog_memfd = (fds) => { for (const fd in fds) { From e83305e4b98864b73e646480c59a72b98e48aeae Mon Sep 17 00:00:00 2001 From: Bryan English Date: Thu, 2 Jul 2026 11:13:38 -0400 Subject: [PATCH 51/68] fix(pipeline): set exporter runtime-id from the tracer (#157) The TraceExporterBuilder set url/service/env/hostname/app_version but never called set_runtime_id, so at build_async the builder fell back to Uuid::new_v4(). That gave the trace payload a random runtime-id that mismatched the stats payload (correlation bug) and called getrandom, which traps on wasm runtimes without a configured entropy source (surfaced as native-spans System Tests / E2E failures). Pass through the runtime-id the caller already provides. --- crates/pipeline/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs index 9d1bc112..9385cbba 100644 --- a/crates/pipeline/src/lib.rs +++ b/crates/pipeline/src/lib.rs @@ -248,6 +248,7 @@ impl WasmSpanState { .set_env(env) .set_hostname(hostname) .set_app_version(app_version) + .set_runtime_id(runtime_id) .enable_agent_rates_payload_version(); let mut change_queue = vec![0u8; change_queue_size as usize]; From bf9865db5c921ad17decf1005142f59a8558f8a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:53:04 +0200 Subject: [PATCH 52/68] chore(deps): bump the gh-actions-packages group across 1 directory with 3 updates (#139) Bumps the gh-actions-packages group with 3 updates in the / directory: [actions/checkout](https://github.com/actions/checkout), [actions/setup-node](https://github.com/actions/setup-node) and [DataDog/dd-octo-sts-action](https://github.com/datadog/dd-octo-sts-action). Updates `actions/checkout` from 6.0.2 to 7.0.0 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0) Updates `actions/setup-node` from 6.3.0 to 6.4.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/53b83947a5a98c8d113130e565377fae1a50d02f...48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e) Updates `DataDog/dd-octo-sts-action` from 1.0.3 to 1.0.4 - [Release notes](https://github.com/datadog/dd-octo-sts-action/releases) - [Commits](https://github.com/datadog/dd-octo-sts-action/compare/acaa02eee7e3bb0839e4272dacb37b8f3b58ba80...96a25462dbcb10ebf0bfd6e2ccc917d2ab235b9a) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: gh-actions-packages - dependency-name: actions/setup-node dependency-version: 6.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: gh-actions-packages - dependency-name: DataDog/dd-octo-sts-action dependency-version: 1.0.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: gh-actions-packages ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 10 +++++----- .github/workflows/release.yml | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 52dc405c..1019981b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,9 +10,9 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Setup Node.js - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - run: yarn install - run: yarn install working-directory: test/crashtracker @@ -27,7 +27,7 @@ jobs: - datadog-js-zstd - pipeline steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: 'Use composite action' uses: ./.github/actions/build-test-wasm with: @@ -52,10 +52,10 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - name: Setup Node.js - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - run: yarn install - name: Compute module size tree and report uses: qard/heaviest-objects-in-the-universe@v1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 256da64b..f5ce2754 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: - datadog-js-zstd - pipeline steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: 'Use composite action' uses: ./.github/actions/build-test-wasm with: @@ -41,19 +41,19 @@ jobs: outputs: pkgjson: ${{ steps.pkg.outputs.json }} steps: - - uses: DataDog/dd-octo-sts-action@acaa02eee7e3bb0839e4272dacb37b8f3b58ba80 # v1.0.3 + - uses: DataDog/dd-octo-sts-action@96a25462dbcb10ebf0bfd6e2ccc917d2ab235b9a # v1.0.4 id: octo-sts with: scope: DataDog/libdatadog-nodejs policy: self.github.release.push-tags - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false # drop GITHUB_TOKEN so the dd-octo-sts token is used for the tag push - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: prebuilds path: prebuilds - - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: '24' registry-url: 'https://registry.npmjs.org' From 1c93727fc98fa400c61f5ce7430a4b771e3e049b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:54:04 +0200 Subject: [PATCH 53/68] chore(deps): bump libdd-crashtracker from v35.0.0 to v37.0.0 (#147) Bumps [libdd-crashtracker](https://github.com/DataDog/libdatadog) from v35.0.0 to v37.0.0. - [Release notes](https://github.com/DataDog/libdatadog/releases) - [Commits](https://github.com/DataDog/libdatadog/compare/aa78483fba211c72ca3759c76318895f45e0184b...86b7f5700d3db4e58076794b5e8073a40d780083) --- updated-dependencies: - dependency-name: libdd-crashtracker dependency-version: b2a83ff19a2f4760d180bd9eb9e91f41566ba5b9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 307 +++++++++++++++++++++------------ crates/crashtracker/Cargo.toml | 2 +- 2 files changed, 196 insertions(+), 113 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 32661c92..e973b89d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -181,6 +181,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.4" @@ -214,6 +220,16 @@ dependencies = [ "cc", ] +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -697,7 +713,6 @@ dependencies = [ "hyper", "hyper-util", "rustls", - "rustls-native-certs", "tokio", "tokio-rustls", "tower-service", @@ -780,6 +795,50 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "jobserver" version = "0.1.34" @@ -838,23 +897,12 @@ dependencies = [ "futures-core", "http", "js-sys", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-capabilities", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test", ] -[[package]] -name = "libdd-capabilities" -version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" -dependencies = [ - "anyhow", - "bytes", - "http", - "thiserror", -] - [[package]] name = "libdd-capabilities" version = "2.0.0" @@ -866,19 +914,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "libdd-capabilities-impl" -version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" -dependencies = [ - "bytes", - "http", - "http-body-util", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", - "libdd-common 4.2.0", - "tokio", -] - [[package]] name = "libdd-capabilities-impl" version = "2.0.0" @@ -887,15 +922,15 @@ dependencies = [ "bytes", "http", "http-body-util", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-common 5.0.0", + "libdd-capabilities", + "libdd-common", "tokio", ] [[package]] name = "libdd-common" -version = "4.2.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" +version = "5.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" dependencies = [ "anyhow", "bytes", @@ -917,6 +952,7 @@ dependencies = [ "regex", "rustls", "rustls-native-certs", + "rustls-platform-verifier", "serde", "static_assertions", "thiserror", @@ -926,40 +962,10 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "libdd-common" -version = "5.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" -dependencies = [ - "anyhow", - "bytes", - "cc", - "const_format", - "futures", - "futures-core", - "futures-util", - "hex", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "libc", - "nix 0.29.0", - "pin-project", - "regex", - "serde", - "static_assertions", - "thiserror", - "tokio", - "tower-service", - "windows-sys 0.52.0", -] - [[package]] name = "libdd-crashtracker" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" dependencies = [ "anyhow", "blazesym", @@ -968,7 +974,7 @@ dependencies = [ "errno", "http", "libc", - "libdd-common 4.2.0", + "libdd-common", "libdd-libunwind-sys", "libdd-telemetry", "nix 0.29.0", @@ -1002,12 +1008,12 @@ dependencies = [ "getrandom 0.2.17", "http", "http-body-util", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-common 5.0.0", - "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-capabilities", + "libdd-capabilities-impl", + "libdd-common", + "libdd-ddsketch", "libdd-dogstatsd-client", - "libdd-shared-runtime 1.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-shared-runtime", "libdd-tinybytes", "libdd-trace-normalization", "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", @@ -1023,14 +1029,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "libdd-ddsketch" -version = "1.0.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" -dependencies = [ - "prost", -] - [[package]] name = "libdd-ddsketch" version = "1.0.1" @@ -1047,7 +1045,7 @@ dependencies = [ "anyhow", "cadence", "http", - "libdd-common 5.0.0", + "libdd-common", "serde", "tracing", ] @@ -1094,23 +1092,6 @@ dependencies = [ "paste", ] -[[package]] -name = "libdd-shared-runtime" -version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" -dependencies = [ - "async-trait", - "futures", - "futures-util", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", - "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", - "libdd-common 4.2.0", - "tokio", - "tokio-util", - "tracing", - "wasm-bindgen-futures", -] - [[package]] name = "libdd-shared-runtime" version = "1.0.0" @@ -1119,9 +1100,9 @@ dependencies = [ "async-trait", "futures", "futures-util", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-common 5.0.0", + "libdd-capabilities", + "libdd-capabilities-impl", + "libdd-common", "tokio", "tokio-util", "tracing", @@ -1130,8 +1111,8 @@ dependencies = [ [[package]] name = "libdd-telemetry" -version = "5.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0#aa78483fba211c72ca3759c76318895f45e0184b" +version = "5.0.1" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" dependencies = [ "anyhow", "async-trait", @@ -1142,9 +1123,9 @@ dependencies = [ "http", "http-body-util", "libc", - "libdd-common 4.2.0", - "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", - "libdd-shared-runtime 1.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", + "libdd-common", + "libdd-ddsketch", + "libdd-shared-runtime", "serde", "serde_json", "sys-info", @@ -1179,7 +1160,7 @@ source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3d dependencies = [ "anyhow", "fluent-uri", - "libdd-common 5.0.0", + "libdd-common", "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", "libdd-trace-utils", "log", @@ -1218,11 +1199,11 @@ dependencies = [ "async-trait", "hashbrown 0.15.5", "http", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-common 5.0.0", - "libdd-ddsketch 1.0.1 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-shared-runtime 1.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-capabilities", + "libdd-capabilities-impl", + "libdd-common", + "libdd-ddsketch", + "libdd-shared-runtime", "libdd-trace-obfuscation", "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", "libdd-trace-utils", @@ -1248,9 +1229,9 @@ dependencies = [ "http-body", "http-body-util", "indexmap", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-capabilities-impl 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", - "libdd-common 5.0.0", + "libdd-capabilities", + "libdd-capabilities-impl", + "libdd-common", "libdd-tinybytes", "libdd-trace-normalization", "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", @@ -1739,9 +1720,9 @@ dependencies = [ "http", "js-sys", "libdatadog-nodejs-capabilities", - "libdd-capabilities 2.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-capabilities", "libdd-data-pipeline", - "libdd-shared-runtime 1.0.0 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-shared-runtime", "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", "libdd-trace-stats", "libdd-trace-utils", @@ -2034,6 +2015,33 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.103.13" @@ -2657,6 +2665,15 @@ dependencies = [ "semver", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2814,6 +2831,15 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2832,6 +2858,21 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -2880,6 +2921,12 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -2898,6 +2945,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -2916,6 +2969,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -2946,6 +3005,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -2964,6 +3029,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2982,6 +3053,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3000,6 +3077,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index f349c08a..8bce6975 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -14,7 +14,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" -libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v35.0.0" } +libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0" } napi = { version = "2", features = ["serde-json"] } napi-derive = { version = "2", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } From ae5923cdf342c6f9d6b4f954b92c606d665db902 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:56:43 +0200 Subject: [PATCH 54/68] chore(deps-dev): bump the minor-updates group across 1 directory with 3 updates (#142) Bumps the minor-updates group with 3 updates in the / directory: [eslint](https://github.com/eslint/eslint), [eslint-plugin-import-x](https://github.com/un-ts/eslint-plugin-import-x) and [globals](https://github.com/sindresorhus/globals). Updates `eslint` from 10.0.3 to 10.6.0 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v10.0.3...v10.6.0) Updates `eslint-plugin-import-x` from 4.16.2 to 4.17.1 - [Release notes](https://github.com/un-ts/eslint-plugin-import-x/releases) - [Changelog](https://github.com/un-ts/eslint-plugin-import-x/blob/master/CHANGELOG.md) - [Commits](https://github.com/un-ts/eslint-plugin-import-x/compare/v4.16.2...v4.17.1) Updates `globals` from 17.4.0 to 17.7.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v17.4.0...v17.7.0) --- updated-dependencies: - dependency-name: eslint dependency-version: 10.5.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-updates - dependency-name: eslint-plugin-import-x dependency-version: 4.17.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-updates - dependency-name: globals dependency-version: 17.7.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: minor-updates ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 6 +- yarn.lock | 783 +++------------------------------------------------ 2 files changed, 44 insertions(+), 745 deletions(-) diff --git a/package.json b/package.json index ca72c8b6..d956cc21 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,10 @@ "devDependencies": { "@eslint/js": "^10.0.1", "@stylistic/eslint-plugin": "^5.9.0", - "eslint": "^10.0.2", - "eslint-plugin-import-x": "^4.12.2", + "eslint": "^10.6.0", + "eslint-plugin-import-x": "^4.17.1", "eslint-plugin-n": "^17.24.0", "eslint-plugin-unicorn": "^63.0.0", - "globals": "^17.4.0" + "globals": "^17.7.0" } } diff --git a/yarn.lock b/yarn.lock index 5c4d745d..f5ecefed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,26 +41,26 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== -"@eslint/config-array@^0.23.3": - version "0.23.3" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.3.tgz#3f4a93dd546169c09130cbd10f2415b13a20a219" - integrity sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw== +"@eslint/config-array@^0.23.5": + version "0.23.5" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.5.tgz#56e86d243049195d8acc0c06a1b3dfdc3fa3de95" + integrity sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA== dependencies: - "@eslint/object-schema" "^3.0.3" + "@eslint/object-schema" "^3.0.5" debug "^4.3.1" minimatch "^10.2.4" -"@eslint/config-helpers@^0.5.2": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.3.tgz#721fe6bbb90d74b0c80d6ff2428e5bbcb002becb" - integrity sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw== +"@eslint/config-helpers@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.6.0.tgz#ef9a36881d39dfd5dbeac22b0da997fabfb08b03" + integrity sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA== dependencies: - "@eslint/core" "^1.1.1" + "@eslint/core" "^1.2.1" -"@eslint/core@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.1.1.tgz#450f3d2be2d463ccd51119544092256b4e88df32" - integrity sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ== +"@eslint/core@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.2.1.tgz#c1da7cd1b82fa8787f98b5629fb811848a1b63ce" + integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ== dependencies: "@types/json-schema" "^7.0.15" @@ -69,17 +69,17 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-10.0.1.tgz#1e8a876f50117af8ab67e47d5ad94d38d6622583" integrity sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA== -"@eslint/object-schema@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.3.tgz#5bf671e52e382e4adc47a9906f2699374637db6b" - integrity sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ== +"@eslint/object-schema@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.5.tgz#88e9bf4d11d2b19c082e78ebe7ce88724a5eb091" + integrity sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw== -"@eslint/plugin-kit@^0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz#eb9e6689b56ce8bc1855bb33090e63f3fc115e8e" - integrity sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ== +"@eslint/plugin-kit@^0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz#4b0962f3f2c7ce8bc98b3ecfe34525c09d2cb729" + integrity sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A== dependencies: - "@eslint/core" "^1.1.1" + "@eslint/core" "^1.2.1" levn "^0.4.1" "@humanfs/core@^0.19.1": @@ -105,386 +105,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== -"@inquirer/ansi@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-2.0.7.tgz#86de22810cac3ed406ec10f8d66016815b8226b4" - integrity sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q== - -"@inquirer/checkbox@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-5.2.1.tgz#7f148b3153a776cee202015b10f9a985068d188d" - integrity sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw== - dependencies: - "@inquirer/ansi" "^2.0.7" - "@inquirer/core" "^11.2.1" - "@inquirer/figures" "^2.0.7" - "@inquirer/type" "^4.0.7" - -"@inquirer/confirm@^6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-6.1.1.tgz#9c6a7d79c6132b2af57fdb75747f056204e55356" - integrity sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ== - dependencies: - "@inquirer/core" "^11.2.1" - "@inquirer/type" "^4.0.7" - -"@inquirer/core@^11.2.1": - version "11.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-11.2.1.tgz#54ccd8f7d47852140b6066cbd77d63b2c2b168fd" - integrity sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA== - dependencies: - "@inquirer/ansi" "^2.0.7" - "@inquirer/figures" "^2.0.7" - "@inquirer/type" "^4.0.7" - cli-width "^4.1.0" - fast-wrap-ansi "^0.2.0" - mute-stream "^3.0.0" - signal-exit "^4.1.0" - -"@inquirer/editor@^5.2.2": - version "5.2.2" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-5.2.2.tgz#7c73e2fc0e7bd4c40cfd38a180ae5bbd24d32b90" - integrity sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg== - dependencies: - "@inquirer/core" "^11.2.1" - "@inquirer/external-editor" "^3.0.3" - "@inquirer/type" "^4.0.7" - -"@inquirer/expand@^5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-5.1.1.tgz#e2afeac247d97dd64ee18aa81e902bdd1fe0ea70" - integrity sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g== - dependencies: - "@inquirer/core" "^11.2.1" - "@inquirer/type" "^4.0.7" - -"@inquirer/external-editor@^3.0.3": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-3.0.3.tgz#d79e772542cf8d340642e9dabd3a1ea7f5a30104" - integrity sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA== - dependencies: - chardet "^2.1.1" - iconv-lite "^0.7.2" - -"@inquirer/figures@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-2.0.7.tgz#f5cc5843732a81304d06a0db4b53cc7dbda15541" - integrity sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw== - -"@inquirer/input@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-5.1.2.tgz#9305cb170dfc3a5323e5eac885a945e7cddd5c4b" - integrity sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg== - dependencies: - "@inquirer/core" "^11.2.1" - "@inquirer/type" "^4.0.7" - -"@inquirer/number@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-4.1.1.tgz#b133668d8e0e099b4133abb915221501e0ff75d7" - integrity sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA== - dependencies: - "@inquirer/core" "^11.2.1" - "@inquirer/type" "^4.0.7" - -"@inquirer/password@^5.1.1": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-5.1.1.tgz#f21efb614da9c905095262f51781fd2a721fceac" - integrity sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg== - dependencies: - "@inquirer/ansi" "^2.0.7" - "@inquirer/core" "^11.2.1" - "@inquirer/type" "^4.0.7" - -"@inquirer/prompts@^8.5.2": - version "8.5.2" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-8.5.2.tgz#09c0132ada2bbba94c91d341115e1e41cb3f1525" - integrity sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g== - dependencies: - "@inquirer/checkbox" "^5.2.1" - "@inquirer/confirm" "^6.1.1" - "@inquirer/editor" "^5.2.2" - "@inquirer/expand" "^5.1.1" - "@inquirer/input" "^5.1.2" - "@inquirer/number" "^4.1.1" - "@inquirer/password" "^5.1.1" - "@inquirer/rawlist" "^5.3.1" - "@inquirer/search" "^4.2.1" - "@inquirer/select" "^5.2.1" - -"@inquirer/rawlist@^5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-5.3.1.tgz#66f6b8e6aa82d47399c433b8262128e7c1a4f9ce" - integrity sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og== - dependencies: - "@inquirer/core" "^11.2.1" - "@inquirer/type" "^4.0.7" - -"@inquirer/search@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-4.2.1.tgz#c8f4b78ab3f866fdf0503fac0cd08c4a6661c11e" - integrity sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g== - dependencies: - "@inquirer/core" "^11.2.1" - "@inquirer/figures" "^2.0.7" - "@inquirer/type" "^4.0.7" - -"@inquirer/select@^5.2.1": - version "5.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-5.2.1.tgz#3a05e76e58d9e1bb095e912c3e7093aa04cd4604" - integrity sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw== - dependencies: - "@inquirer/ansi" "^2.0.7" - "@inquirer/core" "^11.2.1" - "@inquirer/figures" "^2.0.7" - "@inquirer/type" "^4.0.7" - -"@inquirer/type@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-4.0.7.tgz#9c6f0d857fe6ad549a3a932343b64e76acb34b10" - integrity sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g== - -"@napi-rs/cli@^3.6.0": - version "3.7.2" - resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-3.7.2.tgz#4a43d7bc7703159da0de1a7e3b1cd94141132b10" - integrity sha512-shDW0Td/XZQpP04Yy+OsMt1ILMKGGkoLcy1zVAsSAK0fLfWm0Upgkmfs/NOV2ZhMQwkgpR3ZEdyHmTwgrUDQuA== - dependencies: - "@inquirer/prompts" "^8.5.2" - "@napi-rs/cross-toolchain" "^1.0.3" - "@napi-rs/wasm-tools" "^1.0.1" - "@octokit/rest" "^22.0.1" - clipanion "^4.0.0-rc.4" - colorette "^2.0.20" - emnapi "^1.11.1" - es-toolkit "^1.47.0" - js-yaml "^4.2.0" - obug "^2.1.2" - semver "^7.8.2" - typanion "^3.14.0" - -"@napi-rs/cross-toolchain@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@napi-rs/cross-toolchain/-/cross-toolchain-1.0.3.tgz#8e345d0c9a8aeeaf9287e7af1d4ce83476681373" - integrity sha512-ENPfLe4937bsKVTDA6zdABx4pq9w0tHqRrJHyaGxgaPq03a2Bd1unD5XSKjXJjebsABJ+MjAv1A2OvCgK9yehg== - dependencies: - "@napi-rs/lzma" "^1.4.5" - "@napi-rs/tar" "^1.1.0" - debug "^4.4.1" - -"@napi-rs/lzma-android-arm-eabi@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-android-arm-eabi/-/lzma-android-arm-eabi-1.4.5.tgz#c6722a1d7201e269fdb6ba997d28cb41223e515c" - integrity sha512-Up4gpyw2SacmyKWWEib06GhiDdF+H+CCU0LAV8pnM4aJIDqKKd5LHSlBht83Jut6frkB0vwEPmAkv4NjQ5u//Q== - -"@napi-rs/lzma-android-arm64@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-android-arm64/-/lzma-android-arm64-1.4.5.tgz#05df61667e84419e0550200b48169057b734806f" - integrity sha512-uwa8sLlWEzkAM0MWyoZJg0JTD3BkPknvejAFG2acUA1raXM8jLrqujWCdOStisXhqQjZ2nDMp3FV6cs//zjfuQ== - -"@napi-rs/lzma-darwin-arm64@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-darwin-arm64/-/lzma-darwin-arm64-1.4.5.tgz#c37a01c53f25cb7f014870d2ea6c5576138bcaaa" - integrity sha512-0Y0TQLQ2xAjVabrMDem1NhIssOZzF/y/dqetc6OT8mD3xMTDtF8u5BqZoX3MyPc9FzpsZw4ksol+w7DsxHrpMA== - -"@napi-rs/lzma-darwin-x64@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-darwin-x64/-/lzma-darwin-x64-1.4.5.tgz#555b1dd65d7b104d28b2a12d925d7059226c7f4b" - integrity sha512-vR2IUyJY3En+V1wJkwmbGWcYiT8pHloTAWdW4pG24+51GIq+intst6Uf6D/r46citObGZrlX0QvMarOkQeHWpw== - -"@napi-rs/lzma-freebsd-x64@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-freebsd-x64/-/lzma-freebsd-x64-1.4.5.tgz#683beff15b37774ec91e1de7b4d337894bf43694" - integrity sha512-XpnYQC5SVovO35tF0xGkbHYjsS6kqyNCjuaLQ2dbEblFRr5cAZVvsJ/9h7zj/5FluJPJRDojVNxGyRhTp4z2lw== - -"@napi-rs/lzma-linux-arm-gnueabihf@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm-gnueabihf/-/lzma-linux-arm-gnueabihf-1.4.5.tgz#505f659a9131474b7270afa4a4e9caf709c4d213" - integrity sha512-ic1ZZMoRfRMwtSwxkyw4zIlbDZGC6davC9r+2oX6x9QiF247BRqqT94qGeL5ZP4Vtz0Hyy7TEViWhx5j6Bpzvw== - -"@napi-rs/lzma-linux-arm64-gnu@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm64-gnu/-/lzma-linux-arm64-gnu-1.4.5.tgz#ecbb944635fa004a9415d1f50f165bc0d26d3807" - integrity sha512-asEp7FPd7C1Yi6DQb45a3KPHKOFBSfGuJWXcAd4/bL2Fjetb2n/KK2z14yfW8YC/Fv6x3rBM0VAZKmJuz4tysg== - -"@napi-rs/lzma-linux-arm64-musl@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm64-musl/-/lzma-linux-arm64-musl-1.4.5.tgz#c0d17f40ce2db0b075469a28f233fd8ce31fbb95" - integrity sha512-yWjcPDgJ2nIL3KNvi4536dlT/CcCWO0DUyEOlBs/SacG7BeD6IjGh6yYzd3/X1Y3JItCbZoDoLUH8iB1lTXo3w== - -"@napi-rs/lzma-linux-ppc64-gnu@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-ppc64-gnu/-/lzma-linux-ppc64-gnu-1.4.5.tgz#2f17b9d1fc920c6c511d2086c7623752172c2f07" - integrity sha512-0XRhKuIU/9ZjT4WDIG/qnX7Xz7mSQHYZo9Gb3MP2gcvBgr6BA4zywQ9k3gmQaPn9ECE+CZg2V7DV7kT+x2pUMQ== - -"@napi-rs/lzma-linux-riscv64-gnu@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-riscv64-gnu/-/lzma-linux-riscv64-gnu-1.4.5.tgz#63c2a4e1157586252186e39604370d5b29c6db85" - integrity sha512-QrqDIPEUUB23GCpyQj/QFyMlr8SGxxyExeZz9OWFnHfb70kXdTLWrHS/hEI1Ru+lSbQ/6xRqeoGyQ4Aqdg+/RA== - -"@napi-rs/lzma-linux-s390x-gnu@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-s390x-gnu/-/lzma-linux-s390x-gnu-1.4.5.tgz#6f2ca44bf5c5bef1b31d7516bf15d63c35cdf59f" - integrity sha512-k8RVM5aMhW86E9H0QXdquwojew4H3SwPxbRVbl49/COJQWCUjGi79X6mYruMnMPEznZinUiT1jgKbFo2A00NdA== - -"@napi-rs/lzma-linux-x64-gnu@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.4.5.tgz#54879d88a9c370687b5463c7c1b6208b718c1ab2" - integrity sha512-6rMtBgnIq2Wcl1rQdZsnM+rtCcVCbws1nF8S2NzaUsVaZv8bjrPiAa0lwg4Eqnn1d9lgwqT+cZgm5m+//K08Kw== - -"@napi-rs/lzma-linux-x64-musl@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-musl/-/lzma-linux-x64-musl-1.4.5.tgz#412705f6925f10f45122bd0f3e2fb6e597bed4f8" - integrity sha512-eiadGBKi7Vd0bCArBUOO/qqRYPHt/VQVvGyYvDFt6C2ZSIjlD+HuOl+2oS1sjf4CFjK4eDIog6EdXnL0NE6iyQ== - -"@napi-rs/lzma-wasm32-wasi@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-wasm32-wasi/-/lzma-wasm32-wasi-1.4.5.tgz#4b74abfd144371123cb6f5b7bad5bae868206ecf" - integrity sha512-+VyHHlr68dvey6fXc2hehw9gHVFIW3TtGF1XkcbAu65qVXsA9D/T+uuoRVqhE+JCyFHFrO0ixRbZDRK1XJt1sA== - dependencies: - "@napi-rs/wasm-runtime" "^1.0.3" - -"@napi-rs/lzma-win32-arm64-msvc@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-arm64-msvc/-/lzma-win32-arm64-msvc-1.4.5.tgz#7ed8c80d588fa244a7fd55249cb0d011d04bf984" - integrity sha512-eewnqvIyyhHi3KaZtBOJXohLvwwN27gfS2G/YDWdfHlbz1jrmfeHAmzMsP5qv8vGB+T80TMHNkro4kYjeh6Deg== - -"@napi-rs/lzma-win32-ia32-msvc@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-ia32-msvc/-/lzma-win32-ia32-msvc-1.4.5.tgz#e6f70ca87bd88370102aa610ee9e44ec28911b46" - integrity sha512-OeacFVRCJOKNU/a0ephUfYZ2Yt+NvaHze/4TgOwJ0J0P4P7X1mHzN+ig9Iyd74aQDXYqc7kaCXA2dpAOcH87Cg== - -"@napi-rs/lzma-win32-x64-msvc@1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-x64-msvc/-/lzma-win32-x64-msvc-1.4.5.tgz#ecfcfe364e805915608ce0ff41ed4c950fdb51b8" - integrity sha512-T4I1SamdSmtyZgDXGAGP+y5LEK5vxHUFwe8mz6D4R7Sa5/WCxTcCIgPJ9BD7RkpO17lzhlaM2vmVvMy96Lvk9Q== - -"@napi-rs/lzma@^1.4.5": - version "1.4.5" - resolved "https://registry.yarnpkg.com/@napi-rs/lzma/-/lzma-1.4.5.tgz#43e17cdfe332a3f33fa640422da348db3d8825e1" - integrity sha512-zS5LuN1OBPAyZpda2ZZgYOEDC+xecUdAGnrvbYzjnLXkrq/OBC3B9qcRvlxbDR3k5H/gVfvef1/jyUqPknqjbg== - optionalDependencies: - "@napi-rs/lzma-android-arm-eabi" "1.4.5" - "@napi-rs/lzma-android-arm64" "1.4.5" - "@napi-rs/lzma-darwin-arm64" "1.4.5" - "@napi-rs/lzma-darwin-x64" "1.4.5" - "@napi-rs/lzma-freebsd-x64" "1.4.5" - "@napi-rs/lzma-linux-arm-gnueabihf" "1.4.5" - "@napi-rs/lzma-linux-arm64-gnu" "1.4.5" - "@napi-rs/lzma-linux-arm64-musl" "1.4.5" - "@napi-rs/lzma-linux-ppc64-gnu" "1.4.5" - "@napi-rs/lzma-linux-riscv64-gnu" "1.4.5" - "@napi-rs/lzma-linux-s390x-gnu" "1.4.5" - "@napi-rs/lzma-linux-x64-gnu" "1.4.5" - "@napi-rs/lzma-linux-x64-musl" "1.4.5" - "@napi-rs/lzma-wasm32-wasi" "1.4.5" - "@napi-rs/lzma-win32-arm64-msvc" "1.4.5" - "@napi-rs/lzma-win32-ia32-msvc" "1.4.5" - "@napi-rs/lzma-win32-x64-msvc" "1.4.5" - -"@napi-rs/tar-android-arm-eabi@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-android-arm-eabi/-/tar-android-arm-eabi-1.1.0.tgz#08ae6ebbaf38d416954a28ca09bf77410d5b0c2b" - integrity sha512-h2Ryndraj/YiKgMV/r5by1cDusluYIRT0CaE0/PekQ4u+Wpy2iUVqvzVU98ZPnhXaNeYxEvVJHNGafpOfaD0TA== - -"@napi-rs/tar-android-arm64@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-android-arm64/-/tar-android-arm64-1.1.0.tgz#825a76140116f89d7e930245bda9f70b196da565" - integrity sha512-DJFyQHr1ZxNZorm/gzc1qBNLF/FcKzcH0V0Vwan5P+o0aE2keQIGEjJ09FudkF9v6uOuJjHCVDdK6S6uHtShAw== - -"@napi-rs/tar-darwin-arm64@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-darwin-arm64/-/tar-darwin-arm64-1.1.0.tgz#8821616c40ea52ec2c00a055be56bf28dee76013" - integrity sha512-Zz2sXRzjIX4e532zD6xm2SjXEym6MkvfCvL2RMpG2+UwNVDVscHNcz3d47Pf3sysP2e2af7fBB3TIoK2f6trPw== - -"@napi-rs/tar-darwin-x64@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-darwin-x64/-/tar-darwin-x64-1.1.0.tgz#4a975e41932a145c58181cb43c8f483c3858e359" - integrity sha512-EI+CptIMNweT0ms9S3mkP/q+J6FNZ1Q6pvpJOEcWglRfyfQpLqjlC0O+dptruTPE8VamKYuqdjxfqD8hifZDOA== - -"@napi-rs/tar-freebsd-x64@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-freebsd-x64/-/tar-freebsd-x64-1.1.0.tgz#5ebc0633f257b258aacc59ac1420835513ed0967" - integrity sha512-J0PIqX+pl6lBIAckL/c87gpodLbjZB1OtIK+RDscKC9NLdpVv6VGOxzUV/fYev/hctcE8EfkLbgFOfpmVQPg2g== - -"@napi-rs/tar-linux-arm-gnueabihf@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm-gnueabihf/-/tar-linux-arm-gnueabihf-1.1.0.tgz#1d309bd4f46f0490353d9608e79d260cf6c7cd43" - integrity sha512-SLgIQo3f3EjkZ82ZwvrEgFvMdDAhsxCYjyoSuWfHCz0U16qx3SuGCp8+FYOPYCECHN3ZlGjXnoAIt9ERd0dEUg== - -"@napi-rs/tar-linux-arm64-gnu@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm64-gnu/-/tar-linux-arm64-gnu-1.1.0.tgz#88d974821f3f8e9ee6948b4d51c78c019dee88ad" - integrity sha512-d014cdle52EGaH6GpYTQOP9Py7glMO1zz/+ynJPjjzYFSxvdYx0byrjumZk2UQdIyGZiJO2MEFpCkEEKFSgPYA== - -"@napi-rs/tar-linux-arm64-musl@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm64-musl/-/tar-linux-arm64-musl-1.1.0.tgz#ab2baee7b288df5e68cef0b2d12fa79d2a551b58" - integrity sha512-L/y1/26q9L/uBqiW/JdOb/Dc94egFvNALUZV2WCGKQXc6UByPBMgdiEyW2dtoYxYYYYc+AKD+jr+wQPcvX2vrQ== - -"@napi-rs/tar-linux-ppc64-gnu@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-ppc64-gnu/-/tar-linux-ppc64-gnu-1.1.0.tgz#7500e60d27849ba36fa4802a346249974e7ecf74" - integrity sha512-EPE1K/80RQvPbLRJDJs1QmCIcH+7WRi0F73+oTe1582y9RtfGRuzAkzeBuAGRXAQEjRQw/RjtNqr6UTJ+8UuWQ== - -"@napi-rs/tar-linux-s390x-gnu@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-s390x-gnu/-/tar-linux-s390x-gnu-1.1.0.tgz#cfc0923bfad1dea8ef9da22148a8d4932aa52d08" - integrity sha512-B2jhWiB1ffw1nQBqLUP1h4+J1ovAxBOoe5N2IqDMOc63fsPZKNqF1PvO/dIem8z7LL4U4bsfmhy3gBfu547oNQ== - -"@napi-rs/tar-linux-x64-gnu@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-x64-gnu/-/tar-linux-x64-gnu-1.1.0.tgz#5fdf9e1bb12b10a951c6ab03268a9f8d9788c929" - integrity sha512-tbZDHnb9617lTnsDMGo/eAMZxnsQFnaRe+MszRqHguKfMwkisc9CCJnks/r1o84u5fECI+J/HOrKXgczq/3Oww== - -"@napi-rs/tar-linux-x64-musl@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-x64-musl/-/tar-linux-x64-musl-1.1.0.tgz#f001fc0a0a2996dcf99e787a15eade8dce215e91" - integrity sha512-dV6cODlzbO8u6Anmv2N/ilQHq/AWz0xyltuXoLU3yUyXbZcnWYZuB2rL8OBGPmqNcD+x9NdScBNXh7vWN0naSQ== - -"@napi-rs/tar-wasm32-wasi@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-wasm32-wasi/-/tar-wasm32-wasi-1.1.0.tgz#c1c7df7738b23f1cdbcff261d5bea6968d0a3c9a" - integrity sha512-jIa9nb2HzOrfH0F8QQ9g3WE4aMH5vSI5/1NYVNm9ysCmNjCCtMXCAhlI3WKCdm/DwHf0zLqdrrtDFXODcNaqMw== - dependencies: - "@napi-rs/wasm-runtime" "^1.0.3" - -"@napi-rs/tar-win32-arm64-msvc@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-arm64-msvc/-/tar-win32-arm64-msvc-1.1.0.tgz#4c8519eab28021e1eda0847433cab949d5389833" - integrity sha512-vfpG71OB0ijtjemp3WTdmBKJm9R70KM8vsSExMsIQtV0lVzP07oM1CW6JbNRPXNLhRoue9ofYLiUDk8bE0Hckg== - -"@napi-rs/tar-win32-ia32-msvc@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-ia32-msvc/-/tar-win32-ia32-msvc-1.1.0.tgz#4f61af0da2c53b23f7d58c77970eaa4449e8eb79" - integrity sha512-hGPyPW60YSpOSgzfy68DLBHgi6HxkAM+L59ZZZPMQ0TOXjQg+p2EW87+TjZfJOkSpbYiEkULwa/f4a2hcVjsqQ== - -"@napi-rs/tar-win32-x64-msvc@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-x64-msvc/-/tar-win32-x64-msvc-1.1.0.tgz#eb63fb44ecde001cce6be238f175e66a06c15035" - integrity sha512-L6Ed1DxXK9YSCMyvpR8MiNAyKNkQLjsHsHK9E0qnHa8NzLFqzDKhvs5LfnWxM2kJ+F7m/e5n9zPm24kHb3LsVw== - -"@napi-rs/tar@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@napi-rs/tar/-/tar-1.1.0.tgz#acecd9e29f705a3f534d5fb3d8aa36b3266727d0" - integrity sha512-7cmzIu+Vbupriudo7UudoMRH2OA3cTw67vva8MxeoAe5S7vPFI7z0vp0pMXiA25S8IUJefImQ90FeJjl8fjEaQ== - optionalDependencies: - "@napi-rs/tar-android-arm-eabi" "1.1.0" - "@napi-rs/tar-android-arm64" "1.1.0" - "@napi-rs/tar-darwin-arm64" "1.1.0" - "@napi-rs/tar-darwin-x64" "1.1.0" - "@napi-rs/tar-freebsd-x64" "1.1.0" - "@napi-rs/tar-linux-arm-gnueabihf" "1.1.0" - "@napi-rs/tar-linux-arm64-gnu" "1.1.0" - "@napi-rs/tar-linux-arm64-musl" "1.1.0" - "@napi-rs/tar-linux-ppc64-gnu" "1.1.0" - "@napi-rs/tar-linux-s390x-gnu" "1.1.0" - "@napi-rs/tar-linux-x64-gnu" "1.1.0" - "@napi-rs/tar-linux-x64-musl" "1.1.0" - "@napi-rs/tar-wasm32-wasi" "1.1.0" - "@napi-rs/tar-win32-arm64-msvc" "1.1.0" - "@napi-rs/tar-win32-ia32-msvc" "1.1.0" - "@napi-rs/tar-win32-x64-msvc" "1.1.0" - "@napi-rs/wasm-runtime@^0.2.11": version "0.2.12" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2" @@ -494,199 +114,6 @@ "@emnapi/runtime" "^1.4.3" "@tybys/wasm-util" "^0.10.0" -"@napi-rs/wasm-runtime@^1.0.3": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz#cccd6ebc40b991dea6936f9126b1b8155b6c4c95" - integrity sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q== - dependencies: - "@tybys/wasm-util" "^0.10.2" - -"@napi-rs/wasm-tools-android-arm-eabi@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-android-arm-eabi/-/wasm-tools-android-arm-eabi-1.0.1.tgz#a709f93ddd95508a4ef949b5ceff2b2e85b676f7" - integrity sha512-lr07E/l571Gft5v4aA1dI8koJEmF1F0UigBbsqg9OWNzg80H3lDPO+auv85y3T/NHE3GirDk7x/D3sLO57vayw== - -"@napi-rs/wasm-tools-android-arm64@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-android-arm64/-/wasm-tools-android-arm64-1.0.1.tgz#304b5761b4fcc871b876ebd34975c72c9d11a7fc" - integrity sha512-WDR7S+aRLV6LtBJAg5fmjKkTZIdrEnnQxgdsb7Cf8pYiMWBHLU+LC49OUVppQ2YSPY0+GeYm9yuZWW3kLjJ7Bg== - -"@napi-rs/wasm-tools-darwin-arm64@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-darwin-arm64/-/wasm-tools-darwin-arm64-1.0.1.tgz#dafb4330986a8b46e8de1603ea2f6932a19634c6" - integrity sha512-qWTI+EEkiN0oIn/N2gQo7+TVYil+AJ20jjuzD2vATS6uIjVz+Updeqmszi7zq7rdFTLp6Ea3/z4kDKIfZwmR9g== - -"@napi-rs/wasm-tools-darwin-x64@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-darwin-x64/-/wasm-tools-darwin-x64-1.0.1.tgz#0919e63714ee0a52b1120f6452bbc3a4d793ce3c" - integrity sha512-bA6hubqtHROR5UI3tToAF/c6TDmaAgF0SWgo4rADHtQ4wdn0JeogvOk50gs2TYVhKPE2ZD2+qqt7oBKB+sxW3A== - -"@napi-rs/wasm-tools-freebsd-x64@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-freebsd-x64/-/wasm-tools-freebsd-x64-1.0.1.tgz#1f50a2d5d5af041c55634f43f623ae49192bce9c" - integrity sha512-90+KLBkD9hZEjPQW1MDfwSt5J1L46EUKacpCZWyRuL6iIEO5CgWU0V/JnEgFsDOGyyYtiTvHc5bUdUTWd4I9Vg== - -"@napi-rs/wasm-tools-linux-arm64-gnu@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-arm64-gnu/-/wasm-tools-linux-arm64-gnu-1.0.1.tgz#6106d5e65a25ec2ae417c2fcfebd5c8f14d80e84" - integrity sha512-rG0QlS65x9K/u3HrKafDf8cFKj5wV2JHGfl8abWgKew0GVPyp6vfsDweOwHbWAjcHtp2LHi6JHoW80/MTHm52Q== - -"@napi-rs/wasm-tools-linux-arm64-musl@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-arm64-musl/-/wasm-tools-linux-arm64-musl-1.0.1.tgz#0eb3d4d1fbc1938b0edd907423840365ebc53859" - integrity sha512-jAasbIvjZXCgX0TCuEFQr+4D6Lla/3AAVx2LmDuMjgG4xoIXzjKWl7c4chuaD+TI+prWT0X6LJcdzFT+ROKGHQ== - -"@napi-rs/wasm-tools-linux-x64-gnu@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-x64-gnu/-/wasm-tools-linux-x64-gnu-1.0.1.tgz#5de6a567083a83efed16d046f47b680cbe7c9b53" - integrity sha512-Plgk5rPqqK2nocBGajkMVbGm010Z7dnUgq0wtnYRZbzWWxwWcXfZMPa8EYxrK4eE8SzpI7VlZP1tdVsdjgGwMw== - -"@napi-rs/wasm-tools-linux-x64-musl@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-x64-musl/-/wasm-tools-linux-x64-musl-1.0.1.tgz#04cc17ef12b4e5012f2d0e46b09cabe473566e5a" - integrity sha512-GW7AzGuWxtQkyHknHWYFdR0CHmW6is8rG2Rf4V6GNmMpmwtXt/ItWYWtBe4zqJWycMNazpfZKSw/BpT7/MVCXQ== - -"@napi-rs/wasm-tools-wasm32-wasi@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-wasm32-wasi/-/wasm-tools-wasm32-wasi-1.0.1.tgz#6ced3bd03428c854397f00509b1694c3af857a0f" - integrity sha512-/nQVSTrqSsn7YdAc2R7Ips/tnw5SPUcl3D7QrXCNGPqjbatIspnaexvaOYNyKMU6xPu+pc0BTnKVmqhlJJCPLA== - dependencies: - "@napi-rs/wasm-runtime" "^1.0.3" - -"@napi-rs/wasm-tools-win32-arm64-msvc@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-arm64-msvc/-/wasm-tools-win32-arm64-msvc-1.0.1.tgz#e776f66eb637eee312b562e987c0a5871ddc6dac" - integrity sha512-PFi7oJIBu5w7Qzh3dwFea3sHRO3pojMsaEnUIy22QvsW+UJfNQwJCryVrpoUt8m4QyZXI+saEq/0r4GwdoHYFQ== - -"@napi-rs/wasm-tools-win32-ia32-msvc@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-ia32-msvc/-/wasm-tools-win32-ia32-msvc-1.0.1.tgz#9167919a62d24cb3a46f01fada26fee38aeaf884" - integrity sha512-gXkuYzxQsgkj05Zaq+KQTkHIN83dFAwMcTKa2aQcpYPRImFm2AQzEyLtpXmyCWzJ0F9ZYAOmbSyrNew8/us6bw== - -"@napi-rs/wasm-tools-win32-x64-msvc@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-x64-msvc/-/wasm-tools-win32-x64-msvc-1.0.1.tgz#f896ab29a83605795bb12cf2cfc1a215bc830c65" - integrity sha512-rEAf05nol3e3eei2sRButmgXP+6ATgm0/38MKhz9Isne82T4rPIMYsCIFj0kOisaGeVwoi2fnm7O9oWp5YVnYQ== - -"@napi-rs/wasm-tools@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools/-/wasm-tools-1.0.1.tgz#f54caa0132322fd5275690b2aeb581d11539262f" - integrity sha512-enkZYyuCdo+9jneCPE/0fjIta4wWnvVN9hBo2HuiMpRF0q3lzv1J6b/cl7i0mxZUKhBrV3aCKDBQnCOhwKbPmQ== - optionalDependencies: - "@napi-rs/wasm-tools-android-arm-eabi" "1.0.1" - "@napi-rs/wasm-tools-android-arm64" "1.0.1" - "@napi-rs/wasm-tools-darwin-arm64" "1.0.1" - "@napi-rs/wasm-tools-darwin-x64" "1.0.1" - "@napi-rs/wasm-tools-freebsd-x64" "1.0.1" - "@napi-rs/wasm-tools-linux-arm64-gnu" "1.0.1" - "@napi-rs/wasm-tools-linux-arm64-musl" "1.0.1" - "@napi-rs/wasm-tools-linux-x64-gnu" "1.0.1" - "@napi-rs/wasm-tools-linux-x64-musl" "1.0.1" - "@napi-rs/wasm-tools-wasm32-wasi" "1.0.1" - "@napi-rs/wasm-tools-win32-arm64-msvc" "1.0.1" - "@napi-rs/wasm-tools-win32-ia32-msvc" "1.0.1" - "@napi-rs/wasm-tools-win32-x64-msvc" "1.0.1" - -"@octokit/auth-token@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-6.0.0.tgz#b02e9c08a2d8937df09a2a981f226ad219174c53" - integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== - -"@octokit/core@^7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-7.0.6.tgz#0d58704391c6b681dec1117240ea4d2a98ac3916" - integrity sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q== - dependencies: - "@octokit/auth-token" "^6.0.0" - "@octokit/graphql" "^9.0.3" - "@octokit/request" "^10.0.6" - "@octokit/request-error" "^7.0.2" - "@octokit/types" "^16.0.0" - before-after-hook "^4.0.0" - universal-user-agent "^7.0.0" - -"@octokit/endpoint@^11.0.3": - version "11.0.3" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.3.tgz#acf5f7feddde4e12185d5312ee38ff77235d8205" - integrity sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag== - dependencies: - "@octokit/types" "^16.0.0" - universal-user-agent "^7.0.2" - -"@octokit/graphql@^9.0.3": - version "9.0.3" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-9.0.3.tgz#5b8341c225909e924b466705c13477face869456" - integrity sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA== - dependencies: - "@octokit/request" "^10.0.6" - "@octokit/types" "^16.0.0" - universal-user-agent "^7.0.0" - -"@octokit/openapi-types@^27.0.0": - version "27.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz#374ea53781965fd02a9d36cacb97e152cefff12d" - integrity sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA== - -"@octokit/plugin-paginate-rest@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz#44dc9fff2dacb148d4c5c788b573ddc044503026" - integrity sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw== - dependencies: - "@octokit/types" "^16.0.0" - -"@octokit/plugin-request-log@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz#de1c1e557df6c08adb631bf78264fa741e01b317" - integrity sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q== - -"@octokit/plugin-rest-endpoint-methods@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz#8c54397d3a4060356a1c8a974191ebf945924105" - integrity sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw== - dependencies: - "@octokit/types" "^16.0.0" - -"@octokit/request-error@^7.0.2": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-7.1.0.tgz#440fa3cae310466889778f5a222b47a580743638" - integrity sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw== - dependencies: - "@octokit/types" "^16.0.0" - -"@octokit/request@^10.0.6": - version "10.0.10" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.10.tgz#45e46934f3d772f006733be6b5ec18f22e54a00c" - integrity sha512-KxNC2pTqqhszMNrf12ZRd4PonRgyJdsM4F/jySiddQK+DsRcfBtUvqn8t7UsyZhnRJHvX46OohDt5N3VqIWC2w== - dependencies: - "@octokit/endpoint" "^11.0.3" - "@octokit/request-error" "^7.0.2" - "@octokit/types" "^16.0.0" - content-type "^2.0.0" - json-with-bigint "^3.5.3" - universal-user-agent "^7.0.2" - -"@octokit/rest@^22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-22.0.1.tgz#4d866c32b76b711d3f736f91992e2b534163b416" - integrity sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw== - dependencies: - "@octokit/core" "^7.0.6" - "@octokit/plugin-paginate-rest" "^14.0.0" - "@octokit/plugin-request-log" "^6.0.0" - "@octokit/plugin-rest-endpoint-methods" "^17.0.0" - -"@octokit/types@^16.0.0": - version "16.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-16.0.0.tgz#fbd7fa590c2ef22af881b1d79758bfaa234dbb7c" - integrity sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg== - dependencies: - "@octokit/openapi-types" "^27.0.0" - -"@package-json/types@^0.0.12": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@package-json/types/-/types-0.0.12.tgz#4629e833ba128ed9880b6b7a947633ee22952462" - integrity sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw== - "@stylistic/eslint-plugin@^5.9.0": version "5.10.0" resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz#471bbd9f7a27ceaac4a217e7f5b3890855e5640c" @@ -706,13 +133,6 @@ dependencies: tslib "^2.4.0" -"@tybys/wasm-util@^0.10.2": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.2.tgz#12b3a1b33db1f9cad4ddff1f604ab7dd00bf464e" - integrity sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg== - dependencies: - tslib "^2.4.0" - "@types/esrecurse@^4.3.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" @@ -850,11 +270,6 @@ ajv@^6.14.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - balanced-match@^4.0.2: version "4.0.4" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" @@ -865,11 +280,6 @@ baseline-browser-mapping@^2.9.0: resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== -before-after-hook@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-4.0.0.tgz#cf1447ab9160df6a40f3621da64d6ffc36050cb9" - integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== - brace-expansion@^5.0.2: version "5.0.4" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" @@ -903,11 +313,6 @@ change-case@^5.4.4: resolved "https://registry.yarnpkg.com/change-case/-/change-case-5.4.4.tgz#0d52b507d8fb8f204343432381d1a6d7bff97a02" integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== -chardet@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.1.tgz#5c75593704a642f71ee53717df234031e65373c8" - integrity sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== - ci-info@^4.3.1: version "4.4.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.4.0.tgz#7d54eff9f54b45b62401c26032696eb59c8bd18c" @@ -920,33 +325,11 @@ clean-regexp@^1.0.0: dependencies: escape-string-regexp "^1.0.5" -cli-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" - integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== - -clipanion@^4.0.0-rc.4: - version "4.0.0-rc.4" - resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-4.0.0-rc.4.tgz#7191a940e47ef197e5f18c9cbbe419278b5f5903" - integrity sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q== - dependencies: - typanion "^3.8.0" - -colorette@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - comment-parser@^1.4.1: version "1.4.5" resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.5.tgz#6c595cd090737a1010fe5ff40d86e1d21b7bd6ce" integrity sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw== -content-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-2.0.0.tgz#2fb3ede69dffa0af78ca7c4ce7589680638b56df" - integrity sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ== - core-js-compat@^3.46.0: version "3.48.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" @@ -980,11 +363,6 @@ electron-to-chromium@^1.5.263: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz#09f8973100c39fb0d003b890393cd1d58932b1c8" integrity sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg== -emnapi@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/emnapi/-/emnapi-1.11.1.tgz#9f3da4463d61a89822ac902f95a3e324adfd340e" - integrity sha512-kSRjhIcxjMFsBqk7ORvoc9aA5SBKDmecrtF5RMcmOTao0kD/zamaxsuTxMI8C1//wGUuvE7a+19pCE7AEhGVnA== - enhanced-resolve@^5.17.1: version "5.20.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz#323c2a70d2aa7fb4bdfd6d3c24dfc705c581295d" @@ -993,11 +371,6 @@ enhanced-resolve@^5.17.1: graceful-fs "^4.2.4" tapable "^2.3.0" -es-toolkit@^1.47.0: - version "1.47.1" - resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.47.1.tgz#6f049fef04c2ef27400e8f38255a0dca323e1c3a" - integrity sha512-5RAqEwf4P4E17p+W75KLOWw/nOvKZzSQpxM32IpI2KZLaVonjTrZ0Ai5ghMaVI9eKC2p8eoQgcBdkEDgzFk6+Q== - escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -1037,12 +410,11 @@ eslint-plugin-es-x@^7.8.0: "@eslint-community/regexpp" "^4.11.0" eslint-compat-utils "^0.5.1" -eslint-plugin-import-x@^4.12.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.2.tgz#95d1f798795566712c87897317ef8433d101db29" - integrity sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw== +eslint-plugin-import-x@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.17.1.tgz#6e9211acd8e98d2da11f96c12c9c00aa49e3e035" + integrity sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg== dependencies: - "@package-json/types" "^0.0.12" "@typescript-eslint/types" "^8.56.0" comment-parser "^1.4.1" debug "^4.4.1" @@ -1115,17 +487,17 @@ eslint-visitor-keys@^5.0.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== -eslint@^10.0.2: - version "10.0.3" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.0.3.tgz#360a7de7f2706eb8a32caa17ca983f0089efe694" - integrity sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ== +eslint@^10.6.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.6.0.tgz#e1b4059c582be950c7088c9b55f984738b243c27" + integrity sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg== dependencies: "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.2" - "@eslint/config-array" "^0.23.3" - "@eslint/config-helpers" "^0.5.2" - "@eslint/core" "^1.1.1" - "@eslint/plugin-kit" "^0.6.1" + "@eslint/config-array" "^0.23.5" + "@eslint/config-helpers" "^0.6.0" + "@eslint/core" "^1.2.1" + "@eslint/plugin-kit" "^0.7.2" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" @@ -1136,7 +508,7 @@ eslint@^10.0.2: escape-string-regexp "^4.0.0" eslint-scope "^9.1.2" eslint-visitor-keys "^5.0.1" - espree "^11.1.1" + espree "^11.2.0" esquery "^1.7.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -1160,7 +532,7 @@ espree@^10.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" -espree@^11.1.1: +espree@^11.2.0: version "11.2.0" resolved "https://registry.yarnpkg.com/espree/-/espree-11.2.0.tgz#01d5e47dc332aaba3059008362454a8cc34ccaa5" integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== @@ -1208,25 +580,6 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-string-truncated-width@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz#23afe0da67d752ca0727538f1e6967759728ce49" - integrity sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g== - -fast-string-width@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fast-string-width/-/fast-string-width-3.0.2.tgz#16dbabb491ce5585b5ecb675b65c165d71688eeb" - integrity sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg== - dependencies: - fast-string-truncated-width "^3.0.2" - -fast-wrap-ansi@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz#95e952a0145bce3f59ad56e179f84c48d4072935" - integrity sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q== - dependencies: - fast-string-width "^3.0.2" - file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -1284,10 +637,10 @@ globals@^16.4.0: resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== -globals@^17.4.0: - version "17.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.4.0.tgz#33d7d297ed1536b388a0e2f4bcd0ff19c8ff91b5" - integrity sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw== +globals@^17.7.0: + version "17.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-17.7.0.tgz#553d55090b4dde8209ec2da42580d6e7e7d8b10d" + integrity sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg== globrex@^0.1.2: version "0.1.2" @@ -1299,13 +652,6 @@ graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -iconv-lite@^0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" - integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ignore@^5.2.0, ignore@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -1345,13 +691,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -js-yaml@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.2.0.tgz#2bd9e85682dd91bd469afb809d816043b3d49524" - integrity sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw== - dependencies: - argparse "^2.0.1" - jsesc@^3.1.0, jsesc@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" @@ -1372,11 +711,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-with-bigint@^3.5.3: - version "3.5.8" - resolved "https://registry.yarnpkg.com/json-with-bigint/-/json-with-bigint-3.5.8.tgz#1b1edb55a1bc4816ca87ac684297591acd822383" - integrity sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw== - keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -1411,11 +745,6 @@ ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-3.0.0.tgz#cd8014dd2acb72e1e91bb67c74f0019e620ba2d1" - integrity sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw== - napi-postinstall@^0.3.0: version "0.3.4" resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9" @@ -1431,11 +760,6 @@ node-releases@^2.0.27: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== -obug@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/obug/-/obug-2.1.3.tgz#c02c60f95abd603409330e767db7f2823193331e" - integrity sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg== - optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -1514,21 +838,11 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - semver@^7.5.4, semver@^7.6.3, semver@^7.7.2, semver@^7.7.3: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== -semver@^7.8.2: - version "7.8.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.4.tgz#c73eceebae0616934be8dff28a7fd70757c8e696" - integrity sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA== - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -1541,11 +855,6 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - stable-hash-x@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz#dfd76bfa5d839a7470125c6a6b3c8b22061793e9" @@ -1573,11 +882,6 @@ tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -typanion@^3.14.0, typanion@^3.8.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/typanion/-/typanion-3.14.0.tgz#a766a91810ce8258033975733e836c43a2929b94" - integrity sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug== - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -1585,11 +889,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be" - integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== - unrs-resolver@^1.9.2: version "1.11.1" resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz#be9cd8686c99ef53ecb96df2a473c64d304048a9" From 29b267630da08ba48c8be8c684e98363f2cf0802 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Jul 2026 09:44:24 +0200 Subject: [PATCH 55/68] chore(deps): bump express from 4.22.1 to 5.2.1 in /test/crashtracker (#141) Bumps [express](https://github.com/expressjs/express) from 4.22.1 to 5.2.1. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/v4.22.1...v5.2.1) --- updated-dependencies: - dependency-name: express dependency-version: 5.2.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/crashtracker/package-lock.json | 594 ++++++++++++++++++++-------- test/crashtracker/package.json | 2 +- test/crashtracker/yarn.lock | 370 ++++++++++------- 3 files changed, 660 insertions(+), 306 deletions(-) diff --git a/test/crashtracker/package-lock.json b/test/crashtracker/package-lock.json index e6236c70..92fc554d 100644 --- a/test/crashtracker/package-lock.json +++ b/test/crashtracker/package-lock.json @@ -7,7 +7,7 @@ "dependencies": { "@datadog/segfaultify": "^0.1.1", "body-parser": "^1.20.3", - "express": "^4.19.2" + "express": "^5.2.1" } }, "node_modules/@datadog/segfaultify": { @@ -20,23 +20,42 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } }, "node_modules/body-parser": { "version": "1.20.4", @@ -101,15 +120,16 @@ } }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/content-type": { @@ -131,10 +151,13 @@ } }, "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/debug": { "version": "2.6.9", @@ -239,69 +262,263 @@ } }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "node_modules/express/node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/express/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/express/node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -312,12 +529,12 @@ } }, "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/function-bind": { @@ -449,6 +666,12 @@ "node": ">= 0.10" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -468,33 +691,15 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" + "node": ">=18" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mime-db": { @@ -525,9 +730,9 @@ "license": "MIT" }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -568,6 +773,15 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -578,10 +792,14 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -635,24 +853,43 @@ "node": ">= 0.8" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } - ], + } + }, + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/safer-buffer": { @@ -662,27 +899,71 @@ "license": "MIT" }, "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/send/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/send/node_modules/ms": { @@ -692,18 +973,22 @@ "license": "MIT" }, "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { @@ -824,15 +1109,6 @@ "node": ">= 0.8" } }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -841,6 +1117,12 @@ "engines": { "node": ">= 0.8" } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" } } } diff --git a/test/crashtracker/package.json b/test/crashtracker/package.json index 2f81fde3..d5af9436 100644 --- a/test/crashtracker/package.json +++ b/test/crashtracker/package.json @@ -4,6 +4,6 @@ "dependencies": { "@datadog/segfaultify": "^0.1.1", "body-parser": "^1.20.3", - "express": "^4.19.2" + "express": "^5.2.1" } } diff --git a/test/crashtracker/yarn.lock b/test/crashtracker/yarn.lock index af309dca..34ee2463 100644 --- a/test/crashtracker/yarn.lock +++ b/test/crashtracker/yarn.lock @@ -9,20 +9,15 @@ dependencies: node-gyp-build "^3.9.0" -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== +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -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== + mime-types "^3.0.0" + negotiator "^1.0.0" -body-parser@^1.20.3, body-parser@~1.20.3: +body-parser@^1.20.3: version "1.20.4" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.4.tgz#f8e20f4d06ca8a50a71ed329c15dccad1cdc547f" integrity sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA== @@ -40,7 +35,22 @@ body-parser@^1.20.3, body-parser@~1.20.3: type-is "~1.6.18" unpipe "~1.0.0" -bytes@~3.1.2: +body-parser@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.3.0.tgz#6d8662f4d8c336028b8ac9aa24251b0ca64ba437" + integrity sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw== + dependencies: + bytes "^3.1.2" + content-type "^2.0.0" + debug "^4.4.3" + http-errors "^2.0.1" + iconv-lite "^0.7.2" + on-finished "^2.4.1" + qs "^6.15.2" + raw-body "^3.0.2" + type-is "^2.1.0" + +bytes@^3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== @@ -61,24 +71,27 @@ call-bound@^1.0.2: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" -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-disposition@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.1.0.tgz#f3db789c752d45564cc7e9e1e0b31790d4a38e17" + integrity sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g== -content-type@~1.0.4, content-type@~1.0.5: +content-type@^1.0.5, content-type@~1.0.5: 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.7" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" - integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== +content-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-2.0.0.tgz#2fb3ede69dffa0af78ca7c4ce7589680638b56df" + integrity sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== -cookie@~0.7.1: +cookie@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== @@ -90,12 +103,19 @@ debug@2.6.9: dependencies: ms "2.0.0" -depd@2.0.0, depd@~2.0.0: +debug@^4.4.0, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +depd@2.0.0, depd@^2.0.0, 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== -destroy@1.2.0, destroy@~1.2.0: +destroy@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== @@ -114,7 +134,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -encodeurl@~2.0.0: +encodeurl@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== @@ -136,75 +156,71 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: dependencies: es-errors "^1.3.0" -escape-html@~1.0.3: +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== -etag@~1.8.1: +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== -express@^4.19.2: - version "4.22.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.22.1.tgz#1de23a09745a4fffdb39247b344bb5eaff382069" - integrity sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "~1.20.3" - content-disposition "~0.5.4" - content-type "~1.0.4" - cookie "~0.7.1" - cookie-signature "~1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.3.1" - fresh "~0.5.2" - http-errors "~2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "~2.4.1" - parseurl "~1.3.3" - path-to-regexp "~0.1.12" - proxy-addr "~2.0.7" - qs "~6.14.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "~0.19.0" - serve-static "~1.16.2" - setprototypeof "1.2.0" - statuses "~2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -finalhandler@~1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" - integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== +express@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/express/-/express-5.2.1.tgz#8f21d15b6d327f92b4794ecf8cb08a72f956ac04" + integrity sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "~2.4.1" - parseurl "~1.3.3" - statuses "~2.0.2" - unpipe "~1.0.0" + accepts "^2.0.0" + body-parser "^2.2.1" + content-disposition "^1.0.0" + content-type "^1.0.5" + cookie "^0.7.1" + cookie-signature "^1.2.1" + debug "^4.4.0" + depd "^2.0.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + finalhandler "^2.1.0" + fresh "^2.0.0" + http-errors "^2.0.0" + merge-descriptors "^2.0.0" + mime-types "^3.0.0" + on-finished "^2.4.1" + once "^1.4.0" + parseurl "^1.3.3" + proxy-addr "^2.0.7" + qs "^6.14.0" + range-parser "^1.2.1" + router "^2.2.0" + send "^1.1.0" + serve-static "^2.2.0" + statuses "^2.0.1" + type-is "^2.0.1" + vary "^1.1.2" + +finalhandler@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.1.tgz#a2c517a6559852bcdb06d1f8bd7f51b68fad8099" + integrity sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== + dependencies: + debug "^4.4.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + on-finished "^2.4.1" + parseurl "^1.3.3" + statuses "^2.0.1" forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fresh@~0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== function-bind@^1.1.2: version "1.1.2" @@ -252,7 +268,7 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" -http-errors@~2.0.0, http-errors@~2.0.1: +http-errors@^2.0.0, http-errors@^2.0.1, http-errors@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== @@ -263,6 +279,13 @@ http-errors@~2.0.0, http-errors@~2.0.1: statuses "~2.0.2" toidentifier "~1.0.1" +iconv-lite@^0.7.2, iconv-lite@~0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.2.tgz#d0bdeac3f12b4835b7359c2ad89c422a4d1cc72e" + integrity sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== + dependencies: + safer-buffer ">= 2.1.2 < 3.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" @@ -280,6 +303,11 @@ ipaddr.js@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-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -290,47 +318,54 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== -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== +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== mime-db@1.52.0: 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.24, mime-types@~2.1.34: +mime-db@^1.54.0: + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^3.0.0, mime-types@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + +mime-types@~2.1.24: 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== - 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.3: +ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -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== +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== node-gyp-build@^3.9.0: version "3.9.0" @@ -342,24 +377,31 @@ object-inspect@^1.13.3: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== -on-finished@~2.4.1: +on-finished@^2.4.1, 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" -parseurl@~1.3.3: +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" + +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== -path-to-regexp@~0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== +path-to-regexp@^8.0.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz#795c420c4f7ca45c5b887366f622ee0c9852cccd" + integrity sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== -proxy-addr@~2.0.7: +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== @@ -367,6 +409,13 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +qs@^6.14.0, qs@^6.15.2: + version "6.15.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.2.tgz#fd55426d710403ddccc45e0f9eab16db7727ece9" + integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== + dependencies: + side-channel "^1.1.0" + qs@~6.14.0: version "6.14.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" @@ -374,11 +423,21 @@ qs@~6.14.0: dependencies: side-channel "^1.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@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.2.tgz#3e3ada5ae5568f9095d84376fd3a49b8fb000a51" + integrity sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.7.0" + unpipe "~1.0.0" + raw-body@~2.5.3: version "2.5.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" @@ -389,46 +448,50 @@ raw-body@~2.5.3: iconv-lite "~0.4.24" unpipe "~1.0.0" -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +router@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -send@~0.19.0, send@~0.19.1: - version "0.19.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" - integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== +send@^1.1.0, send@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/send/-/send-1.2.1.tgz#9eab743b874f3550f40a26867bf286ad60d3f3ed" + integrity sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "~0.5.2" - http-errors "~2.0.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.4.1" - range-parser "~1.2.1" - statuses "~2.0.2" - -serve-static@~1.16.2: - version "1.16.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" - integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== + debug "^4.4.3" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^2.0.0" + http-errors "^2.0.1" + mime-types "^3.0.2" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.2" + +serve-static@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.1.tgz#7f186a4a4e5f5b663ad7a4294ff1bf37cf0e98a9" + integrity sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "~0.19.1" + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" -setprototypeof@1.2.0, setprototypeof@~1.2.0: +setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== @@ -473,7 +536,7 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" -statuses@~2.0.1, statuses@~2.0.2: +statuses@^2.0.1, statuses@^2.0.2, statuses@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== @@ -483,6 +546,15 @@ toidentifier@~1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +type-is@^2.0.1, type-is@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.1.0.tgz#71d1a7053293582e16ac9f3ebaf1ab9aa49e5570" + integrity sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA== + dependencies: + content-type "^2.0.0" + media-typer "^1.1.0" + mime-types "^3.0.0" + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -496,12 +568,12 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -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== - -vary@~1.1.2: +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== + +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== From 2662b918d665849387b4564ab918b7fcdc1fffe9 Mon Sep 17 00:00:00 2001 From: "gh-worker-campaigns-3e9aa4[bot]" <244854796+gh-worker-campaigns-3e9aa4[bot]@users.noreply.github.com> Date: Fri, 3 Jul 2026 09:47:48 +0200 Subject: [PATCH 56/68] ADMS: vuln patch: brace-expansion, flatted, picomatch (#133) Co-authored-by: gh-worker-campaigns-3e9aa4[bot] <244854796+gh-worker-campaigns-3e9aa4[bot]@users.noreply.github.com> --- yarn.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index f5ecefed..14dca938 100644 --- a/yarn.lock +++ b/yarn.lock @@ -280,10 +280,10 @@ baseline-browser-mapping@^2.9.0: resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== -brace-expansion@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" - integrity sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg== +brace-expansion@^5.0.2, brace-expansion@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.6.tgz#ec68fe0a641a29d8711579caf641d05bae1f2285" + integrity sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g== dependencies: balanced-match "^4.0.2" @@ -608,10 +608,10 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" -flatted@^3.2.9: - version "3.4.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.1.tgz#84ccd9579e76e9cc0d246c11d8be0beb019143e6" - integrity sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ== +flatted@^3.2.9, flatted@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" + integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== get-tsconfig@^4.10.1, get-tsconfig@^4.8.1: version "4.13.6" @@ -801,10 +801,10 @@ picocolors@^1.1.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^4.0.2, picomatch@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== +picomatch@^4.0.2, picomatch@^4.0.3, picomatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== pluralize@^8.0.0: version "8.0.0" From e97ba3e2c46730a928fc9007c92e8bd102b63219 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Mon, 6 Jul 2026 12:55:41 -0400 Subject: [PATCH 57/68] fix(pipeline): stage one chunk per trace in a single request (#159) prepareChunk overwrote the single prepared chunk on each call, so a flush carrying spans from multiple traces could only send the last one. Callers worked around that by passing every span to one prepareChunk, which lumps distinct trace_ids into a single chunk: flush_chunk then treats them as one segment and stamps trace-level tags (sampling priority, _dd.p.dm, origin, top_level) onto only the first span, corrupting sampling and grouping under load. Stage chunks in a Vec instead: prepareChunk pushes one chunk per call and sendPreparedChunk sends them all as a single multi-trace request. The exporter calls prepareChunk once per trace, so each chunk is one segment with correct per-trace tags. send_trace_chunks_async already accepts multiple chunks, so the request shape is unchanged. --- Cargo.lock | 8 ++--- crates/pipeline/src/lib.rs | 42 ++++++++++++------------ test/pipeline.js | 66 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e973b89d..9b0f46f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1071,7 +1071,7 @@ source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bd dependencies = [ "anyhow", "libc", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v35.0.0)", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25)", "memfd", "prost", "rand", @@ -1172,7 +1172,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" version = "3.0.2" -source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25#7cdeb7896e92d1ba38bde495934e112dac2eda25" +source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" dependencies = [ "prost", "serde", @@ -1182,7 +1182,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" version = "3.0.2" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25#7cdeb7896e92d1ba38bde495934e112dac2eda25" dependencies = [ "prost", "serde", @@ -1784,7 +1784,7 @@ version = "0.1.0" dependencies = [ "anyhow", "libdd-library-config 2.0.0", - "libdd-trace-protobuf", + "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25)", "napi", "napi-derive", ] diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs index 9385cbba..28cd78b0 100644 --- a/crates/pipeline/src/lib.rs +++ b/crates/pipeline/src/lib.rs @@ -169,7 +169,11 @@ pub struct WasmSpanState { builder: UnsafeCell>>, cbs: RefCell>, stats_collector: RefCell>, - prepared_spans: RefCell>>>, + /// Chunks staged by `prepareChunk`, one per trace (segment), sent together by + /// `sendPreparedChunk` as a single multi-trace request. The exporter groups a + /// flush batch by trace and calls `prepareChunk` once per trace so each chunk + /// carries exactly one segment's spans with correct per-trace tags. + prepared_spans: RefCell>>>, /// Re-entrancy guard for `sendPreparedChunk`. wasm-bindgen async exports /// can be invoked again from JS before the prior future resolves; without /// this, two calls would each take `&mut` out of `exporter`/`builder` and @@ -291,7 +295,7 @@ impl WasmSpanState { builder: UnsafeCell::new(Some(builder)), cbs: RefCell::new(change_buffer_state), stats_collector: RefCell::new(stats_collector), - prepared_spans: RefCell::new(None), + prepared_spans: RefCell::new(Vec::new()), sending: Cell::new(false), use_v05: Cell::new(false), otlp_endpoint: RefCell::new(None), @@ -389,11 +393,8 @@ impl WasmSpanState { )); } if len == 0 { - // Nothing to send: drop any previously prepared-but-unsent chunk so - // a caller that ignores this `false` cannot later resend a stale one. - if let Some(old_spans) = self.prepared_spans.borrow_mut().take() { - self.cbs.borrow_mut().recycle_spans(old_spans); - } + // Nothing to prepare for this trace; leave any chunks already staged + // for other traces in this same flush untouched. return Ok(false); } @@ -420,16 +421,14 @@ impl WasmSpanState { collector.add_spans(&spans_vec); } - // Recycle any previously prepared spans that were never sent (e.g. - // if the prior send was skipped by JS back-pressure). Reusing the - // pre-allocated HashMaps avoids allocator fragmentation in WASM. - if let Some(old_spans) = self.prepared_spans.borrow_mut().take() { - self.cbs.borrow_mut().recycle_spans(old_spans); - } - - // Store prepared spans for the subsequent sendPreparedChunk call + // Stage this trace's chunk for the subsequent sendPreparedChunk call. + // Multiple prepareChunk calls (one per trace) accumulate here and are + // sent together as one multi-trace request. An empty result (e.g. every + // span already extracted) is not staged. let has_spans = !spans_vec.is_empty(); - *self.prepared_spans.borrow_mut() = Some(spans_vec); + if has_spans { + self.prepared_spans.borrow_mut().push(spans_vec); + } Ok(has_spans) } @@ -449,11 +448,10 @@ impl WasmSpanState { self.sending.set(true); let _in_flight = InFlightGuard(&self.sending); - let spans_vec = self - .prepared_spans - .borrow_mut() - .take() - .ok_or_else(|| JsValue::from_str("no prepared chunk to send"))?; + let chunks = std::mem::take(&mut *self.prepared_spans.borrow_mut()); + if chunks.is_empty() { + return Err(JsValue::from_str("no prepared chunk to send")); + } // SAFETY: WASM is single-threaded and the `sending` guard above // guarantees no overlapping invocation, so this is the only live @@ -510,7 +508,7 @@ impl WasmSpanState { None => return Err(build_failure_error("native exporter unavailable")), }; let resp = exporter - .send_trace_chunks_async(vec![spans_vec]) + .send_trace_chunks_async(chunks) .await; let response_str = resp.map(|resp| match resp { AgentResponse::Unchanged => "unchanged".to_string(), diff --git a/test/pipeline.js b/test/pipeline.js index 68273054..da8fda58 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -373,6 +373,16 @@ function encodeSpanEventAttrs (attributes) { return new Uint8Array(Buffer.concat(chunks)) } +// Read just the length of the outer msgpack array (the v0.4 trace payload is an +// array of trace chunks). Enough to assert how many separate traces were sent. +function msgpackOuterArrayLen (buf) { + const b = buf[0] + if (b >= 0x90 && b <= 0x9F) return b & 0x0F // fixarray + if (b === 0xDC) return buf.readUInt16BE(1) // array16 + if (b === 0xDD) return buf.readUInt32BE(1) // array32 + throw new Error('payload is not a msgpack array: 0x' + b.toString(16)) +} + describe('pipeline', { skip }, () => { let nativeSpans @@ -808,6 +818,62 @@ describe('pipeline', { skip }, () => { server.close() } }) + + it('accumulates one chunk per trace into a single multi-trace request', async () => { + // prepareChunk stages one chunk per call; a single sendPreparedChunk sends + // them all as one request. Before accumulation, a second prepareChunk + // overwrote the first, so only one trace shipped per request. Here two + // spans in two DISTINCT traces must arrive as two separate trace chunks. + const http = require('node:http') + const payloads = [] + const server = http.createServer((req, res) => { + const chunks = [] + req.on('data', c => chunks.push(c)) + req.on('end', () => { + payloads.push({ url: req.url, body: Buffer.concat(chunks) }) + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}` }) + + const mk = (name) => { + const s = ns.createSpan() // distinct random trace id per span + s.name = name + s.service = 'svc' + s.resource = 'res' + s.type = 'web' + s.duration = 1_000_000n + return s + } + const a = mk('trace-a') + const b = mk('trace-b') + + // Prepare one chunk per trace (span id written LE), then send once. + const prepareOne = (span) => { + const buf = Buffer.alloc(8) + for (let i = 0; i < 8; i++) buf[i] = span.spanId[7 - i] + return ns.state.prepareChunk(1, true, buf) + } + + try { + assert.strictEqual(prepareOne(a), true, 'first chunk staged') + assert.strictEqual(prepareOne(b), true, 'second chunk staged') + const result = await ns.state.sendPreparedChunk() + assert(result, 'agent responded') + const post = payloads.find(p => p.url.includes('/v0.4/traces')) + assert.ok(post, 'received a v0.4 POST') + assert.strictEqual( + msgpackOuterArrayLen(post.body), 2, + 'payload carries two separate trace chunks, not one lumped chunk', + ) + } finally { + server.closeAllConnections?.() + server.close() + } + }) }) describe('v0.5 output format', () => { From 29dea8b4628bb18f8bdd785242606578629cad35 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Wed, 8 Jul 2026 12:00:51 -0400 Subject: [PATCH 58/68] feat(pipeline): send Datadog-Client-Computed-Stats when enabled (#164) Add a `client_computed_stats` parameter to `WasmSpanState::new` and set `builder.set_client_computed_stats()` so the exporter sends the `Datadog-Client-Computed-Stats: true` header. The tracer needs this when it runs in APM-standalone (apmTracingEnabled=false) so the agent skips its own APM stats/sampling. The header is also sent whenever `stats_enabled` is set: computing stats client-side requires telling the agent to skip its own, otherwise the same traces are counted twice. Enabling stats therefore always implies the header, so the flags are OR'd in the binding rather than relying on the caller to keep them in sync. libdatadog's TraceExporterBuilder already supports the flag; the WASM binding just never called it. Adds pipeline tests asserting the header is present when client_computed_stats OR stats_enabled is set, and absent when both are off. --- crates/pipeline/src/lib.rs | 14 ++++++++++ test/pipeline.js | 56 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs index 28cd78b0..54b03e82 100644 --- a/crates/pipeline/src/lib.rs +++ b/crates/pipeline/src/lib.rs @@ -236,6 +236,7 @@ impl WasmSpanState { env: &str, app_version: &str, runtime_id: &str, + client_computed_stats: bool, ) -> Result { let mut builder = TraceExporterBuilder::::new(); builder @@ -255,6 +256,19 @@ impl WasmSpanState { .set_runtime_id(runtime_id) .enable_agent_rates_payload_version(); + // Advertise `Datadog-Client-Computed-Stats` so the agent skips its own + // APM stats/sampling for these traces. This is required in two cases: + // - `stats_enabled`: we build a StatsCollector and send client-side + // stats, so the agent MUST NOT also compute them (double counting); + // - `client_computed_stats`: set independently for APM-standalone + // (apmTracingEnabled=false), where the agent should skip APM stats + // even though we don't compute them client-side. + // Enabling stats therefore always implies the header, so OR the flags + // rather than relying on the caller to keep them in sync. + if client_computed_stats || stats_enabled { + builder.set_client_computed_stats(); + } + let mut change_queue = vec![0u8; change_queue_size as usize]; let change_buffer = unsafe { ChangeBuffer::from_raw_parts( diff --git a/test/pipeline.js b/test/pipeline.js index da8fda58..cad84e84 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -167,6 +167,7 @@ class NativeSpansInterface { options.env || 'test-env', options.appVersion || '1.0.0', options.runtimeId || '00000000-0000-0000-0000-000000000000', + options.clientComputedStats ?? false, ) // Get pointers into WASM memory for direct buffer access @@ -1016,6 +1017,61 @@ describe('pipeline', { skip }, () => { }) }) + describe('client-computed-stats header', () => { + async function captureTraceHeader (nsOptions) { + const http = require('node:http') + let header + let sawTraces = false + const server = http.createServer((req, res) => { + req.on('data', () => {}) + req.on('end', () => { + if (req.url === '/v0.4/traces') { + sawTraces = true + header = req.headers['datadog-client-computed-stats'] + } + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}`, ...nsOptions }) + const span = ns.createSpan() + span.name = 'span' + span.service = 'test-service' + span.resource = 'test-resource' + span.type = 'web' + span.duration = 1_000_000n + try { + await ns.flushSpans(span) + return { header, sawTraces } + } finally { + server.closeAllConnections?.() + server.close() + } + } + + it('sends Datadog-Client-Computed-Stats: true when enabled', async () => { + const { header, sawTraces } = await captureTraceHeader({ clientComputedStats: true }) + assert.ok(sawTraces, 'expected a POST to /v0.4/traces') + assert.strictEqual(header, 'true') + }) + + it('omits the header when both flags are disabled', async () => { + const { header, sawTraces } = await captureTraceHeader({ clientComputedStats: false, statsEnabled: false }) + assert.ok(sawTraces, 'expected a POST to /v0.4/traces') + assert.strictEqual(header, undefined) + }) + + it('sends the header when stats are enabled (client-side stats imply it)', async () => { + // Enabling client-side stats without clientComputedStats must still send + // the header, otherwise the agent double-counts APM stats. + const { header, sawTraces } = await captureTraceHeader({ statsEnabled: true, clientComputedStats: false }) + assert.ok(sawTraces, 'expected a POST to /v0.4/traces') + assert.strictEqual(header, 'true') + }) + }) + describe('client-side stats', () => { it('aggregates and flushes stats to /v0.6/stats', async () => { const http = require('node:http') From 35702fc5706c9a6f4d90e9e6f63e825282579f9b Mon Sep 17 00:00:00 2001 From: Bryan English Date: Thu, 9 Jul 2026 15:38:31 -0400 Subject: [PATCH 59/68] feat(capabilities): inject container-id/entity-id/external-env headers (#166) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit libdatadog's automatic entity detection (libdd-common's entity_id module) is gated #[cfg(unix)] and therefore inert on the wasm32 target, and DD_EXTERNAL_ENV is unreachable from wasm, so the native exporter never sent Datadog-Container-ID / Datadog-Entity-ID / Datadog-External-Env. Node can read /proc and process.env, so detect them in the HTTP transport and rewrite the Rust-rendered request head to carry them — the headers native libdatadog adds via set_standard_headers. Detection mirrors dd-trace-js's exporters/common/docker.js (the proven legacy exporter path) and libdd-common's compute_entity_id (ci- else in-). The empty datadog-container-id libdatadog emits on wasm is replaced rather than duplicated, and external-env is rejected if it carries CR/LF or non-ASCII to avoid header injection. --- crates/capabilities/src/http_transport.js | 107 +++++++++++++- test/http_transport.js | 168 ++++++++++++++++++++++ 2 files changed, 274 insertions(+), 1 deletion(-) diff --git a/crates/capabilities/src/http_transport.js b/crates/capabilities/src/http_transport.js index 083d958f..acd1c5c0 100644 --- a/crates/capabilities/src/http_transport.js +++ b/crates/capabilities/src/http_transport.js @@ -1,8 +1,106 @@ const http = require('node:http') const https = require('node:https') +const fs = require('node:fs') let storage = f => f() +// libdatadog's automatic container-id / entity-id detection (libdd-common's +// entity_id module) is gated `#[cfg(unix)]` and therefore inert on the +// `wasm32-unknown-unknown` target we build for, and `DD_EXTERNAL_ENV` is also +// unreachable from wasm. Node, however, can read `/proc` and `process.env`, so +// we detect the same values here and add them as the standard Datadog exporter +// headers (`datadog-container-id`, `datadog-entity-id`, `datadog-external-env`) +// — the headers native libdatadog adds via `Endpoint::set_standard_headers`. +// +// The detection mirrors dd-trace-js's `exporters/common/docker.js` (the proven +// legacy-exporter path) and libdd-common's `compute_entity_id` +// (`ci-` else `in-`). + +// The second alternative is the PCF / Garden regexp; no suffix ($) to avoid +// matching pod UIDs. See +// https://github.com/DataDog/datadog-agent/blob/7.40.x/pkg/util/cgroups/reader.go#L50 +const uuidSource = String.raw`[0-9a-f]{8}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{4}[-_][0-9a-f]{12}|[0-9a-f]{8}(?:-[0-9a-f]{4}){4}$` +const containerSource = '[0-9a-f]{64}' +const taskSource = String.raw`[0-9a-f]{32}-\d+` +const lineReg = /^(\d+):([^:]*):(.+)$/m +const entityReg = new RegExp(String.raw`.*(${uuidSource}|${containerSource}|${taskSource})(?:\.scope)?$`, 'm') + +// Detect the entity headers. Parameterized for unit testing; production callers +// use the cached `getEntityHeaders()` with the real cgroup paths / environment. +function detectEntityHeaders (opts = {}) { + const cgroupPath = opts.cgroupPath ?? '/proc/self/cgroup' + const cgroupMount = opts.cgroupMount ?? '/sys/fs/cgroup' + const externalEnv = 'externalEnv' in opts ? opts.externalEnv : process.env.DD_EXTERNAL_ENV + + const headers = {} + + let cgroup = '' + let containerId + try { + cgroup = fs.readFileSync(cgroupPath, 'utf8').trim() + containerId = cgroup.match(entityReg)?.[1] + } catch { /* not in a cgroup, or not Linux */ } + + let inode = 0 + const inodePath = cgroup.match(lineReg)?.[3] + if (inodePath) { + const strippedPath = inodePath.replaceAll(/^\/|\/$/g, '') + try { + inode = fs.statSync(`${cgroupMount}/${strippedPath}`).ino + } catch { /* mount not present */ } + } + + // `ci-` when a container id is found, else `in-` + // — matching libdd-common's `compute_entity_id`. + const entityId = containerId ? `ci-${containerId}` : (inode ? `in-${inode}` : undefined) + + if (containerId) headers['datadog-container-id'] = containerId + if (entityId) headers['datadog-entity-id'] = entityId + // Only emit external-env if it is a clean header value (visible ASCII + space/ + // tab). This rejects CR/LF (header-injection / request-smuggling vector) and + // non-latin1 that the latin1-encoded head rewrite couldn't represent — native + // libdatadog likewise rejects invalid bytes via the http crate's HeaderValue. + if (externalEnv && /^[\t\u0020-\u007E]*$/.test(externalEnv)) { + headers['datadog-external-env'] = externalEnv + } + + return headers +} + +let cachedEntityHeaders +function getEntityHeaders () { + if (cachedEntityHeaders === undefined) { + cachedEntityHeaders = detectEntityHeaders() + } + return cachedEntityHeaders +} + +// Rewrite the Rust-rendered HTTP/1.1 request head (a `\r\n`-delimited byte +// buffer terminated by a blank line) to carry the detected entity headers. +// Any pre-existing line for a name we set is dropped first, so libdatadog's +// empty `datadog-container-id` is replaced rather than duplicated. Header +// names/values are ASCII, so latin1 is a lossless round-trip. +function applyEntityHeaders (headView, entity = getEntityHeaders()) { + const names = Object.keys(entity) + if (names.length === 0) return Buffer.from(headView) + + const head = Buffer.from(headView).toString('latin1') + const term = head.indexOf('\r\n\r\n') + if (term === -1) return Buffer.from(headView) // malformed; leave untouched + + const drop = new Set(names) + const lines = head.slice(0, term).split('\r\n') + const kept = lines.filter((line, i) => { + if (i === 0) return true // request line + const colon = line.indexOf(':') + const name = (colon === -1 ? line : line.slice(0, colon)).trim().toLowerCase() + return !drop.has(name) + }) + for (const name of names) kept.push(`${name}: ${entity[name]}`) + + return Buffer.from(`${kept.join('\r\n')}\r\n\r\n`, 'latin1') +} + // A retried write can race a wasm-memory detach; treat that as a transient error. function isDetachedBufferError (err) { return err instanceof TypeError && /detached/i.test(err.message) @@ -38,6 +136,13 @@ module.exports.setResponseHeaderObserver = function (new_observer) { responseHeaderObserver = new_observer } +// Exposed for unit tests. +module.exports.detectEntityHeaders = detectEntityHeaders +module.exports.applyEntityHeaders = applyEntityHeaders +module.exports._resetEntityHeadersCache = () => { + cachedEntityHeaders = undefined +} + module.exports.httpRequest = function (host, port, isHttps, socketPath, head_ptr, head_len, body_ptr, body_len, wasm_memory) { // A non-empty socketPath routes over a Unix domain socket (or Windows named // pipe) instead of TCP. Sockets are always plaintext HTTP/1.1, so https is @@ -92,7 +197,7 @@ module.exports.httpRequest = function (host, port, isHttps, socketPath, head_ptr // makes write/end skip _implicitHeader and _send prepends our bytes. try { - req._header = Buffer.from(headView) + req._header = applyEntityHeaders(headView) req.write(bodyView) req.end() } catch (error) { diff --git a/test/http_transport.js b/test/http_transport.js index 656f7133..057f5f05 100644 --- a/test/http_transport.js +++ b/test/http_transport.js @@ -171,3 +171,171 @@ describe('http_transport unix socket', { skip: process.platform === 'win32' }, ( assert.strictEqual(Buffer.from(body).toString('utf8'), RESPONSE_BODY) }) }) + +// Entity-header injection: container-id / entity-id / external-env detection +// (Node reads /proc + env; libdatadog's own detection is inert on wasm) and the +// rewrite of the Rust-rendered request head that carries them. +const { detectEntityHeaders, applyEntityHeaders } = transport + +const DOCKER_CGROUP = '12:memory:/docker/3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860' +const DOCKER_ID = '3726184226f5d3147c25fdeab5b60097e378e8a720503a5e19ecfdf29f869860' + +function writeTmpCgroup (contents) { + const p = path.join(os.tmpdir(), `ldn-cgroup-${process.pid}-${Math.random().toString(36).slice(2)}`) + fs.writeFileSync(p, contents) + return p +} + +function headBytes (lines) { + return Buffer.from(lines.join('\r\n') + '\r\n\r\n', 'latin1') +} + +describe('http_transport entity headers', () => { + describe('detectEntityHeaders', () => { + it('extracts a docker container-id and derives ci- entity-id', () => { + const cgroupPath = writeTmpCgroup(DOCKER_CGROUP) + try { + const h = detectEntityHeaders({ cgroupPath, cgroupMount: '/nonexistent', externalEnv: undefined }) + assert.strictEqual(h['datadog-container-id'], DOCKER_ID) + assert.strictEqual(h['datadog-entity-id'], `ci-${DOCKER_ID}`) + assert.strictEqual('datadog-external-env' in h, false) + } finally { + fs.rmSync(cgroupPath, { force: true }) + } + }) + + it('falls back to in- entity-id when no container-id is present', () => { + const cgroupPath = writeTmpCgroup('0::/') + try { + const h = detectEntityHeaders({ cgroupPath, cgroupMount: os.tmpdir(), externalEnv: undefined }) + assert.strictEqual('datadog-container-id' in h, false) + assert.match(h['datadog-entity-id'], /^in-\d+$/) + } finally { + fs.rmSync(cgroupPath, { force: true }) + } + }) + + it('emits datadog-external-env from the provided value', () => { + const h = detectEntityHeaders({ cgroupPath: '/nonexistent', cgroupMount: '/nonexistent', externalEnv: 'it-false,cn-svc,pu-x' }) + assert.strictEqual(h['datadog-external-env'], 'it-false,cn-svc,pu-x') + }) + + it('emits nothing without cgroup, mount, or external-env', () => { + const h = detectEntityHeaders({ cgroupPath: '/nonexistent', cgroupMount: '/nonexistent', externalEnv: undefined }) + assert.deepStrictEqual(h, {}) + }) + + it('rejects an external-env containing CR/LF (header-injection guard)', () => { + const h = detectEntityHeaders({ + cgroupPath: '/nonexistent', + cgroupMount: '/nonexistent', + externalEnv: 'ok\r\nx-evil: 1', + }) + assert.strictEqual('datadog-external-env' in h, false) + }) + }) + + describe('applyEntityHeaders (head rewrite)', () => { + const entity = { + 'datadog-container-id': DOCKER_ID, + 'datadog-entity-id': `ci-${DOCKER_ID}`, + 'datadog-external-env': 'it-false,cn-svc,pu-x', + } + + it('appends entity headers and preserves the request line + framing headers', () => { + const head = headBytes([ + 'POST /v0.4/traces HTTP/1.1', + 'Host: localhost:8126', + 'Content-Length: 42', + 'datadog-meta-lang: nodejs', + ]) + const out = applyEntityHeaders(head, entity).toString('latin1') + const lines = out.split('\r\n') + assert.strictEqual(lines[0], 'POST /v0.4/traces HTTP/1.1') + assert.ok(lines.includes('Host: localhost:8126')) + assert.ok(lines.includes('Content-Length: 42')) + assert.ok(lines.includes('datadog-meta-lang: nodejs')) + assert.ok(lines.includes(`datadog-container-id: ${DOCKER_ID}`)) + assert.ok(lines.includes(`datadog-entity-id: ci-${DOCKER_ID}`)) + assert.ok(lines.includes('datadog-external-env: it-false,cn-svc,pu-x')) + assert.ok(out.endsWith('\r\n\r\n')) + }) + + it('replaces libdatadog\'s empty datadog-container-id instead of duplicating it', () => { + const head = headBytes([ + 'POST /v0.4/traces HTTP/1.1', + 'Host: localhost', + 'Content-Length: 0', + 'datadog-container-id: ', + ]) + const out = applyEntityHeaders(head, entity).toString('latin1') + const count = out.split('\r\n').filter(l => l.toLowerCase().startsWith('datadog-container-id:')).length + assert.strictEqual(count, 1) + assert.ok(out.includes(`datadog-container-id: ${DOCKER_ID}`)) + }) + + it('returns the head unchanged when no entity headers are detected', () => { + const head = headBytes(['POST / HTTP/1.1', 'Host: x', 'Content-Length: 0']) + const out = applyEntityHeaders(head, {}) + assert.deepStrictEqual(out, Buffer.from(head)) + }) + + it('leaves a malformed head (no terminator) untouched', () => { + const bad = Buffer.from('POST / HTTP/1.1\r\nHost: x', 'latin1') + const out = applyEntityHeaders(bad, entity) + assert.deepStrictEqual(out, Buffer.from(bad)) + }) + }) + + describe('httpRequest end-to-end (real transport)', () => { + let server + let port + let received + const prevExternalEnv = process.env.DD_EXTERNAL_ENV + + before(async () => { + // Set the env then clear the memoized detection so this request re-reads + // it (earlier tests may have already populated the cache). + process.env.DD_EXTERNAL_ENV = 'it-false,cn-e2e,pu-1' + transport._resetEntityHeadersCache() + server = http.createServer((req, res) => { + received = req.headers + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + port = server.address().port + }) + + after(() => new Promise(resolve => server.close(() => { + if (prevExternalEnv === undefined) delete process.env.DD_EXTERNAL_ENV + else process.env.DD_EXTERNAL_ENV = prevExternalEnv + transport._resetEntityHeadersCache() + resolve() + }))) + + it('sends the detected entity headers on the wire (via the Rust-rendered head)', async () => { + const body = Buffer.from('[]', 'latin1') + const head = Buffer.from( + `POST /v0.4/traces HTTP/1.1\r\nHost: 127.0.0.1:${port}\r\nContent-Length: ${body.length}\r\n` + + 'datadog-meta-lang: nodejs\r\ndatadog-container-id: \r\n\r\n', + 'latin1', + ) + const mem = new ArrayBuffer(head.length + body.length) + const view = new Uint8Array(mem) + view.set(head, 0) + view.set(body, head.length) + + const [status] = await transport.httpRequest( + '127.0.0.1', port, false, '', 0, head.length, head.length, body.length, { buffer: mem }, + ) + assert.strictEqual(status, 200) + assert.strictEqual(received['datadog-meta-lang'], 'nodejs') + assert.strictEqual(received['datadog-external-env'], 'it-false,cn-e2e,pu-1') + const detected = detectEntityHeaders() + if (detected['datadog-container-id']) { + assert.strictEqual(received['datadog-container-id'], detected['datadog-container-id']) + } + }) + }) +}) From fefe1362b1289600a62237c8f87941410642802e Mon Sep 17 00:00:00 2001 From: Bryan English Date: Fri, 10 Jul 2026 10:15:23 -0400 Subject: [PATCH 60/68] fix(native-spans): span-meta language, lazy transport requires, v0.6/stats slash, IPv6 host Four native-spans compatibility fixes for the dd-trace-js native (WASM) pipeline: - Stamp span-meta language as javascript (not the nodejs tracer lang), matching the JS pipeline and system-tests test_meta_language_tag. - Lazy-require node:http/node:https/node:fs in the transport so loading it during dd-trace-js init doesn't instrument builtins for a user ESM app under --require. - Trim the trailing slash from the /v0.6/stats URL (was //v0.6/stats, which the agent/stats tooling missed), fixing client-stats delivery. - Strip IPv6 brackets from the transport connect host ([::1] -> ::1) so traces reach an IPv6 agent. --- crates/capabilities/src/http_transport.js | 21 ++++++- crates/pipeline/src/lib.rs | 7 ++- crates/pipeline/src/stats.rs | 11 +++- test/http_transport.js | 70 +++++++++++++++++++++++ test/pipeline.js | 6 ++ 5 files changed, 110 insertions(+), 5 deletions(-) diff --git a/crates/capabilities/src/http_transport.js b/crates/capabilities/src/http_transport.js index acd1c5c0..45c6fe72 100644 --- a/crates/capabilities/src/http_transport.js +++ b/crates/capabilities/src/http_transport.js @@ -1,6 +1,11 @@ -const http = require('node:http') -const https = require('node:https') -const fs = require('node:fs') +// NOTE: `node:http`, `node:https` and `node:fs` are deliberately NOT required at +// module load. This transport is loaded during the tracer's own init (before +// user code runs), and requiring an instrumented builtin here makes dd-trace +// wrap it in place immediately — so a user app that imports `http` afterwards +// (e.g. an ESM app under `--require`) sees the wrapped builtin and gets +// instrumented when it should not (breaks the init/guardrail expectations). The +// JS agent exporter requires these lazily (at first send) for the same reason; +// mirror that by requiring them inside the functions that use them below. let storage = f => f() @@ -28,6 +33,7 @@ const entityReg = new RegExp(String.raw`.*(${uuidSource}|${containerSource}|${ta // Detect the entity headers. Parameterized for unit testing; production callers // use the cached `getEntityHeaders()` with the real cgroup paths / environment. function detectEntityHeaders (opts = {}) { + const fs = require('node:fs') const cgroupPath = opts.cgroupPath ?? '/proc/self/cgroup' const cgroupMount = opts.cgroupMount ?? '/sys/fs/cgroup' const externalEnv = 'externalEnv' in opts ? opts.externalEnv : process.env.DD_EXTERNAL_ENV @@ -147,6 +153,15 @@ module.exports.httpRequest = function (host, port, isHttps, socketPath, head_ptr // A non-empty socketPath routes over a Unix domain socket (or Windows named // pipe) instead of TCP. Sockets are always plaintext HTTP/1.1, so https is // ignored in that mode. + const http = require('node:http') + const https = require('node:https') + // libdatadog derives `host` from the agent URI, which keeps the brackets for + // an IPv6 literal (e.g. `[::1]`). Node's `http.request` treats the `host` + // option as a hostname to resolve, so `[::1]` fails with ENOTFOUND. Strip the + // brackets so the IPv6 address is used directly (Node accepts `::1`). + if (typeof host === 'string' && host.length > 1 && host[0] === '[' && host.at(-1) === ']') { + host = host.slice(1, -1) + } const useSocket = typeof socketPath === 'string' && socketPath.length > 0 const transport = useSocket ? http : (isHttps ? https : http) diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs index 54b03e82..181589af 100644 --- a/crates/pipeline/src/lib.rs +++ b/crates/pipeline/src/lib.rs @@ -280,7 +280,12 @@ impl WasmSpanState { let change_buffer_state = ChangeBufferState::new( change_buffer, tracer_service.into(), - lang.into(), + // The change buffer stamps this onto every span's `language` meta tag. + // For the Node.js tracer that must be "javascript" (matching the JS + // pipeline's span_format), NOT the `Datadog-Meta-Lang: nodejs` header + // value (`lang`) that identifies the tracer library to the agent. The + // two legitimately differ for Node, so we can't reuse `lang` here. + "javascript".into(), pid, ); diff --git a/crates/pipeline/src/stats.rs b/crates/pipeline/src/stats.rs index 24580bb8..58c7e688 100644 --- a/crates/pipeline/src/stats.rs +++ b/crates/pipeline/src/stats.rs @@ -96,7 +96,16 @@ impl StatsCollector { let body = rmp_serde::encode::to_vec_named(&payload) .map_err(|e| format!("stats msgpack encode error: {e}"))?; - let stats_url = format!("{}{}", self.agent_url, STATS_ENDPOINT_PATH); + // `agent_url` typically ends in `/` (Node's `URL.toString()` normalizes a + // bare authority that way), so a naive concat yields `//v0.6/stats`. The + // agent records the raw request path, so the double slash makes the + // test-agent (and stats tooling) miss the request entirely. Trim the + // trailing slash so the path is exactly `/v0.6/stats`. + let stats_url = format!( + "{}{}", + self.agent_url.trim_end_matches('/'), + STATS_ENDPOINT_PATH + ); let uri: http::Uri = stats_url .parse() .map_err(|e| format!("invalid stats URL: {e}"))?; diff --git a/test/http_transport.js b/test/http_transport.js index 057f5f05..5a97a58a 100644 --- a/test/http_transport.js +++ b/test/http_transport.js @@ -130,6 +130,76 @@ describe('http_transport response header observer', () => { }) }) +// libdatadog derives the request host from the agent URI, which keeps the +// brackets for an IPv6 literal (`[::1]`). Node's http.request treats `host` as a +// name to resolve, so `[::1]` fails with ENOTFOUND; the transport must strip the +// brackets. Verified by connecting to an IPv6 loopback server with a bracketed +// host. Skipped where IPv6 loopback isn't available. +describe('http_transport IPv6 host', () => { + let server + let port + let ipv6Available = true + + before(async () => { + server = http.createServer((req, res) => { + req.on('data', () => {}) + req.on('end', () => res.end(RESPONSE_BODY)) + }) + try { + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(0, '::1', resolve) + }) + port = server.address().port + } catch { + ipv6Available = false + } + }) + + after(() => new Promise(resolve => (server ? server.close(resolve) : resolve()))) + + it('strips brackets from an IPv6 host so http.request can connect', async function () { + if (!ipv6Available) return this.skip?.() + const head = Buffer.from( + `POST /v0.4/traces HTTP/1.1\r\nHost: [::1]:${port}\r\n` + + 'Content-Length: 0\r\nConnection: close\r\n\r\n', + 'utf8', + ) + // Bracketed IPv6 host, exactly as libdatadog passes it from the agent URI. + const [status] = await transport.httpRequest('[::1]', port, false, '', 0, head.length, 0, 0, fakeWasmMemory(head)) + assert.strictEqual(status, 200) + }) +}) + +// The transport must NOT require instrumentable builtins (node:http/https/fs) at +// module load: it is loaded during the tracer's own init, before user code, so +// an eager require makes dd-trace wrap the builtin in place and leaks +// instrumentation into a user app that imports it afterwards (breaks the +// dd-trace-js init/guardrail expectations). They must be required lazily, inside +// the functions that use them. +describe('http_transport lazy builtin requires', () => { + it('does not require node:http/https/fs at module load', () => { + const Module = require('node:module') + const modPath = require.resolve('../crates/capabilities/src/http_transport') + const orig = Module.prototype.require + const seen = [] + Module.prototype.require = function (id) { + seen.push(id) + return Reflect.apply(orig, this, arguments) + } + try { + delete require.cache[modPath] + require(modPath) + } finally { + Module.prototype.require = orig + delete require.cache[modPath] + } + for (const builtin of ['node:http', 'node:https', 'node:fs', 'http', 'https', 'fs']) { + assert.ok(!seen.includes(builtin), `${builtin} must not be required at module load`) + } + }) +}) + // Unix-domain-socket transport: a non-empty socketPath must route the request // over the socket instead of TCP. Skipped on Windows (no AF_UNIX path here). describe('http_transport unix socket', { skip: process.platform === 'win32' }, () => { diff --git a/test/pipeline.js b/test/pipeline.js index cad84e84..2c773892 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -814,6 +814,12 @@ describe('pipeline', { skip }, () => { assert(result, 'exporter returned an agent response') assert(payloads.length > 0, 'agent received a trace payload') assert(payloads[0].length > 0, 'trace payload is non-empty') + // process_span stamps the `language` meta at flush. For the Node tracer + // it must be "javascript" (matching the JS pipeline), NOT the `nodejs` + // header/tracer-lang. The v0.4 span payload has no other nodejs/javascript + // string, so a byte check unambiguously distinguishes the two. + assert(payloads[0].includes(Buffer.from('javascript')), 'span meta carries language=javascript') + assert(!payloads[0].includes(Buffer.from('nodejs')), 'span meta must not carry language=nodejs') } finally { server.closeAllConnections?.() server.close() From 0e969928e14f244faecc5ae740beafb59c2cfdcd Mon Sep 17 00:00:00 2001 From: Bryan English Date: Fri, 10 Jul 2026 17:07:03 -0400 Subject: [PATCH 61/68] fix(native-spans): Bun-compatible transport head + UDS client stats Two native-spans fixes for the dd-trace-js native pipeline: - Transport: parse the Rust-rendered HTTP/1.1 request head into {method, path, headers} for http.request() instead of injecting it via the Node-internal req._header, which Bun's node:http ignores (trace requests went out as POST / and were dropped). Verified on both Node and Bun. - Client stats: build the /v0.6/stats URI via libdd_common::parse_uri (like the trace exporter) so a unix:// agent URL's socket path is hex-encoded into the URI authority and the request routes over the socket, instead of never reaching a UDS agent. --- Cargo.lock | 1 + crates/capabilities/src/http.rs | 6 ++- crates/capabilities/src/http_transport.js | 42 +++++++++++++---- crates/pipeline/Cargo.toml | 1 + crates/pipeline/src/stats.rs | 34 ++++++++------ test/pipeline.js | 57 +++++++++++++++++++++++ 6 files changed, 117 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9b0f46f6..f2eeb0b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1721,6 +1721,7 @@ dependencies = [ "js-sys", "libdatadog-nodejs-capabilities", "libdd-capabilities", + "libdd-common", "libdd-data-pipeline", "libdd-shared-runtime", "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", diff --git a/crates/capabilities/src/http.rs b/crates/capabilities/src/http.rs index 9f3abb5a..4248cb30 100644 --- a/crates/capabilities/src/http.rs +++ b/crates/capabilities/src/http.rs @@ -193,8 +193,10 @@ fn hex_decode(s: &str) -> Option> { /// Serialize the full HTTP/1.1 request head (request line + Host + Content-Length /// + user headers + terminating CRLF) into a contiguous byte buffer. /// -/// The buffer is handed to JS by pointer; JS assigns it to -/// `req._header`, bypassing Node's `_storeHeader` serialization. +/// The buffer is handed to JS by pointer; JS parses it (`parseRequestHead` in +/// http_transport.js) into method/path/headers for `http.request(...)`. (It used +/// to be assigned to the Node internal `req._header`, but Bun's node:http +/// ignores that, so the head is parsed into request options instead.) /// /// `is_socket` requests (unix socket / named pipe) omit the `:port` suffix on /// the Host header — there is no TCP port for a socket transport. diff --git a/crates/capabilities/src/http_transport.js b/crates/capabilities/src/http_transport.js index 45c6fe72..962b6ba4 100644 --- a/crates/capabilities/src/http_transport.js +++ b/crates/capabilities/src/http_transport.js @@ -107,6 +107,28 @@ function applyEntityHeaders (headView, entity = getEntityHeaders()) { return Buffer.from(`${kept.join('\r\n')}\r\n\r\n`, 'latin1') } +// Parse the Rust-rendered (+ entity-merged) HTTP/1.1 request head into Node +// request options `{ method, path, headers }`. We pass these to +// `http.request(...)` rather than injecting the raw head via the Node-internal +// `req._header`: that internal is undocumented and Bun's `node:http` ignores it, +// so under Bun the request went out as `POST /` with no headers and the agent +// dropped it. Header names/values are ASCII (latin1 round-trips losslessly). +function parseRequestHead (headBuf) { + const head = Buffer.from(headBuf).toString('latin1') + const term = head.indexOf('\r\n\r\n') + const lines = (term === -1 ? head : head.slice(0, term)).split('\r\n') + // Request line: `METHOD request-target HTTP/1.1` (no spaces in the target). + const [method, path] = lines[0].split(' ') + const headers = {} + for (let i = 1; i < lines.length; i++) { + const colon = lines[i].indexOf(':') + if (colon === -1) continue + const name = lines[i].slice(0, colon).trim() + if (name) headers[name] = lines[i].slice(colon + 1).trim() + } + return { method, path, headers } +} + // A retried write can race a wasm-memory detach; treat that as a transient error. function isDetachedBufferError (err) { return err instanceof TypeError && /detached/i.test(err.message) @@ -173,11 +195,15 @@ module.exports.httpRequest = function (host, port, isHttps, socketPath, head_ptr const headView = new Uint8Array(wasm_memory.buffer, head_ptr, head_len) const bodyView = new Uint8Array(wasm_memory.buffer, body_ptr, body_len) - // host/port (or socketPath) drive connection selection; method/path/ - // headers are placeholders because we replace the rendered head below. + // The Rust side already rendered the full HTTP/1.1 request head (real + // method, `/v0.4/traces` path, Content-Type/Length, datadog-meta-*); + // applyEntityHeaders merges in the detected entity headers. Parse it into + // request options so the connection uses the correct method/path/headers + // on both Node and Bun (host/port or socketPath drive the connection). + const { method, path, headers } = parseRequestHead(applyEntityHeaders(headView)) const requestOptions = useSocket - ? { socketPath, method: 'POST', path: '/' } - : { host, port, method: 'POST', path: '/' } + ? { socketPath, method, path, headers } + : { host, port, method, path, headers } const req = transport.request(requestOptions, (res) => { const chunks = [] res.on('data', chunk => chunks.push(chunk)) @@ -207,12 +233,10 @@ module.exports.httpRequest = function (host, port, isHttps, socketPath, head_ptr }) req.on('error', reject) - // Bypass Node's headers: the Rust side has already produced the full - // request head in HTTP/1.1 wire format. Setting _header before write() - // makes write/end skip _implicitHeader and _send prepends our bytes. - + // The request head (method/path/headers) was supplied via requestOptions + // above; just write the body. (No `req._header` injection — that Node + // internal is not honored by Bun.) try { - req._header = applyEntityHeaders(headView) req.write(bodyView) req.end() } catch (error) { diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml index 166815e4..7501ad62 100644 --- a/crates/pipeline/Cargo.toml +++ b/crates/pipeline/Cargo.toml @@ -15,6 +15,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1" libdatadog-nodejs-capabilities = { path = "../capabilities" } libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0" } +libdd-common = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false, features = ["change-buffer"] } libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } diff --git a/crates/pipeline/src/stats.rs b/crates/pipeline/src/stats.rs index 58c7e688..31410369 100644 --- a/crates/pipeline/src/stats.rs +++ b/crates/pipeline/src/stats.rs @@ -18,6 +18,7 @@ fn now() -> SystemTime { use bytes::Bytes; use libdd_capabilities::http::HttpClientCapability; +use libdd_common::parse_uri; use libdd_trace_protobuf::pb; use libdd_trace_stats::span_concentrator::SpanConcentrator; use libdatadog_nodejs_capabilities::WasmHttpClient; @@ -96,19 +97,26 @@ impl StatsCollector { let body = rmp_serde::encode::to_vec_named(&payload) .map_err(|e| format!("stats msgpack encode error: {e}"))?; - // `agent_url` typically ends in `/` (Node's `URL.toString()` normalizes a - // bare authority that way), so a naive concat yields `//v0.6/stats`. The - // agent records the raw request path, so the double slash makes the - // test-agent (and stats tooling) miss the request entirely. Trim the - // trailing slash so the path is exactly `/v0.6/stats`. - let stats_url = format!( - "{}{}", - self.agent_url.trim_end_matches('/'), - STATS_ENDPOINT_PATH - ); - let uri: http::Uri = stats_url - .parse() - .map_err(|e| format!("invalid stats URL: {e}"))?; + // Build the base agent URI exactly like the trace exporter does, via + // libdatadog's `parse_uri`. For a `unix://` / `windows:` agent URL that + // hex-encodes the socket path into the URI *authority* (there is no + // standard URL form for socket paths), which the WASM HTTP client's + // `decode_socket_path` reverses to route over the socket. A raw parse + // instead leaves the socket path in the URI *path* with an empty/invalid + // authority, so the stats request never reaches the socket — client stats + // silently never arrive over UDS (dd-trace-js #9139, uds-express4). + let base = parse_uri(&self.agent_url).map_err(|e| format!("invalid agent URL: {e}"))?; + // Append `/v0.6/stats` to the base path while preserving the (hex) + // authority, mirroring libdd-data-pipeline's `add_path`. For `unix://` + // the base path is "/" and the authority holds the hex socket path; for + // TCP it's `http://host:port/`. Trim a trailing slash so the path is + // exactly `/v0.6/stats` (a double slash makes the agent miss the request). + let base_path = base.path().strip_suffix('/').unwrap_or_else(|| base.path()); + let new_path_and_query = format!("{base_path}{STATS_ENDPOINT_PATH}"); + let mut parts = base.into_parts(); + parts.path_and_query = + Some(new_path_and_query.parse().map_err(|e| format!("invalid stats path: {e}"))?); + let uri = http::Uri::from_parts(parts).map_err(|e| format!("invalid stats URL: {e}"))?; let req = http::Request::builder() .method(http::Method::PUT) diff --git a/test/pipeline.js b/test/pipeline.js index 2c773892..18ececac 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -1125,6 +1125,63 @@ describe('pipeline', { skip }, () => { const ns = new NativeSpansInterface({ statsEnabled: false }) assert.strictEqual(await ns.state.flushStats(true), false) }) + + it('flushes stats to /v0.6/stats over a Unix domain socket', { skip: process.platform === 'win32' }, async () => { + // A `unix://` agent URL must route /v0.6/stats over the socket, like + // traces do. parse_uri hex-encodes the socket path into the URI authority + // (which the transport's decode_socket_path reverses); a raw parse would + // leave the path in the URI path and never reach the socket. + const http = require('node:http') + const os = require('node:os') + const fs = require('node:fs') + const nodePath = require('node:path') + // Keep the path short — AF_UNIX paths are capped (~104 bytes on macOS). + const sockPath = nodePath.join(os.tmpdir(), `dd-st-${process.pid}.sock`) + try { + fs.unlinkSync(sockPath) + } catch { + // not present + } + const seen = [] + const server = http.createServer((req, res) => { + const chunks = [] + req.on('data', c => chunks.push(c)) + req.on('end', () => { + seen.push({ method: req.method, url: req.url, len: Buffer.concat(chunks).length }) + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise((resolve, reject) => { + server.once('error', reject) + server.listen(sockPath, resolve) + }) + + const ns = new NativeSpansInterface({ agentUrl: `unix://${sockPath}`, statsEnabled: true }) + const span = ns.createSpan() + span.name = 'stats-span' + span.service = 'stats-svc' + span.resource = '/stats' + span.type = 'web' + span.duration = 5_000_000n + + try { + await ns.flushSpans(span) + const sent = await ns.state.flushStats(true) + assert.strictEqual(sent, true, 'flushStats reported a send over the socket') + const statsReq = seen.find(r => r.url === '/v0.6/stats') + assert.ok(statsReq, 'agent received a /v0.6/stats request over the socket') + assert.ok(statsReq.len > 0, 'stats payload is non-empty') + } finally { + server.closeAllConnections?.() + server.close() + try { + fs.unlinkSync(sockPath) + } catch { + // already gone + } + } + }) }) describe('send re-entrancy', () => { From d99947f6c5ea698d2a5996d3a61c62b13ba5eef7 Mon Sep 17 00:00:00 2001 From: Bryan English Date: Wed, 15 Jul 2026 14:57:40 -0400 Subject: [PATCH 62/68] fix(pipeline): set OTLP instrumentation scope (#173) * fix(pipeline): set OTLP instrumentation scope * fix(pipeline): consume ported libdatadog scope patch Update the temporary libdatadog dependency to the PR head ported onto main. Current libdatadog also changed the stats concentrator API, so adapt the WASM stats wrapper to pass the new cardinality limit argument and encode unobfuscated buckets from FlushResult. * fix(pipeline): return collapsed stats count from flushStats * test(pipeline): widen stats overflow regression --- Cargo.lock | 201 ++++++++++++++++++++++++--------- crates/capabilities/Cargo.toml | 4 +- crates/pipeline/Cargo.toml | 16 +-- crates/pipeline/src/lib.rs | 142 +++++++++++++++-------- crates/pipeline/src/stats.rs | 60 +++++++--- test/pipeline.js | 75 ++++++++++-- 6 files changed, 368 insertions(+), 130 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f2eeb0b1..22d82132 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,9 +34,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" [[package]] name = "arc-swap" @@ -897,7 +897,7 @@ dependencies = [ "futures-core", "http", "js-sys", - "libdd-capabilities", + "libdd-capabilities 2.1.0", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test", @@ -914,6 +914,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "libdd-capabilities" +version = "2.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +dependencies = [ + "anyhow", + "bytes", + "http", + "thiserror", +] + [[package]] name = "libdd-capabilities-impl" version = "2.0.0" @@ -922,8 +933,21 @@ dependencies = [ "bytes", "http", "http-body-util", - "libdd-capabilities", - "libdd-common", + "libdd-capabilities 2.0.0", + "libdd-common 5.0.0", + "tokio", +] + +[[package]] +name = "libdd-capabilities-impl" +version = "3.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +dependencies = [ + "bytes", + "http", + "http-body-util", + "libdd-capabilities 2.1.0", + "libdd-common 5.1.0", "tokio", ] @@ -962,6 +986,36 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "libdd-common" +version = "5.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +dependencies = [ + "anyhow", + "bytes", + "cc", + "const_format", + "futures", + "futures-core", + "futures-util", + "hex", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "libc", + "nix 0.29.0", + "pin-project", + "regex", + "serde", + "static_assertions", + "thiserror", + "tokio", + "tower-service", + "windows-sys 0.52.0", +] + [[package]] name = "libdd-crashtracker" version = "1.0.0" @@ -974,7 +1028,7 @@ dependencies = [ "errno", "http", "libc", - "libdd-common", + "libdd-common 5.0.0", "libdd-libunwind-sys", "libdd-telemetry", "nix 0.29.0", @@ -997,8 +1051,8 @@ dependencies = [ [[package]] name = "libdd-data-pipeline" -version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +version = "7.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" dependencies = [ "anyhow", "arc-swap", @@ -1008,15 +1062,15 @@ dependencies = [ "getrandom 0.2.17", "http", "http-body-util", - "libdd-capabilities", - "libdd-capabilities-impl", - "libdd-common", - "libdd-ddsketch", + "libdd-capabilities 2.1.0", + "libdd-capabilities-impl 3.0.0", + "libdd-common 5.1.0", + "libdd-ddsketch 1.1.0", "libdd-dogstatsd-client", - "libdd-shared-runtime", + "libdd-shared-runtime 2.0.0", "libdd-tinybytes", "libdd-trace-normalization", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-protobuf 4.0.0", "libdd-trace-stats", "libdd-trace-utils", "rmp-serde", @@ -1037,15 +1091,23 @@ dependencies = [ "prost", ] +[[package]] +name = "libdd-ddsketch" +version = "1.1.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +dependencies = [ + "prost", +] + [[package]] name = "libdd-dogstatsd-client" -version = "3.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +version = "4.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" dependencies = [ "anyhow", "cadence", "http", - "libdd-common", + "libdd-common 5.1.0", "serde", "tracing", ] @@ -1071,7 +1133,7 @@ source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bd dependencies = [ "anyhow", "libc", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25)", + "libdd-trace-protobuf 3.0.2", "memfd", "prost", "rand", @@ -1100,9 +1162,26 @@ dependencies = [ "async-trait", "futures", "futures-util", - "libdd-capabilities", - "libdd-capabilities-impl", - "libdd-common", + "libdd-capabilities 2.0.0", + "libdd-capabilities-impl 2.0.0", + "libdd-common 5.0.0", + "tokio", + "tokio-util", + "tracing", + "wasm-bindgen-futures", +] + +[[package]] +name = "libdd-shared-runtime" +version = "2.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +dependencies = [ + "async-trait", + "futures", + "futures-util", + "libdd-capabilities 2.1.0", + "libdd-capabilities-impl 3.0.0", + "libdd-common 5.1.0", "tokio", "tokio-util", "tracing", @@ -1123,9 +1202,9 @@ dependencies = [ "http", "http-body-util", "libc", - "libdd-common", - "libdd-ddsketch", - "libdd-shared-runtime", + "libdd-common 5.0.0", + "libdd-ddsketch 1.0.1", + "libdd-shared-runtime 1.0.0", "serde", "serde_json", "sys-info", @@ -1139,29 +1218,29 @@ dependencies = [ [[package]] name = "libdd-tinybytes" version = "1.1.1" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" dependencies = [ "serde", ] [[package]] name = "libdd-trace-normalization" -version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +version = "3.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" dependencies = [ "anyhow", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-protobuf 4.0.0", ] [[package]] name = "libdd-trace-obfuscation" -version = "4.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +version = "5.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" dependencies = [ "anyhow", "fluent-uri", - "libdd-common", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-common 5.1.0", + "libdd-trace-protobuf 4.0.0", "libdd-trace-utils", "log", "percent-encoding", @@ -1172,7 +1251,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" version = "3.0.2" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25#7cdeb7896e92d1ba38bde495934e112dac2eda25" dependencies = [ "prost", "serde", @@ -1181,8 +1260,8 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" -version = "3.0.2" -source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25#7cdeb7896e92d1ba38bde495934e112dac2eda25" +version = "4.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" dependencies = [ "prost", "serde", @@ -1191,21 +1270,23 @@ dependencies = [ [[package]] name = "libdd-trace-stats" -version = "5.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +version = "6.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" dependencies = [ "anyhow", "arc-swap", "async-trait", + "futures", "hashbrown 0.15.5", "http", - "libdd-capabilities", - "libdd-capabilities-impl", - "libdd-common", - "libdd-ddsketch", - "libdd-shared-runtime", + "libdd-capabilities 2.1.0", + "libdd-capabilities-impl 3.0.0", + "libdd-common 5.1.0", + "libdd-ddsketch 1.1.0", + "libdd-dogstatsd-client", + "libdd-shared-runtime 2.0.0", "libdd-trace-obfuscation", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-protobuf 4.0.0", "libdd-trace-utils", "rmp-serde", "serde", @@ -1216,8 +1297,8 @@ dependencies = [ [[package]] name = "libdd-trace-utils" -version = "8.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0#86b7f5700d3db4e58076794b5e8073a40d780083" +version = "9.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" dependencies = [ "anyhow", "base64", @@ -1229,12 +1310,12 @@ dependencies = [ "http-body", "http-body-util", "indexmap", - "libdd-capabilities", - "libdd-capabilities-impl", - "libdd-common", + "libdd-capabilities 2.1.0", + "libdd-capabilities-impl 3.0.0", + "libdd-common 5.1.0", "libdd-tinybytes", "libdd-trace-normalization", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-trace-protobuf 4.0.0", "prost", "rand", "rmp", @@ -1242,6 +1323,7 @@ dependencies = [ "rmpv", "rustc-hash", "serde", + "serde-transcode", "serde_json", "thin-vec", "tokio", @@ -1720,11 +1802,11 @@ dependencies = [ "http", "js-sys", "libdatadog-nodejs-capabilities", - "libdd-capabilities", - "libdd-common", + "libdd-capabilities 2.1.0", + "libdd-common 5.1.0", "libdd-data-pipeline", - "libdd-shared-runtime", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?tag=v37.0.0)", + "libdd-shared-runtime 2.0.0", + "libdd-trace-protobuf 4.0.0", "libdd-trace-stats", "libdd-trace-utils", "rmp-serde", @@ -1785,7 +1867,7 @@ version = "0.1.0" dependencies = [ "anyhow", "libdd-library-config 2.0.0", - "libdd-trace-protobuf 3.0.2 (git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25)", + "libdd-trace-protobuf 3.0.2", "napi", "napi-derive", ] @@ -2034,7 +2116,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -2148,6 +2230,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-transcode" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "590c0e25c2a5bb6e85bf5c1bce768ceb86b316e7a01bdf07d2cb4ec2271990e2" +dependencies = [ + "serde", +] + [[package]] name = "serde-wasm-bindgen" version = "0.4.5" diff --git a/crates/capabilities/Cargo.toml b/crates/capabilities/Cargo.toml index 888f5666..cbb376e6 100644 --- a/crates/capabilities/Cargo.toml +++ b/crates/capabilities/Cargo.toml @@ -15,7 +15,9 @@ http = "1" bytes = "1.4" futures-core = "0.3" anyhow = "1" -libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0" } +# TODO: Replace this temporary libdatadog PR rev with the official release/tag +# that contains DataDog/libdatadog#2235, then regenerate Cargo.lock. +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af" } [dev-dependencies] wasm-bindgen-test = "0.3" diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml index 7501ad62..f8e318a3 100644 --- a/crates/pipeline/Cargo.toml +++ b/crates/pipeline/Cargo.toml @@ -14,13 +14,15 @@ js-sys = "0.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1" libdatadog-nodejs-capabilities = { path = "../capabilities" } -libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0" } -libdd-common = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } -libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false, features = ["change-buffer"] } -libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } -libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } -libdd-shared-runtime = { git = "https://github.com/DataDog/libdatadog.git", tag = "v37.0.0", default-features = false } +# TODO: Replace these temporary libdatadog PR revs with the official release/tag +# that contains DataDog/libdatadog#2235, then regenerate Cargo.lock. +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af" } +libdd-common = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } +libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false, features = ["change-buffer"] } +libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } +libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } +libdd-shared-runtime = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } rmp-serde = "1" bytes = "1" http = "1" diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs index 181589af..31188af5 100644 --- a/crates/pipeline/src/lib.rs +++ b/crates/pipeline/src/lib.rs @@ -96,14 +96,16 @@ fn se_read_scalar( 1 => Ok(AttributeArrayValue::Boolean(se_read_u8(buf, idx)? != 0)), 2 => { se_need(buf, *idx, 8)?; - let n = get_num(buf, idx) - .ok_or_else(|| JsValue::from_str("addSpanEvent: truncated span-event attribute buffer"))?; + let n = get_num(buf, idx).ok_or_else(|| { + JsValue::from_str("addSpanEvent: truncated span-event attribute buffer") + })?; Ok(AttributeArrayValue::Integer(n)) } 3 => { se_need(buf, *idx, 8)?; - let n = get_num(buf, idx) - .ok_or_else(|| JsValue::from_str("addSpanEvent: truncated span-event attribute buffer"))?; + let n = get_num(buf, idx).ok_or_else(|| { + JsValue::from_str("addSpanEvent: truncated span-event attribute buffer") + })?; Ok(AttributeArrayValue::Double(n)) } _ => Err(JsValue::from_str( @@ -218,6 +220,21 @@ impl Drop for InFlightGuard<'_> { } } +fn stats_flush_result(sent: bool, collapsed_spans: u64) -> Result { + let result = js_sys::Object::new(); + js_sys::Reflect::set( + &result, + &JsValue::from_str("sent"), + &JsValue::from_bool(sent), + )?; + js_sys::Reflect::set( + &result, + &JsValue::from_str("collapsedSpans"), + &JsValue::from_f64(collapsed_spans as f64), + )?; + Ok(result.into()) +} + #[wasm_bindgen] impl WasmSpanState { #[wasm_bindgen(constructor)] @@ -245,6 +262,7 @@ impl WasmSpanState { .set_language(lang) .set_language_version(lang_version) .set_language_interpreter(lang_interpreter) + .set_otlp_instrumentation_scope("dd-trace-js", tracer_version) // Populate the payload-level TracerMetadata (service/env/hostname/ // app_version) the agent receives. These values are already passed // in for the stats collector; without these calls the trace @@ -417,7 +435,8 @@ impl WasmSpanState { return Ok(false); } - self.cbs.borrow_mut() + self.cbs + .borrow_mut() .flush_change_buffer() .map_err(|e| JsValue::from_str(&e.to_string()))?; @@ -432,7 +451,8 @@ impl WasmSpanState { } let spans_vec = self - .cbs.borrow_mut() + .cbs + .borrow_mut() .flush_chunk(&span_ids, first_is_local_root) .map_err(|e| JsValue::from_str(&e.to_string()))?; @@ -526,9 +546,7 @@ impl WasmSpanState { // Unreachable: the block above either set `Some` or returned early. None => return Err(build_failure_error("native exporter unavailable")), }; - let resp = exporter - .send_trace_chunks_async(chunks) - .await; + let resp = exporter.send_trace_chunks_async(chunks).await; let response_str = resp.map(|resp| match resp { AgentResponse::Unchanged => "unchanged".to_string(), AgentResponse::Changed { body } => body, @@ -542,9 +560,11 @@ impl WasmSpanState { /// Flush aggregated stats to the agent's /v0.6/stats endpoint. /// /// Should be called periodically (e.g. every 10s) from JS, and with - /// `force=true` on shutdown. + /// `force=true` on shutdown. Returns `{ sent, collapsedSpans }` so JS can + /// emit the same collapsed-span health metric as libdd-trace-stats's native + /// exporter. #[wasm_bindgen(js_name = "flushStats")] - pub async fn flush_stats(&self, force: bool) -> Result { + pub async fn flush_stats(&self, force: bool) -> Result { // Build the stats request under a brief *synchronous* borrow, then drop // the borrow BEFORE the async send. The collector therefore stays in // `stats_collector`, so a concurrent `prepareChunk` during the in-flight @@ -552,24 +572,26 @@ impl WasmSpanState { // the collector out for the whole await would silently drop them from // client-side stats.) No borrow is held across the await, so there is // no double-borrow hazard from overlapping calls. - let req = { + let prepared = { let mut guard = self.stats_collector.borrow_mut(); match guard.as_mut() { Some(collector) => collector .prepare_request(force) .map_err(|e| JsValue::from_str(&e))?, - None => return Ok(false), + None => return stats_flush_result(false, 0), } }; - match req { + let sent = match prepared.request { Some(req) => { stats::StatsCollector::send_request(req) .await .map_err(|e| JsValue::from_str(&e))?; - Ok(true) + true } - None => Ok(false), - } + None => false, + }; + + stats_flush_result(sent, prepared.collapsed_spans) } /// Flush the queued change-buffer operations. On success always returns @@ -577,7 +599,8 @@ impl WasmSpanState { /// flush methods); failures surface as a thrown error. #[wasm_bindgen(js_name = "flushChangeQueue")] pub fn flush_change_queue(&self) -> Result { - self.cbs.borrow_mut() + self.cbs + .borrow_mut() .flush_change_buffer() .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(true) @@ -605,7 +628,8 @@ impl WasmSpanState { #[wasm_bindgen(js_name = "stringTableInsertOne")] pub fn string_table_insert_one(&self, key: u32, val: &str) { - self.cbs.borrow_mut() + self.cbs + .borrow_mut() .string_table_insert_one(key, val.into()); } @@ -622,7 +646,9 @@ impl WasmSpanState { // the encoded entries must error, not index out of bounds. get_num // does the (overflow-safe) bounds check and returns None past the end. let key: u32 = get_num(buf, &mut index).ok_or_else(|| { - JsValue::from_str("stringTableInsertMany: count exceeds the entries in the input buffer") + JsValue::from_str( + "stringTableInsertMany: count exceeds the entries in the input buffer", + ) })?; let str_slice = &buf[index..]; // Bound the NUL scan to the input slice so a non-terminated string @@ -654,7 +680,9 @@ impl WasmSpanState { pub fn get_service_name(&self, span_id: u64) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(span.service.to_string()) } @@ -662,7 +690,9 @@ impl WasmSpanState { pub fn get_resource_name(&self, span_id: u64) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(span.resource.to_string()) } @@ -670,10 +700,14 @@ impl WasmSpanState { pub fn get_meta_attr(&self, span_id: u64, name: &str) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; // VecMap::get accepts &str directly (SpanString: Borrow), so no // SpanString allocation is needed for the lookup. - Ok(span.meta.get(name) + Ok(span + .meta + .get(name) .map(|v| JsValue::from_str(v.0.as_ref())) .unwrap_or(JsValue::NULL)) } @@ -682,8 +716,12 @@ impl WasmSpanState { pub fn get_metric_attr(&self, span_id: u64, name: &str) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; - Ok(span.metrics.get(name) + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; + Ok(span + .metrics + .get(name) .map(|v| JsValue::from_f64(*v)) .unwrap_or(JsValue::NULL)) } @@ -692,7 +730,9 @@ impl WasmSpanState { pub fn get_error(&self, span_id: u64) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(span.error) } @@ -703,7 +743,9 @@ impl WasmSpanState { pub fn get_start(&self, span_id: u64) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(span.start) } @@ -711,7 +753,9 @@ impl WasmSpanState { pub fn get_duration(&self, span_id: u64) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(span.duration) } @@ -719,7 +763,9 @@ impl WasmSpanState { pub fn get_type(&self, span_id: u64) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(span.r#type.to_string()) } @@ -727,7 +773,9 @@ impl WasmSpanState { pub fn get_name(&self, span_id: u64) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; Ok(span.name.to_string()) } @@ -738,12 +786,7 @@ impl WasmSpanState { // ordering is safe (subsequent ops are applied on the next flush and never // touch meta_struct). #[wasm_bindgen(js_name = "setMetaStruct")] - pub fn set_meta_struct( - &self, - span_id: u64, - key: &str, - value: &[u8], - ) -> Result<(), JsValue> { + pub fn set_meta_struct(&self, span_id: u64, key: &str, value: &[u8]) -> Result<(), JsValue> { self.flush_change_queue()?; let mut cbs = self.cbs.borrow_mut(); let span = cbs @@ -758,9 +801,13 @@ impl WasmSpanState { pub fn get_meta_struct(&self, span_id: u64, key: &str) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - let span = cbs.get_span(span_id).map_err(|e| JsValue::from_str(&e.to_string()))?; + let span = cbs + .get_span(span_id) + .map_err(|e| JsValue::from_str(&e.to_string()))?; // VecMap::get accepts &str directly (SpanString: Borrow). - Ok(span.meta_struct.get(key) + Ok(span + .meta_struct + .get(key) .map(|v| JsValue::from(js_sys::Uint8Array::from(v.0.as_slice()))) .unwrap_or(JsValue::NULL)) } @@ -816,7 +863,8 @@ impl WasmSpanState { pub fn get_trace_meta_attr(&self, segment_id: u64, name: &str) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - Ok(cbs.get_segment(&segment_id) + Ok(cbs + .get_segment(&segment_id) .and_then(|s| s.meta.get(name)) .map(|v| JsValue::from_str(v.0.as_ref())) .unwrap_or(JsValue::NULL)) @@ -826,7 +874,8 @@ impl WasmSpanState { pub fn get_trace_metric_attr(&self, segment_id: u64, name: &str) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - Ok(cbs.get_segment(&segment_id) + Ok(cbs + .get_segment(&segment_id) .and_then(|s| s.metrics.get(name)) .map(|v| JsValue::from_f64(*v)) .unwrap_or(JsValue::NULL)) @@ -836,7 +885,8 @@ impl WasmSpanState { pub fn get_trace_origin(&self, segment_id: u64) -> Result { self.flush_change_queue()?; let cbs = self.cbs.borrow(); - Ok(cbs.get_segment(&segment_id) + Ok(cbs + .get_segment(&segment_id) .and_then(|s| s.origin.as_ref()) .map(|v| JsValue::from_str(v.0.as_ref())) .unwrap_or(JsValue::NULL)) @@ -870,8 +920,12 @@ pub fn get_op_codes() -> JsValue { ("SetTraceOrigin", 12), ]; for (name, val) in entries { - js_sys::Reflect::set(&obj, &JsValue::from_str(name), &JsValue::from_f64(*val as f64)) - .expect("Reflect::set on a freshly created object cannot fail"); + js_sys::Reflect::set( + &obj, + &JsValue::from_str(name), + &JsValue::from_f64(*val as f64), + ) + .expect("Reflect::set on a freshly created object cannot fail"); } obj.into() } diff --git a/crates/pipeline/src/stats.rs b/crates/pipeline/src/stats.rs index 31410369..127a21e6 100644 --- a/crates/pipeline/src/stats.rs +++ b/crates/pipeline/src/stats.rs @@ -17,11 +17,11 @@ fn now() -> SystemTime { } use bytes::Bytes; +use libdatadog_nodejs_capabilities::WasmHttpClient; use libdd_capabilities::http::HttpClientCapability; use libdd_common::parse_uri; use libdd_trace_protobuf::pb; use libdd_trace_stats::span_concentrator::SpanConcentrator; -use libdatadog_nodejs_capabilities::WasmHttpClient; use crate::trace_data::WasmTraceData; @@ -38,6 +38,12 @@ pub struct StatsMeta { pub service: String, } +/// Stats data prepared by a synchronous concentrator flush. +pub struct PreparedStatsFlush { + pub request: Option>, + pub collapsed_spans: u64, +} + /// Manages stats aggregation and flushing. pub struct StatsCollector { concentrator: SpanConcentrator, @@ -60,6 +66,7 @@ impl StatsCollector { "consumer".to_string(), ], Vec::new(), + None, ), meta, agent_url, @@ -77,21 +84,38 @@ impl StatsCollector { } } - /// Drain aggregated stats into a ready-to-send request, **synchronously**. + /// Drain aggregated stats into a ready-to-send request plus flush metadata, + /// **synchronously**. /// - /// Returns `Ok(None)` when there is nothing to flush. The concentrator is - /// drained and the sequence advanced as part of this call, so the returned - /// request must be sent (see `send_request`). Kept synchronous and separate - /// from the send so a caller can build the request under a brief borrow and - /// release the collector *before* the async send — leaving it available for - /// `add_spans` while the stats request is in flight. - pub fn prepare_request(&mut self, force: bool) -> Result>, String> { - let buckets = self.concentrator.flush(now(), force); - if buckets.is_empty() { - return Ok(None); + /// Returns `request: None` when there is no stats payload to send. The + /// concentrator is drained and the sequence advanced as part of this call, + /// so a returned request must be sent (see `send_request`). Kept + /// synchronous and separate from the send so a caller can build the request + /// under a brief borrow and release the collector *before* the async send — + /// leaving it available for `add_spans` while the stats request is in + /// flight. + pub fn prepare_request(&mut self, force: bool) -> Result { + let mut flush = self.concentrator.flush(now(), force); + let collapsed_spans = flush.collapsed_spans; + if !flush.obfuscated_buckets.is_empty() { + // TODO: stats obfuscation is currently disabled. Obfuscated stats + // require the datadog-obfuscation-version header, which + // prepare_request doesn't emit yet. Add that header before enabling + // stats-obfuscation. + return Err( + "stats flush produced obfuscated buckets without obfuscation header support" + .to_string(), + ); + } + if flush.unobfuscated_buckets.is_empty() { + return Ok(PreparedStatsFlush { + request: None, + collapsed_spans, + }); } self.sequence += 1; + let buckets = std::mem::take(&mut flush.unobfuscated_buckets); let payload = encode_stats_payload(&buckets, &self.meta, self.sequence); let body = rmp_serde::encode::to_vec_named(&payload) @@ -114,8 +138,11 @@ impl StatsCollector { let base_path = base.path().strip_suffix('/').unwrap_or_else(|| base.path()); let new_path_and_query = format!("{base_path}{STATS_ENDPOINT_PATH}"); let mut parts = base.into_parts(); - parts.path_and_query = - Some(new_path_and_query.parse().map_err(|e| format!("invalid stats path: {e}"))?); + parts.path_and_query = Some( + new_path_and_query + .parse() + .map_err(|e| format!("invalid stats path: {e}"))?, + ); let uri = http::Uri::from_parts(parts).map_err(|e| format!("invalid stats URL: {e}"))?; let req = http::Request::builder() @@ -127,7 +154,10 @@ impl StatsCollector { .body(Bytes::from(body)) .map_err(|e| format!("failed to build stats request: {e}"))?; - Ok(Some(req)) + Ok(PreparedStatsFlush { + request: Some(req), + collapsed_spans, + }) } /// Send a prepared stats request to the agent. Does **not** borrow the diff --git a/test/pipeline.js b/test/pipeline.js index 18ececac..bc6eabf6 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -945,6 +945,7 @@ describe('pipeline', { skip }, () => { url: req.url, ct: req.headers['content-type'], len: Buffer.concat(chunks).length, + body: Buffer.concat(chunks).toString(), }) res.writeHead(200, { 'content-type': 'application/json' }) res.end('{}') @@ -952,7 +953,10 @@ describe('pipeline', { skip }, () => { }) await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) const { port } = server.address() - const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}` }) + const ns = new NativeSpansInterface({ + agentUrl: `http://127.0.0.1:${port}`, + tracerVersion: '7.0.0-pre', + }) ns.state.setOtlpEndpoint(`http://127.0.0.1:${port}/v1/traces`) const span = ns.createSpan() span.name = 'otlp-span' @@ -968,6 +972,9 @@ describe('pipeline', { skip }, () => { // No setOtlpProtocol call — pins the default wire protocol (http/json). assert.match(req.ct || '', /json/) assert.ok(req.len > 0, 'OTLP body is non-empty') + const body = JSON.parse(req.body) + assert.strictEqual(body.resourceSpans[0].scopeSpans[0].scope.name, 'dd-trace-js') + assert.strictEqual(body.resourceSpans[0].scopeSpans[0].scope.version, '7.0.0-pre') } finally { server.closeAllConnections?.() server.close() @@ -1106,24 +1113,72 @@ describe('pipeline', { skip }, () => { try { await ns.flushSpans(span) - const sent = await ns.state.flushStats(true) - assert.strictEqual(sent, true, 'flushStats reported a send') + const result = await ns.state.flushStats(true) + assert.deepStrictEqual(result, { sent: true, collapsedSpans: 0 }, 'flushStats reported a send') const statsReq = seen.find(r => r.url === '/v0.6/stats') assert.ok(statsReq, 'agent received a /v0.6/stats request') assert.strictEqual(statsReq.method, 'PUT') assert.ok(statsReq.len > 0, 'stats payload is non-empty') // Nothing new aggregated -> a second forced flush is a no-op. - assert.strictEqual(await ns.state.flushStats(true), false, 'second flush has nothing to send') + assert.deepStrictEqual(await ns.state.flushStats(true), { sent: false, collapsedSpans: 0 }, 'second flush has nothing to send') + } finally { + server.closeAllConnections?.() + server.close() + } + }) + + it('returns collapsed span count when stats cardinality overflows', async () => { + const http = require('node:http') + const seen = [] + const server = http.createServer((req, res) => { + const chunks = [] + req.on('data', c => chunks.push(c)) + req.on('end', () => { + seen.push({ method: req.method, url: req.url, len: Buffer.concat(chunks).length }) + res.writeHead(200, { 'content-type': 'application/json' }) + res.end('{}') + }) + }) + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)) + const { port } = server.address() + + const ns = new NativeSpansInterface({ agentUrl: `http://127.0.0.1:${port}`, statsEnabled: true }) + let batch = [] + + try { + for (let i = 0; i < 15_000; i++) { + const span = ns.createSpan() + span.name = 'stats-span' + span.service = 'stats-svc' + span.resource = `/stats/${i}` + span.type = 'web' + span.setTag('span.kind', 'server') + span.duration = 5_000_000n + ns.flushChangeQueue() + batch.push(span) + if (batch.length === 500) { + await ns.flushSpans(...batch) + batch = [] + } + } + if (batch.length > 0) { + await ns.flushSpans(...batch) + } + + const result = await ns.state.flushStats(true) + assert.strictEqual(result.sent, true) + assert.ok(result.collapsedSpans > 0, 'stats cardinality overflow reported collapsed spans') + assert.ok(seen.some(r => r.url === '/v0.6/stats'), 'agent received a /v0.6/stats request') } finally { server.closeAllConnections?.() server.close() } }) - it('flushStats returns false when stats are disabled', async () => { + it('flushStats reports no send when stats are disabled', async () => { const ns = new NativeSpansInterface({ statsEnabled: false }) - assert.strictEqual(await ns.state.flushStats(true), false) + assert.deepStrictEqual(await ns.state.flushStats(true), { sent: false, collapsedSpans: 0 }) }) it('flushes stats to /v0.6/stats over a Unix domain socket', { skip: process.platform === 'win32' }, async () => { @@ -1167,8 +1222,12 @@ describe('pipeline', { skip }, () => { try { await ns.flushSpans(span) - const sent = await ns.state.flushStats(true) - assert.strictEqual(sent, true, 'flushStats reported a send over the socket') + const result = await ns.state.flushStats(true) + assert.deepStrictEqual( + result, + { sent: true, collapsedSpans: 0 }, + 'flushStats reported a send over the socket', + ) const statsReq = seen.find(r => r.url === '/v0.6/stats') assert.ok(statsReq, 'agent received a /v0.6/stats request over the socket') assert.ok(statsReq.len > 0, 'stats payload is non-empty') From de346d68e87e7f7670fa808bfd114c58af5d618c Mon Sep 17 00:00:00 2001 From: Jules Wiriath <53870805+Aaalibaba42@users.noreply.github.com> Date: Fri, 31 Jul 2026 17:27:38 +0200 Subject: [PATCH 63/68] feat: added file capability [APMSP-3780] (#177) * feat: added file capability * fix: JS tomfoolery * chore: change input to main now that libdatadog's side was merged * fix: post bump fixes * fix: review * fix: address comments * fix: detached buffer thing * fix: transport for files renamed, uniform lazy loading --- Cargo.lock | 42 ++++--- crates/capabilities/Cargo.toml | 4 +- crates/capabilities/src/file.rs | 156 ++++++++++++++++++++++++++ crates/capabilities/src/filesystem.js | 38 +++++++ crates/capabilities/src/lib.rs | 55 +++++++-- crates/pipeline/Cargo.toml | 17 ++- crates/pipeline/src/stats.rs | 3 +- eslint.config.js | 6 +- test/filesystem.js | 51 +++++++++ test/pipeline.js | 39 ++++--- yarn.lock | 6 +- 11 files changed, 357 insertions(+), 60 deletions(-) create mode 100644 crates/capabilities/src/file.rs create mode 100644 crates/capabilities/src/filesystem.js create mode 100644 test/filesystem.js diff --git a/Cargo.lock b/Cargo.lock index 22d82132..d45e0970 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -917,7 +917,7 @@ dependencies = [ [[package]] name = "libdd-capabilities" version = "2.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", "bytes", @@ -941,8 +941,9 @@ dependencies = [ [[package]] name = "libdd-capabilities-impl" version = "3.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ + "anyhow", "bytes", "http", "http-body-util", @@ -989,7 +990,7 @@ dependencies = [ [[package]] name = "libdd-common" version = "5.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", "bytes", @@ -1052,13 +1053,14 @@ dependencies = [ [[package]] name = "libdd-data-pipeline" version = "7.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", "arc-swap", "async-trait", "bytes", "either", + "futures", "getrandom 0.2.17", "http", "http-body-util", @@ -1081,6 +1083,7 @@ dependencies = [ "tokio-util", "tracing", "uuid", + "web-time", ] [[package]] @@ -1094,7 +1097,7 @@ dependencies = [ [[package]] name = "libdd-ddsketch" version = "1.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "prost", ] @@ -1102,7 +1105,7 @@ dependencies = [ [[package]] name = "libdd-dogstatsd-client" version = "4.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", "cadence", @@ -1174,7 +1177,7 @@ dependencies = [ [[package]] name = "libdd-shared-runtime" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "async-trait", "futures", @@ -1218,7 +1221,7 @@ dependencies = [ [[package]] name = "libdd-tinybytes" version = "1.1.1" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "serde", ] @@ -1226,7 +1229,7 @@ dependencies = [ [[package]] name = "libdd-trace-normalization" version = "3.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", "libdd-trace-protobuf 4.0.0", @@ -1235,7 +1238,7 @@ dependencies = [ [[package]] name = "libdd-trace-obfuscation" version = "5.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", "fluent-uri", @@ -1261,7 +1264,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" version = "4.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "prost", "serde", @@ -1271,7 +1274,7 @@ dependencies = [ [[package]] name = "libdd-trace-stats" version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", "arc-swap", @@ -1293,12 +1296,13 @@ dependencies = [ "tokio", "tokio-util", "tracing", + "web-time", ] [[package]] name = "libdd-trace-utils" version = "9.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=8cd68ab922fb7aade0f089ccfc91291d874673af#8cd68ab922fb7aade0f089ccfc91291d874673af" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", "base64", @@ -1310,6 +1314,7 @@ dependencies = [ "http-body", "http-body-util", "indexmap", + "itoa", "libdd-capabilities 2.1.0", "libdd-capabilities-impl 3.0.0", "libdd-common 5.1.0", @@ -1816,6 +1821,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test", + "web-time", ] [[package]] @@ -2757,6 +2763,16 @@ dependencies = [ "semver", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-root-certs" version = "1.0.8" diff --git a/crates/capabilities/Cargo.toml b/crates/capabilities/Cargo.toml index cbb376e6..edb40adc 100644 --- a/crates/capabilities/Cargo.toml +++ b/crates/capabilities/Cargo.toml @@ -15,9 +15,7 @@ http = "1" bytes = "1.4" futures-core = "0.3" anyhow = "1" -# TODO: Replace this temporary libdatadog PR rev with the official release/tag -# that contains DataDog/libdatadog#2235, then regenerate Cargo.lock. -libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af" } +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f" } [dev-dependencies] wasm-bindgen-test = "0.3" diff --git a/crates/capabilities/src/file.rs b/crates/capabilities/src/file.rs new file mode 100644 index 00000000..fe8eb4e6 --- /dev/null +++ b/crates/capabilities/src/file.rs @@ -0,0 +1,156 @@ +// Copyright 2026-Present Datadog, Inc. https://www.datadoghq.com/ +// SPDX-License-Identifier: Apache-2.0 + +//! Wasm implementation of [`FileCapability`] backed by Node.js `fs`. +//! +//! The JS transport is imported via `wasm_bindgen(module = ...)` from +//! `filesystem.js`, which ships alongside the wasm output. + +use std::future::Future; + +use bytes::Bytes; +use js_sys::{self, Reflect, Uint8Array}; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::JsFuture; + +use libdd_capabilities::file::{FileCapability, FileError, FileMetadata}; +use libdd_capabilities::maybe_send::MaybeSend; + +#[wasm_bindgen(module = "/src/filesystem.js")] +extern "C" { + #[wasm_bindgen(js_name = "readFile", catch)] + fn js_read_file(path: &str) -> Result; + + #[wasm_bindgen(js_name = "writeFile", catch)] + fn js_write_file(path: &str, data: &[u8]) -> Result; + + #[wasm_bindgen(js_name = "metadata", catch)] + fn js_metadata(path: &str) -> Result; + + #[wasm_bindgen(js_name = "exists", catch)] + fn js_exists(path: &str) -> Result; +} + +#[derive(Debug, Clone)] +pub struct WasmFileCapability; + +impl FileCapability for WasmFileCapability { + fn new() -> Self { + Self + } + + #[allow(clippy::manual_async_fn)] + fn read(&self, path: &str) -> impl Future> + MaybeSend { + let path = path.to_owned(); + async move { + let promise = + js_read_file(&path).map_err(|e| map_js_error(&e, &path))?; + let value = JsFuture::from(promise) + .await + .map_err(|e| map_js_error(&e, &path))?; + let array = Uint8Array::unchecked_from_js(value); + Ok(Bytes::from(array.to_vec())) + } + } + + #[allow(clippy::manual_async_fn)] + fn write( + &self, + path: &str, + contents: Bytes, + ) -> impl Future> + MaybeSend { + let path = path.to_owned(); + async move { + let promise = js_write_file(&path, &contents) + .map_err(|e| map_js_error(&e, &path))?; + JsFuture::from(promise) + .await + .map_err(|e| map_js_error(&e, &path))?; + Ok(()) + } + } + + #[allow(clippy::manual_async_fn)] + fn metadata( + &self, + path: &str, + ) -> impl Future> + MaybeSend { + let path = path.to_owned(); + async move { + let promise = + js_metadata(&path).map_err(|e| map_js_error(&e, &path))?; + let value = JsFuture::from(promise) + .await + .map_err(|e| map_js_error(&e, &path))?; + parse_metadata(&value, &path) + } + } + + #[allow(clippy::manual_async_fn)] + fn exists(&self, path: &str) -> impl Future> + MaybeSend { + let path = path.to_owned(); + async move { + let promise = js_exists(&path).map_err(|e| map_js_error(&e, &path))?; + let value = JsFuture::from(promise) + .await + .map_err(|e| map_js_error(&e, &path))?; + value + .as_bool() + .ok_or_else(|| FileError::Io(anyhow::anyhow!("exists({path}) did not return a boolean"))) + } + } +} + +fn map_js_error(err: &JsValue, path: &str) -> FileError { + let code = Reflect::get(err, &JsValue::from_str("code")) + .ok() + .and_then(|v| v.as_string()); + match code.as_deref() { + Some("ENOENT") => FileError::NotFound(path.to_owned()), + Some("EACCES") | Some("EPERM") => FileError::PermissionDenied(path.to_owned()), + _ => { + let message = Reflect::get(err, &JsValue::from_str("message")) + .ok() + .and_then(|v| v.as_string()) + .unwrap_or_else(|| format!("{err:?}")); + FileError::Io(anyhow::anyhow!("{message} (path: {path})")) + } + } +} + +fn parse_metadata(value: &JsValue, path: &str) -> Result { + let size = read_bigint_u64(value, "size", path)?; + // Node populates `stat().ino` on every platform, so `inode` is always Some. + let inode = Some(read_bigint_u64(value, "inode", path)?); + let is_file = read_bool(value, "is_file", path)?; + let is_dir = read_bool(value, "is_dir", path)?; + Ok(FileMetadata { + size, + inode, + is_file, + is_dir, + }) +} + +fn read_bigint_u64(value: &JsValue, key: &str, path: &str) -> Result { + let v = Reflect::get(value, &JsValue::from_str(key)) + .map_err(|_| FileError::Io(anyhow::anyhow!("metadata({path}) could not read field `{key}`")))?; + if v.is_undefined() || v.is_null() { + return Err(FileError::Io(anyhow::anyhow!("metadata({path}) missing field `{key}`"))); + } + let bigint = js_sys::BigInt::try_from(v) + .map_err(|_| FileError::Io(anyhow::anyhow!("metadata({path}) field `{key}` is not a BigInt")))?; + u64::try_from(bigint) + .map_err(|_| FileError::Io(anyhow::anyhow!("metadata({path}) field `{key}` overflows u64"))) +} + +fn read_bool(value: &JsValue, key: &str, path: &str) -> Result { + Reflect::get(value, &JsValue::from_str(key)) + .ok() + .and_then(|v| v.as_bool()) + .ok_or_else(|| { + FileError::Io(anyhow::anyhow!( + "metadata({path}) is missing boolean field `{key}`" + )) + }) +} diff --git a/crates/capabilities/src/filesystem.js b/crates/capabilities/src/filesystem.js new file mode 100644 index 00000000..014049a0 --- /dev/null +++ b/crates/capabilities/src/filesystem.js @@ -0,0 +1,38 @@ +// Lazy `require('node:fs')` — see http_transport.js. The cached accessor +// avoids paying the module-resolution cost on every call. + +'use strict' + +let _fs +function fs () { + return _fs ??= require('node:fs') +} + +module.exports.readFile = function (path) { + return fs().promises.readFile(path) +} + +module.exports.writeFile = function (path, data) { + // Copy off the wasm-memory view before the async write; a memory grow would + // otherwise detach the underlying ArrayBuffer mid-write. + return fs().promises.writeFile(path, Buffer.from(data)) +} + +module.exports.metadata = function (path) { + return fs().promises.stat(path, { bigint: true }).then(s => ({ + size: s.size, + inode: s.ino, + is_file: s.isFile(), + is_dir: s.isDirectory(), + })) +} + +module.exports.exists = function (path) { + return fs().promises.stat(path).then( + () => true, + (error) => { + if (error && error.code === 'ENOENT') return false + throw error + }, + ) +} diff --git a/crates/capabilities/src/lib.rs b/crates/capabilities/src/lib.rs index f7cb4b01..ebd385f3 100644 --- a/crates/capabilities/src/lib.rs +++ b/crates/capabilities/src/lib.rs @@ -12,27 +12,32 @@ use std::future::Future; use std::time::Duration; +use libdd_capabilities::file::{FileCapability, FileError, FileMetadata}; use libdd_capabilities::http::HttpError; use libdd_capabilities::{HttpClientCapability, LogWriterCapability, MaybeSend, SleepCapability}; +pub mod file; pub mod http; pub mod sleep; +pub use file::WasmFileCapability; pub use http::WasmHttpClient; pub use sleep::WasmSleepCapability; /// Bundle of wasm platform capabilities for libdatadog's `TraceExporter`. /// -/// Mirrors libdatadog's native `NativeCapabilities`: delegates HTTP to -/// [`WasmHttpClient`] and sleep to [`WasmSleepCapability`]. Log output is a -/// no-op (see the [`LogWriterCapability`] impl). Per-function bounds stay +/// Mirrors libdatadog's native `NativeCapabilities`. Per-function bounds stay /// minimal in libdatadog (e.g. stats-only code uses [`WasmHttpClient`] /// directly), so this bundle is only needed where the full `TraceExporter` /// capability set is. #[derive(Clone, Debug)] pub struct WasmCapabilities { + /// Outbound HTTP requests routed through the JS fetch/socket transport. http: WasmHttpClient, + /// Async sleep backed by `setTimeout` via wasm-bindgen. sleep: WasmSleepCapability, + /// Filesystem access delegated to the Node.js `fs` transport. + file: WasmFileCapability, } impl Default for WasmCapabilities { @@ -46,16 +51,14 @@ impl WasmCapabilities { Self { http: WasmHttpClient::new_client(), sleep: WasmSleepCapability, + file: WasmFileCapability, } } } impl HttpClientCapability for WasmCapabilities { fn new_client() -> Self { - Self { - http: WasmHttpClient::new_client(), - sleep: WasmSleepCapability, - } + Self::new() } fn request( @@ -68,10 +71,7 @@ impl HttpClientCapability for WasmCapabilities { impl SleepCapability for WasmCapabilities { fn new() -> Self { - Self { - http: WasmHttpClient::new_client(), - sleep: WasmSleepCapability, - } + Self::new() } fn sleep(&self, duration: Duration) -> impl Future + MaybeSend { @@ -89,3 +89,36 @@ impl LogWriterCapability for WasmCapabilities { Ok(()) } } + +impl FileCapability for WasmCapabilities { + fn new() -> Self { + Self::new() + } + + fn read( + &self, + path: &str, + ) -> impl Future> + MaybeSend { + self.file.read(path) + } + + fn write( + &self, + path: &str, + contents: ::bytes::Bytes, + ) -> impl Future> + MaybeSend { + self.file.write(path, contents) + } + + fn metadata( + &self, + path: &str, + ) -> impl Future> + MaybeSend { + self.file.metadata(path) + } + + fn exists(&self, path: &str) -> impl Future> + MaybeSend { + self.file.exists(path) + } +} + diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml index f8e318a3..29fc2722 100644 --- a/crates/pipeline/Cargo.toml +++ b/crates/pipeline/Cargo.toml @@ -14,15 +14,14 @@ js-sys = "0.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1" libdatadog-nodejs-capabilities = { path = "../capabilities" } -# TODO: Replace these temporary libdatadog PR revs with the official release/tag -# that contains DataDog/libdatadog#2235, then regenerate Cargo.lock. -libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af" } -libdd-common = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } -libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false, features = ["change-buffer"] } -libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } -libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } -libdd-shared-runtime = { git = "https://github.com/DataDog/libdatadog.git", rev = "8cd68ab922fb7aade0f089ccfc91291d874673af", default-features = false } +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f" } +libdd-common = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } +libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false, features = ["change-buffer"] } +libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } +libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } +libdd-shared-runtime = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } +web-time = "1" rmp-serde = "1" bytes = "1" http = "1" diff --git a/crates/pipeline/src/stats.rs b/crates/pipeline/src/stats.rs index 127a21e6..ac17a112 100644 --- a/crates/pipeline/src/stats.rs +++ b/crates/pipeline/src/stats.rs @@ -7,7 +7,7 @@ //! HTTP transport for flushing stats to the Datadog agent's `/v0.6/stats` //! endpoint. -use std::time::{Duration, SystemTime}; +use web_time::{Duration, SystemTime}; /// Wall-clock now() for wasm. `std::time::SystemTime::now()` is unimplemented on /// `wasm32-unknown-unknown` (it panics/traps), so derive the time from JS @@ -67,6 +67,7 @@ impl StatsCollector { ], Vec::new(), None, + Vec::new(), ), meta, agent_url, diff --git a/eslint.config.js b/eslint.config.js index e7b67365..690debfb 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -80,9 +80,9 @@ module.exports = [ }, }, { - // Loaded by Rust via `wasm_bindgen(module = ".../http_transport.js")`, so the - // snake_case filename must match the Rust module path. - files: ['**/http_transport.js'], + // Loaded by Rust via `wasm_bindgen(module = ".../_transport.js")`, so + // the snake_case filename must match the Rust module path. + files: ['**/*_transport.js'], rules: { 'unicorn/filename-case': 'off', }, diff --git a/test/filesystem.js b/test/filesystem.js new file mode 100644 index 00000000..ec14bccd --- /dev/null +++ b/test/filesystem.js @@ -0,0 +1,51 @@ +'use strict' + +// The shim is plain CommonJS, so drive it directly. + +const { describe, it, before, after } = require('node:test') +const assert = require('node:assert') +const fs = require('node:fs') +const os = require('node:os') +const path = require('node:path') + +const filesystem = require('../crates/capabilities/src/filesystem') + +describe('filesystem', () => { + let tmp + before(() => { + tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'libdd-file-')) + }) + after(() => { + fs.rmSync(tmp, { recursive: true, force: true }) + }) + + it('writes and reads a file round-trip', async () => { + const p = path.join(tmp, 'hello.bin') + await filesystem.writeFile(p, Buffer.from('hello')) + const got = await filesystem.readFile(p) + assert.strictEqual(Buffer.from(got).toString('utf8'), 'hello') + }) + + it('readFile on a missing path rejects with ENOENT', async () => { + const p = path.join(tmp, 'does-not-exist') + await assert.rejects(filesystem.readFile(p), error => error && error.code === 'ENOENT') + }) + + it('metadata reports size, kind, and a positive inode', async () => { + const p = path.join(tmp, 'meta.bin') + fs.writeFileSync(p, '0123456789') + const m = await filesystem.metadata(p) + assert.strictEqual(m.size, 10n) + assert.strictEqual(m.is_file, true) + assert.strictEqual(m.is_dir, false) + assert.ok(m.inode > 0n, `expected positive inode, got ${m.inode}`) + }) + + it('exists returns true for a present path and false for a missing one', async () => { + const present = path.join(tmp, 'here') + fs.writeFileSync(present, '') + const absent = path.join(tmp, 'gone') + assert.strictEqual(await filesystem.exists(present), true) + assert.strictEqual(await filesystem.exists(absent), false) + }) +}) diff --git a/test/pipeline.js b/test/pipeline.js index bc6eabf6..59511fef 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -181,13 +181,19 @@ class NativeSpansInterface { this._cqbBytes = new Uint8Array(this._wasmMemory.buffer, this._cqbPtr) } - resetChangeQueue () { - this.cqbIndex = 8 - this.cqbCount = 0 - // Check if WASM memory was detached/grown + // Any Rust call can trigger a WASM memory.grow(), which detaches the + // JS-side ArrayBuffer. Callers must invoke this before every read/write to + // the shared buffers when a Rust call may have happened since the last check. + _ensureViews () { if (this._wasmMemory.buffer !== this._cqbView.buffer) { this._refreshViews() } + } + + resetChangeQueue () { + this.cqbIndex = 8 + this.cqbCount = 0 + this._ensureViews() this._cqbView.setUint32(0, 0, true) this._cqbView.setUint32(4, 0, true) } @@ -228,10 +234,7 @@ class NativeSpansInterface { } queueOp (op, spanId, ...args) { - // Check if WASM memory was detached/grown - if (this._wasmMemory.buffer !== this._cqbView.buffer) { - this._refreshViews() - } + this._ensureViews() // Check if Rust flushed the queue (wrote 0 to count position) if (this._cqbView.getUint32(0, true) === 0 && this.cqbCount > 0) { @@ -239,18 +242,20 @@ class NativeSpansInterface { this.cqbCount = 0 } - const view = this._cqbView // Op header: opcode (u16 LE) + span_id (u64 LE) = 10 bytes. Rust reads the // opcode as a u16, then the span_id as a u64. - view.setUint16(this.cqbIndex, op, true) + this._cqbView.setUint16(this.cqbIndex, op, true) this.cqbIndex += 2 this._writeBytesLE(spanId, this.cqbIndex) this.cqbIndex += 8 for (const arg of args) { if (typeof arg === 'string') { + // getStringId may call into Rust (stringTableInsertOne), which can + // grow WASM memory and detach our views. Re-check after the call. const stringId = this.getStringId(arg) - view.setUint32(this.cqbIndex, stringId, true) + this._ensureViews() + this._cqbView.setUint32(this.cqbIndex, stringId, true) this.cqbIndex += 4 } else { const [typ, num] = arg @@ -261,12 +266,12 @@ class NativeSpansInterface { break } case 'u64n': { - view.setBigUint64(this.cqbIndex, BigInt(num), true) + this._cqbView.setBigUint64(this.cqbIndex, BigInt(num), true) this.cqbIndex += 8 break } case 'u32n': { // raw, pre-resolved string-table id - view.setUint32(this.cqbIndex, num, true) + this._cqbView.setUint32(this.cqbIndex, num, true) this.cqbIndex += 4 break } @@ -278,17 +283,17 @@ class NativeSpansInterface { break } case 'i64': { - view.setBigInt64(this.cqbIndex, num, true) + this._cqbView.setBigInt64(this.cqbIndex, num, true) this.cqbIndex += 8 break } case 'i32': { - view.setInt32(this.cqbIndex, num, true) + this._cqbView.setInt32(this.cqbIndex, num, true) this.cqbIndex += 4 break } case 'f64': { - view.setFloat64(this.cqbIndex, num, true) + this._cqbView.setFloat64(this.cqbIndex, num, true) this.cqbIndex += 8 break } @@ -300,7 +305,7 @@ class NativeSpansInterface { } this.cqbCount++ - view.setBigUint64(0, BigInt(this.cqbCount), true) + this._cqbView.setBigUint64(0, BigInt(this.cqbCount), true) } createSpan (traceId, parentId) { diff --git a/yarn.lock b/yarn.lock index 14dca938..85f5c9f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -280,7 +280,7 @@ baseline-browser-mapping@^2.9.0: resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== -brace-expansion@^5.0.2, brace-expansion@^5.0.6: +brace-expansion@^5.0.2: version "5.0.6" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.6.tgz#ec68fe0a641a29d8711579caf641d05bae1f2285" integrity sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g== @@ -608,7 +608,7 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" -flatted@^3.2.9, flatted@^3.4.2: +flatted@^3.2.9: version "3.4.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== @@ -801,7 +801,7 @@ picocolors@^1.1.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^4.0.2, picomatch@^4.0.3, picomatch@^4.0.4: +picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== From 0db5cbcfd403fc1d947d134545d9768bb7c60d61 Mon Sep 17 00:00:00 2001 From: Jules Wiriath <53870805+Aaalibaba42@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:01:23 +0200 Subject: [PATCH 64/68] feat: added env capability [APMSP-3780] (#176) * feat: added env capability * feat: respect envcapabilities method unsafedness * feat: validate before saying it's ok * revert: remove set/unset since they would be dangerous APIs in libdatadog (and are most likely not useful in the near/middel future in dd-trace-js) * chore: change input to main's commit that has the change * docs: update doc to remove specific references to the capabilities * fix: remove extra checks * fix: cache env beforehand --- Cargo.lock | 42 ++++++++---------------- crates/capabilities/src/env.rs | 28 ++++++++++++++++ crates/capabilities/src/env_transport.js | 7 ++++ crates/capabilities/src/lib.rs | 21 +++++++++--- crates/library_config/Cargo.toml | 2 +- crates/process_discovery/Cargo.toml | 7 ++-- test/env-transport.js | 31 +++++++++++++++++ 7 files changed, 100 insertions(+), 38 deletions(-) create mode 100644 crates/capabilities/src/env.rs create mode 100644 crates/capabilities/src/env_transport.js create mode 100644 test/env-transport.js diff --git a/Cargo.lock b/Cargo.lock index d45e0970..377fa066 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1072,7 +1072,7 @@ dependencies = [ "libdd-shared-runtime 2.0.0", "libdd-tinybytes", "libdd-trace-normalization", - "libdd-trace-protobuf 4.0.0", + "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", "libdd-trace-stats", "libdd-trace-utils", "rmp-serde", @@ -1117,26 +1117,12 @@ dependencies = [ [[package]] name = "libdd-library-config" -version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=353134770b312b7ccd2df6afabc253090b948e5f#353134770b312b7ccd2df6afabc253090b948e5f" -dependencies = [ - "anyhow", - "memfd", - "rand", - "rmp", - "rmp-serde", - "serde", - "serde_yaml", -] - -[[package]] -name = "libdd-library-config" -version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25#7cdeb7896e92d1ba38bde495934e112dac2eda25" +version = "3.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=0c6e2a5df2a163d34c4f385353ffc5d7257c72f4#0c6e2a5df2a163d34c4f385353ffc5d7257c72f4" dependencies = [ "anyhow", "libc", - "libdd-trace-protobuf 3.0.2", + "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=0c6e2a5df2a163d34c4f385353ffc5d7257c72f4)", "memfd", "prost", "rand", @@ -1232,7 +1218,7 @@ version = "3.0.0" source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" dependencies = [ "anyhow", - "libdd-trace-protobuf 4.0.0", + "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", ] [[package]] @@ -1243,7 +1229,7 @@ dependencies = [ "anyhow", "fluent-uri", "libdd-common 5.1.0", - "libdd-trace-protobuf 4.0.0", + "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", "libdd-trace-utils", "log", "percent-encoding", @@ -1253,8 +1239,8 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" -version = "3.0.2" -source = "git+https://github.com/DataDog/libdatadog.git?rev=7cdeb7896e92d1ba38bde495934e112dac2eda25#7cdeb7896e92d1ba38bde495934e112dac2eda25" +version = "4.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=0c6e2a5df2a163d34c4f385353ffc5d7257c72f4#0c6e2a5df2a163d34c4f385353ffc5d7257c72f4" dependencies = [ "prost", "serde", @@ -1289,7 +1275,7 @@ dependencies = [ "libdd-dogstatsd-client", "libdd-shared-runtime 2.0.0", "libdd-trace-obfuscation", - "libdd-trace-protobuf 4.0.0", + "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", "libdd-trace-utils", "rmp-serde", "serde", @@ -1320,7 +1306,7 @@ dependencies = [ "libdd-common 5.1.0", "libdd-tinybytes", "libdd-trace-normalization", - "libdd-trace-protobuf 4.0.0", + "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", "prost", "rand", "rmp", @@ -1357,7 +1343,7 @@ version = "0.2.0" dependencies = [ "anyhow", "getrandom 0.2.17", - "libdd-library-config 1.0.0", + "libdd-library-config", "serde", "serde-wasm-bindgen", "wasm-bindgen", @@ -1811,7 +1797,7 @@ dependencies = [ "libdd-common 5.1.0", "libdd-data-pipeline", "libdd-shared-runtime 2.0.0", - "libdd-trace-protobuf 4.0.0", + "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", "libdd-trace-stats", "libdd-trace-utils", "rmp-serde", @@ -1872,8 +1858,8 @@ name = "process-discovery" version = "0.1.0" dependencies = [ "anyhow", - "libdd-library-config 2.0.0", - "libdd-trace-protobuf 3.0.2", + "libdd-library-config", + "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=0c6e2a5df2a163d34c4f385353ffc5d7257c72f4)", "napi", "napi-derive", ] diff --git a/crates/capabilities/src/env.rs b/crates/capabilities/src/env.rs new file mode 100644 index 00000000..716d4b4a --- /dev/null +++ b/crates/capabilities/src/env.rs @@ -0,0 +1,28 @@ +// Copyright 2026-Present Datadog, Inc. https://www.datadoghq.com/ +// SPDX-License-Identifier: Apache-2.0 + +//! Wasm implementation of [`EnvCapability`] backed by Node.js `process.env`. + +use wasm_bindgen::prelude::*; + +use libdd_capabilities::env::{EnvCapability, EnvError}; + +#[wasm_bindgen(module = "/src/env_transport.js")] +extern "C" { + #[wasm_bindgen(js_name = "get")] + fn js_env_get(name: &str) -> JsValue; +} + +#[derive(Debug, Clone)] +pub struct WasmEnvCapability; + +impl EnvCapability for WasmEnvCapability { + fn new() -> Self { + Self + } + + fn get(&self, name: &str) -> Result, EnvError> { + // Node coerces every process.env value to a string, so NotUnicode is unreachable here. + Ok(js_env_get(name).as_string()) + } +} diff --git a/crates/capabilities/src/env_transport.js b/crates/capabilities/src/env_transport.js new file mode 100644 index 00000000..92d6504b --- /dev/null +++ b/crates/capabilities/src/env_transport.js @@ -0,0 +1,7 @@ +'use strict' + +const { env } = process + +module.exports.get = (name) => { + return env[name] +} diff --git a/crates/capabilities/src/lib.rs b/crates/capabilities/src/lib.rs index ebd385f3..e76a3812 100644 --- a/crates/capabilities/src/lib.rs +++ b/crates/capabilities/src/lib.rs @@ -4,22 +4,24 @@ //! Wasm capability implementations for libdatadog-nodejs. //! //! [`WasmCapabilities`] is the bundle struct that implements every capability -//! trait `TraceExporter` requires (HTTP, sleep, log output) using wasm_bindgen -//! and JS transports. The wasm binding crate pins this type as the capability -//! generic for libdatadog's `TraceExporter`, mirroring libdatadog's native -//! `NativeCapabilities`. +//! trait `TraceExporter` requires using wasm_bindgen and JS transports. The +//! wasm binding crate pins this type as the capability generic for libdatadog's +//! `TraceExporter`, mirroring libdatadog's native `NativeCapabilities`. use std::future::Future; use std::time::Duration; +use libdd_capabilities::env::{EnvCapability, EnvError}; use libdd_capabilities::file::{FileCapability, FileError, FileMetadata}; use libdd_capabilities::http::HttpError; use libdd_capabilities::{HttpClientCapability, LogWriterCapability, MaybeSend, SleepCapability}; +pub mod env; pub mod file; pub mod http; pub mod sleep; +pub use env::WasmEnvCapability; pub use file::WasmFileCapability; pub use http::WasmHttpClient; pub use sleep::WasmSleepCapability; @@ -38,6 +40,7 @@ pub struct WasmCapabilities { sleep: WasmSleepCapability, /// Filesystem access delegated to the Node.js `fs` transport. file: WasmFileCapability, + env: WasmEnvCapability, } impl Default for WasmCapabilities { @@ -52,6 +55,7 @@ impl WasmCapabilities { http: WasmHttpClient::new_client(), sleep: WasmSleepCapability, file: WasmFileCapability, + env: WasmEnvCapability, } } } @@ -122,3 +126,12 @@ impl FileCapability for WasmCapabilities { } } +impl EnvCapability for WasmCapabilities { + fn new() -> Self { + Self::new() + } + + fn get(&self, name: &str) -> Result, EnvError> { + self.env.get(name) + } +} diff --git a/crates/library_config/Cargo.toml b/crates/library_config/Cargo.toml index be76bd45..b6deab09 100644 --- a/crates/library_config/Cargo.toml +++ b/crates/library_config/Cargo.toml @@ -8,7 +8,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" -libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", rev = "353134770b312b7ccd2df6afabc253090b948e5f" } +libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", rev = "0c6e2a5df2a163d34c4f385353ffc5d7257c72f4" } wasm-bindgen = "0.2.100" serde = { version = "1.0", features = ["derive"] } diff --git a/crates/process_discovery/Cargo.toml b/crates/process_discovery/Cargo.toml index 44042286..32e9449e 100644 --- a/crates/process_discovery/Cargo.toml +++ b/crates/process_discovery/Cargo.toml @@ -8,11 +8,8 @@ crate-type = ["cdylib", "rlib"] [dependencies] anyhow = "1" -# Pointed at the merge commit that introduced ThreadLocalMetadata (caller-supplied -# schema version + extra process-context attributes). Swap back to a tagged release -# once one that includes 7cdeb7896e92d1ba38bde495934e112dac2eda25 is published. -libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", rev = "7cdeb7896e92d1ba38bde495934e112dac2eda25", features = ["otel-thread-ctx"] } -libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "7cdeb7896e92d1ba38bde495934e112dac2eda25" } +libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", rev = "0c6e2a5df2a163d34c4f385353ffc5d7257c72f4", features = ["otel-thread-ctx"] } +libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "0c6e2a5df2a163d34c4f385353ffc5d7257c72f4" } napi = { version = "2" } napi-derive = { version = "2", default-features = false } diff --git a/test/env-transport.js b/test/env-transport.js new file mode 100644 index 00000000..f45a3779 --- /dev/null +++ b/test/env-transport.js @@ -0,0 +1,31 @@ +'use strict' + +// The transport shim is plain CommonJS, so drive it directly. + +const { describe, it, before, after } = require('node:test') +const assert = require('node:assert') + +const envTransport = require('../crates/capabilities/src/env_transport') + +describe('env_transport', () => { + const NAME = 'LIBDD_CAP_TEST_ENV_TRANSPORT' + let savedValue + + before(() => { + savedValue = process.env[NAME] + }) + after(() => { + if (savedValue === undefined) delete process.env[NAME] + else process.env[NAME] = savedValue + }) + + it('returns undefined for an unset var', () => { + delete process.env[NAME] + assert.strictEqual(envTransport.get(NAME), undefined) + }) + + it('returns the value when the var is set', () => { + process.env[NAME] = 'value1' + assert.strictEqual(envTransport.get(NAME), 'value1') + }) +}) From 6b1beff1b217c0251439d6385e2c09a5ca3995bd Mon Sep 17 00:00:00 2001 From: Ilyas Shabi Date: Mon, 10 Aug 2026 17:25:55 +0200 Subject: [PATCH 65/68] feat: add DDSketch WASM bindings (#198) * feat: add DDSketch WASM bindings --- .github/workflows/build.yml | 1 + .github/workflows/release.yml | 1 + Cargo.lock | 8 ++++++++ crates/sketches/Cargo.toml | 15 ++++++++++++++ crates/sketches/src/lib.rs | 37 +++++++++++++++++++++++++++++++++++ package.json | 2 +- test/wasm/sketches/index.js | 29 +++++++++++++++++++++++++++ 7 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 crates/sketches/Cargo.toml create mode 100644 crates/sketches/src/lib.rs create mode 100644 test/wasm/sketches/index.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1019981b..de179fb7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,6 +26,7 @@ jobs: - library_config - datadog-js-zstd - pipeline + - sketches steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: 'Use composite action' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f5ce2754..7533785d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,6 +14,7 @@ jobs: - library_config - datadog-js-zstd - pipeline + - sketches steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: 'Use composite action' diff --git a/Cargo.lock b/Cargo.lock index 377fa066..9945248b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2333,6 +2333,14 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +[[package]] +name = "sketches" +version = "0.1.0" +dependencies = [ + "libdd-ddsketch 1.1.0", + "wasm-bindgen", +] + [[package]] name = "slab" version = "0.4.12" diff --git a/crates/sketches/Cargo.toml b/crates/sketches/Cargo.toml new file mode 100644 index 00000000..6747f461 --- /dev/null +++ b/crates/sketches/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "sketches" +version = "0.1.0" +edition = "2021" +description = "Wasm bindings for Datadog's DDSketch" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +libdd-ddsketch = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f" } +wasm-bindgen = "0.2" + +[package.metadata.wasm-pack.profile.release] +wasm-opt = ["-O", "--enable-bulk-memory", "--enable-nontrapping-float-to-int"] diff --git a/crates/sketches/src/lib.rs b/crates/sketches/src/lib.rs new file mode 100644 index 00000000..0b55db3d --- /dev/null +++ b/crates/sketches/src/lib.rs @@ -0,0 +1,37 @@ +use libdd_ddsketch::DDSketch as InnerDDSketch; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +#[derive(Default)] +pub struct DDSketch { + inner: InnerDDSketch, +} + +#[wasm_bindgen] +impl DDSketch { + #[wasm_bindgen(constructor)] + pub fn new() -> Self { + Self::default() + } + + pub fn add(&mut self, point: f64) -> Result<(), JsError> { + self.inner + .add(point) + .map_err(|error| JsError::new(&error.to_string())) + } + + #[wasm_bindgen(js_name = addWithCount)] + pub fn add_with_count(&mut self, point: f64, count: f64) -> Result<(), JsError> { + self.inner + .add_with_count(point, count) + .map_err(|error| JsError::new(&error.to_string())) + } + + pub fn count(&self) -> f64 { + self.inner.count() + } + + pub fn encode(&self) -> Vec { + self.inner.clone().encode_to_vec() + } +} diff --git a/package.json b/package.json index d956cc21..4ccfe8d3 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts", "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts", "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", - "build-wasm": "yarn -s install-wasm-pack && node scripts/build-wasm.js library_config && node scripts/build-wasm.js datadog-js-zstd && node scripts/build-wasm.js pipeline", + "build-wasm": "yarn -s install-wasm-pack && node scripts/build-wasm.js library_config && node scripts/build-wasm.js datadog-js-zstd && node scripts/build-wasm.js pipeline && node scripts/build-wasm.js sketches", "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", diff --git a/test/wasm/sketches/index.js b/test/wasm/sketches/index.js new file mode 100644 index 00000000..dfae84f6 --- /dev/null +++ b/test/wasm/sketches/index.js @@ -0,0 +1,29 @@ +'use strict' + +const assert = require('node:assert') + +const loader = require('../../../load') +const { DDSketch } = loader.load('sketches') + +const sketch = new DDSketch() +assert.strictEqual(sketch.count(), 0) + +sketch.add(1) +sketch.addWithCount(2, 3) +assert.strictEqual(sketch.count(), 4) + +assert.throws(() => sketch.add(-1), /point is invalid/) +assert.throws(() => sketch.addWithCount(1, Number.NaN), /count is invalid/) + +const encoded = sketch.encode() +assert(encoded instanceof Uint8Array) +assert(encoded.length > 0) + +assert.strictEqual(sketch.count(), 4) +sketch.add(3) +assert.strictEqual(sketch.count(), 5) + +const reencoded = sketch.encode() +assert(reencoded instanceof Uint8Array) +assert(reencoded.length > 0) +assert.strictEqual(sketch.count(), 5) From eceb7550c3b3231b447cb23bd41b434bc77017af Mon Sep 17 00:00:00 2001 From: Ilyas Shabi Date: Mon, 10 Aug 2026 21:09:43 +0200 Subject: [PATCH 66/68] build: simplify WASM build script (#199) --- package.json | 2 +- scripts/build-wasm.js | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 4ccfe8d3..60154703 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build-debug": "mkdir -p target && yarn -s cargo-build > ./target/out.ndjson && yarn -s copy-artifacts", "build-release": "mkdir -p target && yarn -s cargo-build-release > ./target/out.ndjson && yarn -s copy-artifacts", "build-all": "mkdir -p target && yarn -s cargo-build -- --workspace > ./target/out.ndjson && yarn -s copy-artifacts && yarn -s build-wasm", - "build-wasm": "yarn -s install-wasm-pack && node scripts/build-wasm.js library_config && node scripts/build-wasm.js datadog-js-zstd && node scripts/build-wasm.js pipeline && node scripts/build-wasm.js sketches", + "build-wasm": "yarn -s install-wasm-pack && node scripts/build-wasm.js", "cargo-build-release": "yarn -s cargo-build -- --release", "cargo-build": "cargo build --message-format=json-render-diagnostics", "copy-artifacts": "node ./scripts/copy-artifacts", diff --git a/scripts/build-wasm.js b/scripts/build-wasm.js index b5a20a6d..93b338e6 100644 --- a/scripts/build-wasm.js +++ b/scripts/build-wasm.js @@ -15,7 +15,12 @@ const childProcess = require('node:child_process') const isMacOS = os.platform() === 'darwin' const noWasmOpt = isMacOS ? '--no-opt' : '' -const library = process.argv[2] +const libraries = [ + 'library_config', + 'datadog-js-zstd', + 'pipeline', + 'sketches', +] const env = { ...process.env, @@ -44,8 +49,10 @@ if (isMacOS) { env.CXX_wasm32_unknown_unknown = `${llvmBinDir}/clang++` } -childProcess.execSync( - `wasm-pack build ${noWasmOpt} --target nodejs ./crates/${library} --out-dir ../../prebuilds/${library}`, { - env, - }, -) +for (const library of libraries) { + childProcess.execSync( + `wasm-pack build ${noWasmOpt} --target nodejs ./crates/${library} --out-dir ../../prebuilds/${library}`, { + env, + }, + ) +} From c66c094bee18e8a786d5d1b6b2d920f7bb4dbb35 Mon Sep 17 00:00:00 2001 From: Jules Wiriath <53870805+Aaalibaba42@users.noreply.github.com> Date: Tue, 11 Aug 2026 12:05:54 +0200 Subject: [PATCH 67/68] feat: Adopt TraceExporter's Telemetry stuff (#183) * feat: added env capability * feat: respect envcapabilities method unsafedness * feat: validate before saying it's ok * revert: remove set/unset since they would be dangerous APIs in libdatadog (and are most likely not useful in the near/middel future in dd-trace-js) * chore: change input to main's commit that has the change * docs: update doc to remove specific references to the capabilities * fix: remove extra checks * fix: cache env beforehand * feat: Adopt TraceExporter's Telemetry stuff * docs: fix libdatadog's behavior when 0 is passed * chore: js tomfoolery * fix: comments * fix: use Cells uniformaly * feat: make the losslessness obvious --- Cargo.lock | 33 ++++++++++++++++++++- crates/pipeline/Cargo.toml | 4 +-- crates/pipeline/src/lib.rs | 57 ++++++++++++++++++++++++++++-------- crates/pipeline/src/stats.rs | 8 ++--- 4 files changed, 83 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9945248b..b69d0b47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1031,7 +1031,7 @@ dependencies = [ "libc", "libdd-common 5.0.0", "libdd-libunwind-sys", - "libdd-telemetry", + "libdd-telemetry 5.0.1", "nix 0.29.0", "num-derive", "num-traits", @@ -1070,6 +1070,7 @@ dependencies = [ "libdd-ddsketch 1.1.0", "libdd-dogstatsd-client", "libdd-shared-runtime 2.0.0", + "libdd-telemetry 6.0.0", "libdd-tinybytes", "libdd-trace-normalization", "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", @@ -1204,6 +1205,35 @@ dependencies = [ "winver", ] +[[package]] +name = "libdd-telemetry" +version = "6.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +dependencies = [ + "anyhow", + "async-trait", + "base64", + "bytes", + "futures", + "getrandom 0.2.17", + "hashbrown 0.15.5", + "http", + "libc", + "libdd-capabilities 2.1.0", + "libdd-common 5.1.0", + "libdd-ddsketch 1.1.0", + "libdd-shared-runtime 2.0.0", + "serde", + "serde_json", + "sys-info", + "tokio", + "tokio-util", + "tracing", + "uuid", + "web-time", + "winver", +] + [[package]] name = "libdd-tinybytes" version = "1.1.1" @@ -1274,6 +1304,7 @@ dependencies = [ "libdd-ddsketch 1.1.0", "libdd-dogstatsd-client", "libdd-shared-runtime 2.0.0", + "libdd-telemetry 6.0.0", "libdd-trace-obfuscation", "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", "libdd-trace-utils", diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml index 29fc2722..8056816e 100644 --- a/crates/pipeline/Cargo.toml +++ b/crates/pipeline/Cargo.toml @@ -16,15 +16,15 @@ serde_json = "1" libdatadog-nodejs-capabilities = { path = "../capabilities" } libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f" } libdd-common = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } -libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } +libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false, features = ["telemetry"] } libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false, features = ["change-buffer"] } libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } libdd-shared-runtime = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } -web-time = "1" rmp-serde = "1" bytes = "1" http = "1" +web-time = "1" console_error_panic_hook = "0.1" [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/crates/pipeline/src/lib.rs b/crates/pipeline/src/lib.rs index 31188af5..eb25866e 100644 --- a/crates/pipeline/src/lib.rs +++ b/crates/pipeline/src/lib.rs @@ -1,7 +1,7 @@ use libdatadog_nodejs_capabilities::WasmCapabilities; use libdd_data_pipeline::trace_exporter::agent_response::AgentResponse; use libdd_data_pipeline::trace_exporter::{ - TraceExporter, TraceExporterBuilder, TraceExporterOutputFormat, + TelemetryConfig, TraceExporter, TraceExporterBuilder, TraceExporterOutputFormat, }; use libdd_data_pipeline::OtlpProtocol; use libdd_shared_runtime::LocalRuntime; @@ -197,13 +197,17 @@ pub struct WasmSpanState { /// Datadog agent. libdatadog maps its internal traces to OTLP, so no /// JS-formatted spans are involved. Like `use_v05`, only takes effect if /// set before the first send (when the exporter is built). - otlp_endpoint: RefCell>, + otlp_endpoint: Cell>, /// OTLP wire protocol (`http/json` default, or `http/protobuf`). Only /// applied when `otlp_endpoint` is set. otlp_protocol: Cell>, /// Extra HTTP headers for OTLP export (e.g. collector auth), as key/value /// pairs. Only applied when `otlp_endpoint` is set. - otlp_headers: RefCell>, + otlp_headers: Cell>, + /// When set, the lazily-built exporter has telemetry enabled with this + /// config. Only takes effect if set before the first send + /// (when the exporter is built). + telemetry_config: Cell>, /// Latched message from a failed lazy `build_async`. Building is one-shot and /// a failure is fatal (bad config), so once set every send returns it (as a /// distinguishable error) instead of a misleading "builder already consumed", @@ -335,9 +339,10 @@ impl WasmSpanState { prepared_spans: RefCell::new(Vec::new()), sending: Cell::new(false), use_v05: Cell::new(false), - otlp_endpoint: RefCell::new(None), + otlp_endpoint: Cell::new(None), otlp_protocol: Cell::new(None), - otlp_headers: RefCell::new(Vec::new()), + otlp_headers: Cell::new(Vec::new()), + telemetry_config: Cell::new(None), build_error: RefCell::new(None), }) } @@ -359,7 +364,7 @@ impl WasmSpanState { /// Takes precedence over `setUseV05` (OTLP bypasses the agent entirely). #[wasm_bindgen(js_name = "setOtlpEndpoint")] pub fn set_otlp_endpoint(&self, url: String) { - *self.otlp_endpoint.borrow_mut() = Some(url); + self.otlp_endpoint.set(Some(url)); } /// Select the OTLP wire protocol: `http/json` (default) or `http/protobuf`. @@ -374,6 +379,31 @@ impl WasmSpanState { Ok(()) } + /// Enable telemetry on the lazily-built trace exporter. + /// + /// Must be called before the first `sendPreparedChunk`. Later calls have + /// no effect. + /// + /// # Arguments + /// + /// - `heartbeat_ms`: sets the metric-flush cadence. Set to 0 to defer to + /// libdatadog's default interval. + /// - `runtime_id`: tags telemetry payloads with the tracer's runtime id when provided + /// - `debug_enabled`: toggles libdd-telemetry's verbose logging + #[wasm_bindgen(js_name = "enableTelemetry")] + pub fn enable_telemetry( + &self, + heartbeat_ms: u32, + runtime_id: Option, + debug_enabled: bool, + ) { + self.telemetry_config.set(Some(TelemetryConfig { + heartbeat: u64::from(heartbeat_ms), + runtime_id, + debug_enabled, + })); + } + /// Set extra HTTP headers for OTLP export as a flat `[key, value, ...]` /// array (the host flattens its key/value map). Only takes effect with an /// OTLP endpoint set, before the first send. A trailing unpaired element on @@ -386,7 +416,7 @@ impl WasmSpanState { .chunks_exact(2) .map(|pair| (pair[0].clone(), pair[1].clone())) .collect(); - *self.otlp_headers.borrow_mut() = headers; + self.otlp_headers.set(headers); } #[wasm_bindgen] @@ -520,16 +550,19 @@ impl WasmSpanState { // When an OTLP endpoint is configured, libdatadog exports traces via // OTLP HTTP to that endpoint instead of the Datadog agent (mutually // exclusive with the agent v0.4/v0.5 path). - if let Some(url) = self.otlp_endpoint.borrow().as_deref() { - builder.set_otlp_endpoint(url); - if let Some(protocol) = self.otlp_protocol.get() { + if let Some(url) = self.otlp_endpoint.take() { + builder.set_otlp_endpoint(&url); + if let Some(protocol) = self.otlp_protocol.take() { builder.set_otlp_protocol(protocol); } - let headers = self.otlp_headers.borrow(); + let headers = self.otlp_headers.take(); if !headers.is_empty() { - builder.set_otlp_headers(headers.clone()); + builder.set_otlp_headers(headers); } } + if let Some(cfg) = self.telemetry_config.take() { + builder.enable_telemetry(cfg); + } match builder.build_async::().await { Ok(built) => *exporter_slot = Some(built), Err(e) => { diff --git a/crates/pipeline/src/stats.rs b/crates/pipeline/src/stats.rs index ac17a112..3e65cb46 100644 --- a/crates/pipeline/src/stats.rs +++ b/crates/pipeline/src/stats.rs @@ -9,11 +9,11 @@ use web_time::{Duration, SystemTime}; -/// Wall-clock now() for wasm. `std::time::SystemTime::now()` is unimplemented on -/// `wasm32-unknown-unknown` (it panics/traps), so derive the time from JS -/// `Date.now()` (milliseconds since the Unix epoch). +/// Wall-clock now() for wasm. Delegates to `web_time::SystemTime::now()`, +/// which routes to JS `Date.now()` on `wasm32-unknown-unknown` (native +/// `std::time::SystemTime::now()` is unimplemented on that target and traps). fn now() -> SystemTime { - SystemTime::UNIX_EPOCH + Duration::from_millis(js_sys::Date::now() as u64) + SystemTime::now() } use bytes::Bytes; From 278bdf3acd1bdbecfee9b6e65c6ce59746a30f01 Mon Sep 17 00:00:00 2001 From: Jules Wiriath Date: Mon, 17 Aug 2026 22:46:47 +0200 Subject: [PATCH 68/68] chore: bump libdatadog --- Cargo.lock | 126 +++++++++++++++++++------------- crates/capabilities/Cargo.toml | 2 +- crates/capabilities/src/http.rs | 4 + crates/capabilities/src/lib.rs | 9 +++ crates/pipeline/Cargo.toml | 14 ++-- crates/sketches/Cargo.toml | 2 +- test/pipeline.js | 4 +- 7 files changed, 100 insertions(+), 61 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b69d0b47..658e86be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -897,7 +897,7 @@ dependencies = [ "futures-core", "http", "js-sys", - "libdd-capabilities 2.1.0", + "libdd-capabilities 3.0.0", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test", @@ -916,11 +916,13 @@ dependencies = [ [[package]] name = "libdd-capabilities" -version = "2.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +version = "3.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", "bytes", + "futures-channel", + "futures-util", "http", "thiserror", ] @@ -940,15 +942,15 @@ dependencies = [ [[package]] name = "libdd-capabilities-impl" -version = "3.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +version = "4.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", "bytes", "http", "http-body-util", - "libdd-capabilities 2.1.0", - "libdd-common 5.1.0", + "libdd-capabilities 3.0.0", + "libdd-common 5.1.1", "tokio", ] @@ -989,8 +991,8 @@ dependencies = [ [[package]] name = "libdd-common" -version = "5.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +version = "5.1.1" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", "bytes", @@ -1053,7 +1055,7 @@ dependencies = [ [[package]] name = "libdd-data-pipeline" version = "7.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", "arc-swap", @@ -1064,16 +1066,16 @@ dependencies = [ "getrandom 0.2.17", "http", "http-body-util", - "libdd-capabilities 2.1.0", - "libdd-capabilities-impl 3.0.0", - "libdd-common 5.1.0", + "libdd-capabilities 3.0.0", + "libdd-capabilities-impl 4.0.0", + "libdd-common 5.1.1", "libdd-ddsketch 1.1.0", "libdd-dogstatsd-client", "libdd-shared-runtime 2.0.0", "libdd-telemetry 6.0.0", "libdd-tinybytes", "libdd-trace-normalization", - "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", + "libdd-trace-protobuf 4.0.1", "libdd-trace-stats", "libdd-trace-utils", "rmp-serde", @@ -1098,7 +1100,7 @@ dependencies = [ [[package]] name = "libdd-ddsketch" version = "1.1.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "prost", ] @@ -1106,13 +1108,16 @@ dependencies = [ [[package]] name = "libdd-dogstatsd-client" version = "4.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", + "async-trait", "cadence", "http", - "libdd-common 5.1.0", + "libdd-common 5.1.1", + "libdd-shared-runtime 2.0.0", "serde", + "tokio", "tracing", ] @@ -1123,7 +1128,7 @@ source = "git+https://github.com/DataDog/libdatadog.git?rev=0c6e2a5df2a163d34c4f dependencies = [ "anyhow", "libc", - "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=0c6e2a5df2a163d34c4f385353ffc5d7257c72f4)", + "libdd-trace-protobuf 4.0.0", "memfd", "prost", "rand", @@ -1164,14 +1169,14 @@ dependencies = [ [[package]] name = "libdd-shared-runtime" version = "2.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "async-trait", "futures", "futures-util", - "libdd-capabilities 2.1.0", - "libdd-capabilities-impl 3.0.0", - "libdd-common 5.1.0", + "libdd-capabilities 3.0.0", + "libdd-capabilities-impl 4.0.0", + "libdd-common 5.1.1", "tokio", "tokio-util", "tracing", @@ -1208,7 +1213,7 @@ dependencies = [ [[package]] name = "libdd-telemetry" version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", "async-trait", @@ -1219,12 +1224,14 @@ dependencies = [ "hashbrown 0.15.5", "http", "libc", - "libdd-capabilities 2.1.0", - "libdd-common 5.1.0", + "libdd-capabilities 3.0.0", + "libdd-common 5.1.1", "libdd-ddsketch 1.1.0", "libdd-shared-runtime 2.0.0", "serde", "serde_json", + "strum", + "strum_macros", "sys-info", "tokio", "tokio-util", @@ -1236,30 +1243,30 @@ dependencies = [ [[package]] name = "libdd-tinybytes" -version = "1.1.1" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +version = "1.1.2" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "serde", ] [[package]] name = "libdd-trace-normalization" -version = "3.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +version = "3.0.1" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", - "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", + "libdd-trace-protobuf 4.0.1", ] [[package]] name = "libdd-trace-obfuscation" version = "5.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", "fluent-uri", - "libdd-common 5.1.0", - "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", + "libdd-common 5.1.1", + "libdd-trace-protobuf 4.0.1", "libdd-trace-utils", "log", "percent-encoding", @@ -1279,8 +1286,8 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" -version = "4.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +version = "4.0.1" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "prost", "serde", @@ -1290,7 +1297,7 @@ dependencies = [ [[package]] name = "libdd-trace-stats" version = "6.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", "arc-swap", @@ -1298,15 +1305,15 @@ dependencies = [ "futures", "hashbrown 0.15.5", "http", - "libdd-capabilities 2.1.0", - "libdd-capabilities-impl 3.0.0", - "libdd-common 5.1.0", + "libdd-capabilities 3.0.0", + "libdd-capabilities-impl 4.0.0", + "libdd-common 5.1.1", "libdd-ddsketch 1.1.0", "libdd-dogstatsd-client", "libdd-shared-runtime 2.0.0", "libdd-telemetry 6.0.0", "libdd-trace-obfuscation", - "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", + "libdd-trace-protobuf 4.0.1", "libdd-trace-utils", "rmp-serde", "serde", @@ -1318,8 +1325,8 @@ dependencies = [ [[package]] name = "libdd-trace-utils" -version = "9.0.0" -source = "git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f#3081603d3c74f209be4e3be951f78a1a7469397f" +version = "10.0.0" +source = "git+https://github.com/DataDog/libdatadog.git?rev=1b9b7a26f54f116a0f6525abdcd2013b341921a7#1b9b7a26f54f116a0f6525abdcd2013b341921a7" dependencies = [ "anyhow", "base64", @@ -1332,12 +1339,12 @@ dependencies = [ "http-body-util", "indexmap", "itoa", - "libdd-capabilities 2.1.0", - "libdd-capabilities-impl 3.0.0", - "libdd-common 5.1.0", + "libdd-capabilities 3.0.0", + "libdd-capabilities-impl 4.0.0", + "libdd-common 5.1.1", "libdd-tinybytes", "libdd-trace-normalization", - "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", + "libdd-trace-protobuf 4.0.1", "prost", "rand", "rmp", @@ -1824,11 +1831,11 @@ dependencies = [ "http", "js-sys", "libdatadog-nodejs-capabilities", - "libdd-capabilities 2.1.0", - "libdd-common 5.1.0", + "libdd-capabilities 3.0.0", + "libdd-common 5.1.1", "libdd-data-pipeline", "libdd-shared-runtime 2.0.0", - "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=3081603d3c74f209be4e3be951f78a1a7469397f)", + "libdd-trace-protobuf 4.0.1", "libdd-trace-stats", "libdd-trace-utils", "rmp-serde", @@ -1890,7 +1897,7 @@ version = "0.1.0" dependencies = [ "anyhow", "libdd-library-config", - "libdd-trace-protobuf 4.0.0 (git+https://github.com/DataDog/libdatadog.git?rev=0c6e2a5df2a163d34c4f385353ffc5d7257c72f4)", + "libdd-trace-protobuf 4.0.0", "napi", "napi-derive", ] @@ -2406,6 +2413,25 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + [[package]] name = "subtle" version = "2.6.1" diff --git a/crates/capabilities/Cargo.toml b/crates/capabilities/Cargo.toml index edb40adc..f4b46e6b 100644 --- a/crates/capabilities/Cargo.toml +++ b/crates/capabilities/Cargo.toml @@ -15,7 +15,7 @@ http = "1" bytes = "1.4" futures-core = "0.3" anyhow = "1" -libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f" } +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7" } [dev-dependencies] wasm-bindgen-test = "0.3" diff --git a/crates/capabilities/src/http.rs b/crates/capabilities/src/http.rs index 4248cb30..2ee1bf78 100644 --- a/crates/capabilities/src/http.rs +++ b/crates/capabilities/src/http.rs @@ -59,6 +59,10 @@ impl HttpClientCapability for WasmHttpClient { Self } + fn new_without_connection_pooling() -> Self { + Self + } + #[allow(clippy::manual_async_fn)] fn request( &self, diff --git a/crates/capabilities/src/lib.rs b/crates/capabilities/src/lib.rs index e76a3812..399e9539 100644 --- a/crates/capabilities/src/lib.rs +++ b/crates/capabilities/src/lib.rs @@ -65,6 +65,15 @@ impl HttpClientCapability for WasmCapabilities { Self::new() } + fn new_without_connection_pooling() -> Self { + Self { + http: WasmHttpClient::new_without_connection_pooling(), + sleep: WasmSleepCapability, + file: WasmFileCapability, + env: WasmEnvCapability, + } + } + fn request( &self, req: ::http::Request<::bytes::Bytes>, diff --git a/crates/pipeline/Cargo.toml b/crates/pipeline/Cargo.toml index 8056816e..0d914374 100644 --- a/crates/pipeline/Cargo.toml +++ b/crates/pipeline/Cargo.toml @@ -14,13 +14,13 @@ js-sys = "0.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1" libdatadog-nodejs-capabilities = { path = "../capabilities" } -libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f" } -libdd-common = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } -libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false, features = ["telemetry"] } -libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false, features = ["change-buffer"] } -libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } -libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } -libdd-shared-runtime = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f", default-features = false } +libdd-capabilities = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7" } +libdd-common = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7", default-features = false } +libdd-data-pipeline = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7", default-features = false, features = ["telemetry"] } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7", default-features = false, features = ["change-buffer"] } +libdd-trace-stats = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7", default-features = false } +libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7", default-features = false } +libdd-shared-runtime = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7", default-features = false } rmp-serde = "1" bytes = "1" http = "1" diff --git a/crates/sketches/Cargo.toml b/crates/sketches/Cargo.toml index 6747f461..43d14deb 100644 --- a/crates/sketches/Cargo.toml +++ b/crates/sketches/Cargo.toml @@ -8,7 +8,7 @@ description = "Wasm bindings for Datadog's DDSketch" crate-type = ["cdylib", "rlib"] [dependencies] -libdd-ddsketch = { git = "https://github.com/DataDog/libdatadog.git", rev = "3081603d3c74f209be4e3be951f78a1a7469397f" } +libdd-ddsketch = { git = "https://github.com/DataDog/libdatadog.git", rev = "1b9b7a26f54f116a0f6525abdcd2013b341921a7" } wasm-bindgen = "0.2" [package.metadata.wasm-pack.profile.release] diff --git a/test/pipeline.js b/test/pipeline.js index 59511fef..bd4c8977 100644 --- a/test/pipeline.js +++ b/test/pipeline.js @@ -1154,9 +1154,9 @@ describe('pipeline', { skip }, () => { try { for (let i = 0; i < 15_000; i++) { const span = ns.createSpan() - span.name = 'stats-span' + span.name = `stats-span-${i}` span.service = 'stats-svc' - span.resource = `/stats/${i}` + span.resource = '/stats' span.type = 'web' span.setTag('span.kind', 'server') span.duration = 5_000_000n