diff --git a/bun.lock b/bun.lock index 76ba3323..13d0b714 100644 --- a/bun.lock +++ b/bun.lock @@ -7,9 +7,9 @@ "devDependencies": { "@biomejs/biome": "2.3.8", "@sentry/api": "^0.1.0", - "@sentry/bun": "10.38.0", + "@sentry/bun": "10.39.0", "@sentry/esbuild-plugin": "^2.23.0", - "@sentry/node": "10.38.0", + "@sentry/node": "10.39.0", "@stricli/auto-complete": "^1.2.4", "@stricli/core": "^1.2.4", "@types/bun": "latest", @@ -34,7 +34,6 @@ }, "patchedDependencies": { "@stricli/core@1.2.5": "patches/@stricli%2Fcore@1.2.5.patch", - "@sentry/core@10.38.0": "patches/@sentry%2Fcore@10.38.0.patch", }, "packages": { "@apm-js-collab/code-transformer": ["@apm-js-collab/code-transformer@0.8.2", "", {}, "sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA=="], @@ -231,7 +230,7 @@ "@sentry/babel-plugin-component-annotate": ["@sentry/babel-plugin-component-annotate@2.23.1", "", {}, "sha512-l1z8AvI6k9I+2z49OgvP3SlzB1M0Lw24KtceiJibNaSyQwxsItoT9/XftZ/8BBtkosVmNOTQhL1eUsSkuSv1LA=="], - "@sentry/bun": ["@sentry/bun@10.38.0", "", { "dependencies": { "@sentry/core": "10.38.0", "@sentry/node": "10.38.0" } }, "sha512-8a2s+FVeqI2l12RNMFFEjAXpAUkqNZeGXTvHtjzcyWASW9szBNhOpiKN8oy0R/wUeIWgHpdnUeOSBhVKzH5YfQ=="], + "@sentry/bun": ["@sentry/bun@10.39.0", "", { "dependencies": { "@sentry/core": "10.39.0", "@sentry/node": "10.39.0" } }, "sha512-AiW21LEMuRVqeRRiXy2UM3xjegJZ3d/XJSjwpS6rETw4hrfRX2yGTmz2NAsIsVAqNh2MmXoeOioaiMMbEHqswg=="], "@sentry/bundler-plugin-core": ["@sentry/bundler-plugin-core@2.23.1", "", { "dependencies": { "@babel/core": "^7.18.5", "@sentry/babel-plugin-component-annotate": "2.23.1", "@sentry/cli": "2.39.1", "dotenv": "^16.3.1", "find-up": "^5.0.0", "glob": "^9.3.2", "magic-string": "0.30.8", "unplugin": "1.0.1" } }, "sha512-JA6utNiwMKv6Jfj0Hmk0DI/XUizSHg7HhhkFETKhRlYEhZAdkyz1atDBg0ncKNgRBKyHeSYWcMFtUyo26VB76w=="], @@ -251,15 +250,15 @@ "@sentry/cli-win32-x64": ["@sentry/cli-win32-x64@2.39.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xv0R2CMf/X1Fte3cMWie1NXuHmUyQPDBfCyIt6k6RPFPxAYUgcqgMPznYwVMwWEA1W43PaOkSn3d8ZylsDaETw=="], - "@sentry/core": ["@sentry/core@10.38.0", "", {}, "sha512-1pubWDZE5y5HZEPMAZERP4fVl2NH3Ihp1A+vMoVkb3Qc66Diqj1WierAnStlZP7tCx0TBa0dK85GTW/ZFYyB9g=="], + "@sentry/core": ["@sentry/core@10.39.0", "", {}, "sha512-xCLip2mBwCdRrvXHtVEULX0NffUTYZZBhEUGht0WFL+GNdNQ7gmBOGOczhZlrf2hgFFtDO0fs1xiP9bqq5orEQ=="], "@sentry/esbuild-plugin": ["@sentry/esbuild-plugin@2.23.1", "", { "dependencies": { "@sentry/bundler-plugin-core": "2.23.1", "unplugin": "1.0.1", "uuid": "^9.0.0" } }, "sha512-iGJRYbqhTokR7AMM5phA/z47141Mh5lhWeb60mmNlFvDky4cTISs2l8rtgu1GSARbzskVaA3NW16DIagX7OddA=="], - "@sentry/node": ["@sentry/node@10.38.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.5.0", "@opentelemetry/core": "^2.5.0", "@opentelemetry/instrumentation": "^0.211.0", "@opentelemetry/instrumentation-amqplib": "0.58.0", "@opentelemetry/instrumentation-connect": "0.54.0", "@opentelemetry/instrumentation-dataloader": "0.28.0", "@opentelemetry/instrumentation-express": "0.59.0", "@opentelemetry/instrumentation-fs": "0.30.0", "@opentelemetry/instrumentation-generic-pool": "0.54.0", "@opentelemetry/instrumentation-graphql": "0.58.0", "@opentelemetry/instrumentation-hapi": "0.57.0", "@opentelemetry/instrumentation-http": "0.211.0", "@opentelemetry/instrumentation-ioredis": "0.59.0", "@opentelemetry/instrumentation-kafkajs": "0.20.0", "@opentelemetry/instrumentation-knex": "0.55.0", "@opentelemetry/instrumentation-koa": "0.59.0", "@opentelemetry/instrumentation-lru-memoizer": "0.55.0", "@opentelemetry/instrumentation-mongodb": "0.64.0", "@opentelemetry/instrumentation-mongoose": "0.57.0", "@opentelemetry/instrumentation-mysql": "0.57.0", "@opentelemetry/instrumentation-mysql2": "0.57.0", "@opentelemetry/instrumentation-pg": "0.63.0", "@opentelemetry/instrumentation-redis": "0.59.0", "@opentelemetry/instrumentation-tedious": "0.30.0", "@opentelemetry/instrumentation-undici": "0.21.0", "@opentelemetry/resources": "^2.5.0", "@opentelemetry/sdk-trace-base": "^2.5.0", "@opentelemetry/semantic-conventions": "^1.39.0", "@prisma/instrumentation": "7.2.0", "@sentry/core": "10.38.0", "@sentry/node-core": "10.38.0", "@sentry/opentelemetry": "10.38.0", "import-in-the-middle": "^2.0.6", "minimatch": "^9.0.0" } }, "sha512-wriyDtWDAoatn8EhOj0U4PJR1WufiijTsCGALqakOHbFiadtBJANLe6aSkXoXT4tegw59cz1wY4NlzHjYksaPw=="], + "@sentry/node": ["@sentry/node@10.39.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^2.5.0", "@opentelemetry/core": "^2.5.0", "@opentelemetry/instrumentation": "^0.211.0", "@opentelemetry/instrumentation-amqplib": "0.58.0", "@opentelemetry/instrumentation-connect": "0.54.0", "@opentelemetry/instrumentation-dataloader": "0.28.0", "@opentelemetry/instrumentation-express": "0.59.0", "@opentelemetry/instrumentation-fs": "0.30.0", "@opentelemetry/instrumentation-generic-pool": "0.54.0", "@opentelemetry/instrumentation-graphql": "0.58.0", "@opentelemetry/instrumentation-hapi": "0.57.0", "@opentelemetry/instrumentation-http": "0.211.0", "@opentelemetry/instrumentation-ioredis": "0.59.0", "@opentelemetry/instrumentation-kafkajs": "0.20.0", "@opentelemetry/instrumentation-knex": "0.55.0", "@opentelemetry/instrumentation-koa": "0.59.0", "@opentelemetry/instrumentation-lru-memoizer": "0.55.0", "@opentelemetry/instrumentation-mongodb": "0.64.0", "@opentelemetry/instrumentation-mongoose": "0.57.0", "@opentelemetry/instrumentation-mysql": "0.57.0", "@opentelemetry/instrumentation-mysql2": "0.57.0", "@opentelemetry/instrumentation-pg": "0.63.0", "@opentelemetry/instrumentation-redis": "0.59.0", "@opentelemetry/instrumentation-tedious": "0.30.0", "@opentelemetry/instrumentation-undici": "0.21.0", "@opentelemetry/resources": "^2.5.0", "@opentelemetry/sdk-trace-base": "^2.5.0", "@opentelemetry/semantic-conventions": "^1.39.0", "@prisma/instrumentation": "7.2.0", "@sentry/core": "10.39.0", "@sentry/node-core": "10.39.0", "@sentry/opentelemetry": "10.39.0", "import-in-the-middle": "^2.0.6", "minimatch": "^9.0.0" } }, "sha512-dx66DtU/xkCTPEDsjU+mYSIEbzu06pzKNQcDA2wvx7wvwsUciZ5yA32Ce/o6p2uHHgy0/joJX9rP5J/BIijaOA=="], - "@sentry/node-core": ["@sentry/node-core@10.38.0", "", { "dependencies": { "@apm-js-collab/tracing-hooks": "^0.3.1", "@sentry/core": "10.38.0", "@sentry/opentelemetry": "10.38.0", "import-in-the-middle": "^2.0.6" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0", "@opentelemetry/instrumentation": ">=0.57.1 <1", "@opentelemetry/resources": "^1.30.1 || ^2.1.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", "@opentelemetry/semantic-conventions": "^1.39.0" } }, "sha512-ErXtpedrY1HghgwM6AliilZPcUCoNNP1NThdO4YpeMq04wMX9/GMmFCu46TnCcg6b7IFIOSr2S4yD086PxLlHQ=="], + "@sentry/node-core": ["@sentry/node-core@10.39.0", "", { "dependencies": { "@apm-js-collab/tracing-hooks": "^0.3.1", "@sentry/core": "10.39.0", "@sentry/opentelemetry": "10.39.0", "import-in-the-middle": "^2.0.6" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0", "@opentelemetry/instrumentation": ">=0.57.1 <1", "@opentelemetry/resources": "^1.30.1 || ^2.1.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", "@opentelemetry/semantic-conventions": "^1.39.0" }, "optionalPeers": ["@opentelemetry/api", "@opentelemetry/context-async-hooks", "@opentelemetry/core", "@opentelemetry/instrumentation", "@opentelemetry/resources", "@opentelemetry/sdk-trace-base", "@opentelemetry/semantic-conventions"] }, "sha512-xdeBG00TmtAcGvXnZNbqOCvnZ5kY3s5aT/L8wUQ0w0TT2KmrC9XL/7UHUfJ45TLbjl10kZOtaMQXgUjpwSJW+g=="], - "@sentry/opentelemetry": ["@sentry/opentelemetry@10.38.0", "", { "dependencies": { "@sentry/core": "10.38.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", "@opentelemetry/semantic-conventions": "^1.39.0" } }, "sha512-YPVhWfYmC7nD3EJqEHGtjp4fp5LwtAbE5rt9egQ4hqJlYFvr8YEz9sdoqSZxO0cZzgs2v97HFl/nmWAXe52G2Q=="], + "@sentry/opentelemetry": ["@sentry/opentelemetry@10.39.0", "", { "dependencies": { "@sentry/core": "10.39.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.1.0", "@opentelemetry/core": "^1.30.1 || ^2.1.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", "@opentelemetry/semantic-conventions": "^1.39.0" } }, "sha512-eU8t/pyxjy7xYt6PNCVxT+8SJw5E3pnupdcUNN4ClqG4O5lX4QCDLtId48ki7i30VqrLtR7vmCHMSvqXXdvXPA=="], "@stricli/auto-complete": ["@stricli/auto-complete@1.2.5", "", { "dependencies": { "@stricli/core": "^1.2.5" }, "bin": { "auto-complete": "dist/bin/cli.js" } }, "sha512-C6G88Hh4lUWBwiqsxbcA4I1ricSQwiLaOziTWW3NmBoX7WGTW7i7RvyooXMpZk1YMLf2olv5Odxmg127ik1DKQ=="], diff --git a/package.json b/package.json index 7a34e65a..bf5dfade 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,9 @@ "devDependencies": { "@biomejs/biome": "2.3.8", "@sentry/api": "^0.1.0", - "@sentry/bun": "10.38.0", + "@sentry/bun": "10.39.0", "@sentry/esbuild-plugin": "^2.23.0", - "@sentry/node": "10.38.0", + "@sentry/node": "10.39.0", "@stricli/auto-complete": "^1.2.4", "@stricli/core": "^1.2.4", "@types/bun": "latest", @@ -62,7 +62,6 @@ }, "packageManager": "bun@1.3.9", "patchedDependencies": { - "@stricli/core@1.2.5": "patches/@stricli%2Fcore@1.2.5.patch", - "@sentry/core@10.38.0": "patches/@sentry%2Fcore@10.38.0.patch" + "@stricli/core@1.2.5": "patches/@stricli%2Fcore@1.2.5.patch" } } diff --git a/patches/@sentry%2Fcore@10.38.0.patch b/patches/@sentry%2Fcore@10.38.0.patch deleted file mode 100644 index 075c4987..00000000 --- a/patches/@sentry%2Fcore@10.38.0.patch +++ /dev/null @@ -1,91 +0,0 @@ -diff --git a/node_modules/@sentry/core/.bun-tag-3268c2da6ddf3847 b/.bun-tag-3268c2da6ddf3847 -new file mode 100644 -index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 -diff --git a/build/cjs/client.js b/build/cjs/client.js -index 492d897927b0a791e0dac10647274e92053ac985..79795fd82d36f419afcb0bb4059ef02b2c525711 100644 ---- a/build/cjs/client.js -+++ b/build/cjs/client.js -@@ -108,7 +108,7 @@ function setupWeightBasedFlushing - flushFn(client); - // Note: isTimerActive is reset by the flushHook handler above, not here, - // to avoid race conditions when new items arrive during the flush. -- }, DEFAULT_FLUSH_INTERVAL); -+ }, DEFAULT_FLUSH_INTERVAL); if (typeof flushTimeout !== 'number' && flushTimeout.unref) flushTimeout.unref(); - } - }); - -@@ -645,11 +645,16 @@ class Client { - * `false` otherwise - */ - async _isClientDoneProcessing(timeout) { -+ // Check immediately first - no need to wait if nothing is processing -+ if (!this._numProcessing) { -+ return true; -+ } -+ - let ticked = 0; - - // if no timeout is provided, we wait "forever" until everything is processed - while (!timeout || ticked < timeout) { -- await new Promise(resolve => setTimeout(resolve, 1)); -+ await new Promise(resolve => { const t = setTimeout(resolve, 1); if (typeof t !== 'number' && t.unref) t.unref(); }); - - if (!this._numProcessing) { - return true; -diff --git a/build/cjs/utils/promisebuffer.js b/build/cjs/utils/promisebuffer.js -index 6413b77ec339af98b608c4609fc9462d9a8e967d..85a9af7221cfabcfe5c65df2f4ece5a294d34e61 100644 ---- a/build/cjs/utils/promisebuffer.js -+++ b/build/cjs/utils/promisebuffer.js -@@ -71,7 +71,7 @@ function makePromiseBuffer(limit = 100) { - return drainPromise; - } - -- const promises = [drainPromise, new Promise(resolve => setTimeout(() => resolve(false), timeout))]; -+ const promises = [drainPromise, new Promise(resolve => { const t = setTimeout(() => resolve(false), timeout); if (typeof t !== 'number' && t.unref) t.unref(); })]; - - // Promise.race will resolve to the first promise that resolves or rejects - // So if the drainPromise resolves, the timeout promise will be ignored -diff --git a/build/esm/client.js b/build/esm/client.js -index bcc614aa8485bd110abc51149370bbf114ac9e54..b98a1e07b0a7c43602105738b8afb38ee1e3db15 100644 ---- a/build/esm/client.js -+++ b/build/esm/client.js -@@ -106,7 +106,7 @@ function setupWeightBasedFlushing - flushFn(client); - // Note: isTimerActive is reset by the flushHook handler above, not here, - // to avoid race conditions when new items arrive during the flush. -- }, DEFAULT_FLUSH_INTERVAL); -+ }, DEFAULT_FLUSH_INTERVAL); if (typeof flushTimeout !== 'number' && flushTimeout.unref) flushTimeout.unref(); - } - }); - -@@ -643,11 +643,16 @@ class Client { - * `false` otherwise - */ - async _isClientDoneProcessing(timeout) { -+ // Check immediately first - no need to wait if nothing is processing -+ if (!this._numProcessing) { -+ return true; -+ } -+ - let ticked = 0; - - // if no timeout is provided, we wait "forever" until everything is processed - while (!timeout || ticked < timeout) { -- await new Promise(resolve => setTimeout(resolve, 1)); -+ await new Promise(resolve => { const t = setTimeout(resolve, 1); if (typeof t !== 'number' && t.unref) t.unref(); }); - - if (!this._numProcessing) { - return true; -diff --git a/build/esm/utils/promisebuffer.js b/build/esm/utils/promisebuffer.js -index b8111cf976c8338db28b5e9ff111870864b584cb..458ea7ccb0a2704df1c2c2ec5fb303cff37dc941 100644 ---- a/build/esm/utils/promisebuffer.js -+++ b/build/esm/utils/promisebuffer.js -@@ -69,7 +69,7 @@ function makePromiseBuffer(limit = 100) { - return drainPromise; - } - -- const promises = [drainPromise, new Promise(resolve => setTimeout(() => resolve(false), timeout))]; -+ const promises = [drainPromise, new Promise(resolve => { const t = setTimeout(() => resolve(false), timeout); if (typeof t !== 'number' && t.unref) t.unref(); })]; - - // Promise.race will resolve to the first promise that resolves or rejects - // So if the drainPromise resolves, the timeout promise will be ignored diff --git a/src/lib/telemetry.ts b/src/lib/telemetry.ts index bc16a016..cb4a012a 100644 --- a/src/lib/telemetry.ts +++ b/src/lib/telemetry.ts @@ -214,21 +214,6 @@ export function initSentry(enabled: boolean): Sentry.BunClient | undefined { const isBun = typeof process.versions.bun !== "undefined"; const runtime = isBun ? "bun" : "node"; - // Fix runtime context: @sentry/bun v10 delegates to @sentry/node's NodeClient, - // which always overrides runtime to { name: 'node', version: process.version }. - // Under Bun, process.version returns the Node.js compat version (e.g. v24.3.0), - // not the Bun version. Override it so event.contexts.runtime is correct and - // Sentry's server-side tag promotion creates an accurate 'runtime' tag. - // TODO: Remove once fixed upstream: https://github.com/getsentry/sentry-javascript/issues/19269 - if (isBun) { - // biome-ignore lint/suspicious/noExplicitAny: accessing internal SDK option not exposed in NodeClientOptions - const options = client.getOptions() as any; - options.runtime = { - name: "bun", - version: process.versions.bun as string, - }; - } - // Tag whether running as bun binary or node (npm package). // Kept alongside the SDK's promoted 'runtime' tag for explicit signaling // and backward compatibility with existing dashboards/alerts.