feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method - #20188

Closed
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping
Closed

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method#20188
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping

Conversation

@mydea

Copy link
Copy Markdown
Member

Part of #20171

This PR implements a new method in node-core:

registerModuleWrapper<OptionsType>({moduleName: 'express',supportedVersions: ['>=4<6'],
options,patch: (moduleExports,getOptions)=>{wrapExpressModule(moduleExports,getOptions);}});

This works similarly to otel wrapping, registering the patch with IITM and RITM using the same semantics, more or less. It is a bit simplified for our requirements but should generally behave the same.

registerModuleWrapper is designed to be idempotent and to be callable multiple times. It will only actually patch once, calling it subsequently will update the options though - any options required in the patch should be resolved at runtime (!) via the passed-in getOptions. (Why, you may ask yourself? Because we rely on this for preloading OTEL instrumentation, where we run the patch in --import preload.ts or similar but do not have the options yet, which are defined later in init(), but should update the instrumentation config accordingly).

I have tentatively implemented this for the existing express instrumentation. This is def. a breaking change so nothing we can ship now but it should show how this can/should eventually look.

Note that this should not be merged as it is a breaking change and only for showcase & discussion how this can/should work.

@mydeamydea self-assigned this Apr 10, 2026
@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Core

  • Add enableTruncation option to OpenAI integration by andreiborza in #20167
  • Export a reusable function to add tracing headers by JPeer264 in #20076

Other

  • (deps) Bump defu from 6.1.4 to 6.1.6 by dependabot in #20104
  • (node) Implement registerModuleWrapper as alternative IITM/RITM wrapping method by mydea in #20188

Internal Changes 🔧

  • (size-limit) Bump failing size limit scenario by Lms24 in #20186

🤖 This preview updates automatically when you update the PR.

@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser26.3 kB--
@sentry/browser - with treeshaking flags24.78 kB--
@sentry/browser (incl. Tracing)44.17 kB--
@sentry/browser (incl. Tracing + Span Streaming)46.39 kB--
@sentry/browser (incl. Tracing, Profiling)49.14 kB--
@sentry/browser (incl. Tracing, Replay)83.55 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags73.01 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)88.23 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)100.84 kB--
@sentry/browser (incl. Feedback)43.44 kB--
@sentry/browser (incl. sendFeedback)31.11 kB--
@sentry/browser (incl. FeedbackAsync)36.19 kB--
@sentry/browser (incl. Metrics)27.6 kB--
@sentry/browser (incl. Logs)27.73 kB--
@sentry/browser (incl. Metrics & Logs)28.43 kB--
@sentry/react28.04 kB--
@sentry/react (incl. Tracing)46.4 kB--
@sentry/vue31.18 kB--
@sentry/vue (incl. Tracing)46.02 kB--
@sentry/svelte26.32 kB--
CDN Bundle28.91 kB--
CDN Bundle (incl. Tracing)46.94 kB--
CDN Bundle (incl. Logs, Metrics)30.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)48.04 kB--
CDN Bundle (incl. Replay, Logs, Metrics)69.4 kB--
CDN Bundle (incl. Tracing, Replay)84.07 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)85.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)89.89 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)90.99 kB--
CDN Bundle - uncompressed84.88 kB--
CDN Bundle (incl. Tracing) - uncompressed140.44 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed89.08 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed143.9 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed212.99 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed258.24 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed261.69 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed271.94 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed275.38 kB--
@sentry/nextjs (client)48.9 kB--
@sentry/sveltekit (client)44.64 kB--
@sentry/node-core59.13 kB+0.03%+12 B 🔺
⛔️ @sentry/node (max: 176 kB)180.65 kB+5.89%+10.03 kB 🔺
@sentry/node - without tracing97.16 kB+0.01%+6 B 🔺
@sentry/aws-serverless113.98 kB+0.03%+30 B 🔺
@sentry/cloudflare (withSentry) - minified166.9 kB--
@sentry/cloudflare (withSentry)421.79 kB--

View base workflow run

@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 6c2f752 to 9192a07CompareApril 10, 2026 08:38
Comment threadpackages/node-core/src/module-wrapper/singleton.ts Outdated
/* eslint-disable no-param-reassign */

import * as path from 'node:path';
import { Hook } from 'require-in-the-middle';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably we'll also need a version of this for iitm, and also need to pull the relevant guts out for use in Bun, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, wait, nevermind, this is node-core, not core, so no bun stuff. But we do need IITM.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nothing needed for iitm I beleive, I think this takes care of this under the hood - at least, in otel, they only have this functionality for RITM 🤔

isaacs added a commit that referenced this pull request Apr 10, 2026
Update the Express integration to accept the module export and a configuration
function, rather than a configuration object. This is needed to support lazily
calling Sentry.init *after* the module has been instrumented, without re-wrapping
the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 956e1d1 to 066e637CompareMay 5, 2026 13:46
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@mydea

Copy link
Copy Markdown
MemberAuthor

Closed in favor of #20900

@mydeamydea closed this May 21, 2026
@mydea
mydea deleted the fn/custom-iitm-wrapping branch May 21, 2026 11:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@isaacs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method - #20188

Closed
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping
Closed

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method#20188
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping

Conversation

@mydea

Copy link
Copy Markdown
Member

Part of #20171

This PR implements a new method in node-core:

registerModuleWrapper<OptionsType>({moduleName: 'express',supportedVersions: ['>=4<6'],
options,patch: (moduleExports,getOptions)=>{wrapExpressModule(moduleExports,getOptions);}});

This works similarly to otel wrapping, registering the patch with IITM and RITM using the same semantics, more or less. It is a bit simplified for our requirements but should generally behave the same.

registerModuleWrapper is designed to be idempotent and to be callable multiple times. It will only actually patch once, calling it subsequently will update the options though - any options required in the patch should be resolved at runtime (!) via the passed-in getOptions. (Why, you may ask yourself? Because we rely on this for preloading OTEL instrumentation, where we run the patch in --import preload.ts or similar but do not have the options yet, which are defined later in init(), but should update the instrumentation config accordingly).

I have tentatively implemented this for the existing express instrumentation. This is def. a breaking change so nothing we can ship now but it should show how this can/should eventually look.

Note that this should not be merged as it is a breaking change and only for showcase & discussion how this can/should work.

@mydeamydea self-assigned this Apr 10, 2026
@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Core

  • Add enableTruncation option to OpenAI integration by andreiborza in #20167
  • Export a reusable function to add tracing headers by JPeer264 in #20076

Other

  • (deps) Bump defu from 6.1.4 to 6.1.6 by dependabot in #20104
  • (node) Implement registerModuleWrapper as alternative IITM/RITM wrapping method by mydea in #20188

Internal Changes 🔧

  • (size-limit) Bump failing size limit scenario by Lms24 in #20186

🤖 This preview updates automatically when you update the PR.

@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser26.3 kB--
@sentry/browser - with treeshaking flags24.78 kB--
@sentry/browser (incl. Tracing)44.17 kB--
@sentry/browser (incl. Tracing + Span Streaming)46.39 kB--
@sentry/browser (incl. Tracing, Profiling)49.14 kB--
@sentry/browser (incl. Tracing, Replay)83.55 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags73.01 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)88.23 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)100.84 kB--
@sentry/browser (incl. Feedback)43.44 kB--
@sentry/browser (incl. sendFeedback)31.11 kB--
@sentry/browser (incl. FeedbackAsync)36.19 kB--
@sentry/browser (incl. Metrics)27.6 kB--
@sentry/browser (incl. Logs)27.73 kB--
@sentry/browser (incl. Metrics & Logs)28.43 kB--
@sentry/react28.04 kB--
@sentry/react (incl. Tracing)46.4 kB--
@sentry/vue31.18 kB--
@sentry/vue (incl. Tracing)46.02 kB--
@sentry/svelte26.32 kB--
CDN Bundle28.91 kB--
CDN Bundle (incl. Tracing)46.94 kB--
CDN Bundle (incl. Logs, Metrics)30.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)48.04 kB--
CDN Bundle (incl. Replay, Logs, Metrics)69.4 kB--
CDN Bundle (incl. Tracing, Replay)84.07 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)85.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)89.89 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)90.99 kB--
CDN Bundle - uncompressed84.88 kB--
CDN Bundle (incl. Tracing) - uncompressed140.44 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed89.08 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed143.9 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed212.99 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed258.24 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed261.69 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed271.94 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed275.38 kB--
@sentry/nextjs (client)48.9 kB--
@sentry/sveltekit (client)44.64 kB--
@sentry/node-core59.13 kB+0.03%+12 B 🔺
⛔️ @sentry/node (max: 176 kB)180.65 kB+5.89%+10.03 kB 🔺
@sentry/node - without tracing97.16 kB+0.01%+6 B 🔺
@sentry/aws-serverless113.98 kB+0.03%+30 B 🔺
@sentry/cloudflare (withSentry) - minified166.9 kB--
@sentry/cloudflare (withSentry)421.79 kB--

View base workflow run

@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 6c2f752 to 9192a07CompareApril 10, 2026 08:38
Comment threadpackages/node-core/src/module-wrapper/singleton.ts Outdated
/* eslint-disable no-param-reassign */

import * as path from 'node:path';
import { Hook } from 'require-in-the-middle';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably we'll also need a version of this for iitm, and also need to pull the relevant guts out for use in Bun, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, wait, nevermind, this is node-core, not core, so no bun stuff. But we do need IITM.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nothing needed for iitm I beleive, I think this takes care of this under the hood - at least, in otel, they only have this functionality for RITM 🤔

isaacs added a commit that referenced this pull request Apr 10, 2026
Update the Express integration to accept the module export and a configuration
function, rather than a configuration object. This is needed to support lazily
calling Sentry.init *after* the module has been instrumented, without re-wrapping
the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 956e1d1 to 066e637CompareMay 5, 2026 13:46
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@mydea

Copy link
Copy Markdown
MemberAuthor

Closed in favor of #20900

@mydeamydea closed this May 21, 2026
@mydea
mydea deleted the fn/custom-iitm-wrapping branch May 21, 2026 11:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@isaacs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method - #20188

Closed
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping
Closed

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method#20188
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping

Conversation

@mydea

Copy link
Copy Markdown
Member

Part of #20171

This PR implements a new method in node-core:

registerModuleWrapper<OptionsType>({moduleName: 'express',supportedVersions: ['>=4<6'],
options,patch: (moduleExports,getOptions)=>{wrapExpressModule(moduleExports,getOptions);}});

This works similarly to otel wrapping, registering the patch with IITM and RITM using the same semantics, more or less. It is a bit simplified for our requirements but should generally behave the same.

registerModuleWrapper is designed to be idempotent and to be callable multiple times. It will only actually patch once, calling it subsequently will update the options though - any options required in the patch should be resolved at runtime (!) via the passed-in getOptions. (Why, you may ask yourself? Because we rely on this for preloading OTEL instrumentation, where we run the patch in --import preload.ts or similar but do not have the options yet, which are defined later in init(), but should update the instrumentation config accordingly).

I have tentatively implemented this for the existing express instrumentation. This is def. a breaking change so nothing we can ship now but it should show how this can/should eventually look.

Note that this should not be merged as it is a breaking change and only for showcase & discussion how this can/should work.

@mydeamydea self-assigned this Apr 10, 2026
@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Core

  • Add enableTruncation option to OpenAI integration by andreiborza in #20167
  • Export a reusable function to add tracing headers by JPeer264 in #20076

Other

  • (deps) Bump defu from 6.1.4 to 6.1.6 by dependabot in #20104
  • (node) Implement registerModuleWrapper as alternative IITM/RITM wrapping method by mydea in #20188

Internal Changes 🔧

  • (size-limit) Bump failing size limit scenario by Lms24 in #20186

🤖 This preview updates automatically when you update the PR.

@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser26.3 kB--
@sentry/browser - with treeshaking flags24.78 kB--
@sentry/browser (incl. Tracing)44.17 kB--
@sentry/browser (incl. Tracing + Span Streaming)46.39 kB--
@sentry/browser (incl. Tracing, Profiling)49.14 kB--
@sentry/browser (incl. Tracing, Replay)83.55 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags73.01 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)88.23 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)100.84 kB--
@sentry/browser (incl. Feedback)43.44 kB--
@sentry/browser (incl. sendFeedback)31.11 kB--
@sentry/browser (incl. FeedbackAsync)36.19 kB--
@sentry/browser (incl. Metrics)27.6 kB--
@sentry/browser (incl. Logs)27.73 kB--
@sentry/browser (incl. Metrics & Logs)28.43 kB--
@sentry/react28.04 kB--
@sentry/react (incl. Tracing)46.4 kB--
@sentry/vue31.18 kB--
@sentry/vue (incl. Tracing)46.02 kB--
@sentry/svelte26.32 kB--
CDN Bundle28.91 kB--
CDN Bundle (incl. Tracing)46.94 kB--
CDN Bundle (incl. Logs, Metrics)30.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)48.04 kB--
CDN Bundle (incl. Replay, Logs, Metrics)69.4 kB--
CDN Bundle (incl. Tracing, Replay)84.07 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)85.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)89.89 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)90.99 kB--
CDN Bundle - uncompressed84.88 kB--
CDN Bundle (incl. Tracing) - uncompressed140.44 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed89.08 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed143.9 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed212.99 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed258.24 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed261.69 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed271.94 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed275.38 kB--
@sentry/nextjs (client)48.9 kB--
@sentry/sveltekit (client)44.64 kB--
@sentry/node-core59.13 kB+0.03%+12 B 🔺
⛔️ @sentry/node (max: 176 kB)180.65 kB+5.89%+10.03 kB 🔺
@sentry/node - without tracing97.16 kB+0.01%+6 B 🔺
@sentry/aws-serverless113.98 kB+0.03%+30 B 🔺
@sentry/cloudflare (withSentry) - minified166.9 kB--
@sentry/cloudflare (withSentry)421.79 kB--

View base workflow run

@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 6c2f752 to 9192a07CompareApril 10, 2026 08:38
Comment threadpackages/node-core/src/module-wrapper/singleton.ts Outdated
/* eslint-disable no-param-reassign */

import * as path from 'node:path';
import { Hook } from 'require-in-the-middle';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably we'll also need a version of this for iitm, and also need to pull the relevant guts out for use in Bun, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, wait, nevermind, this is node-core, not core, so no bun stuff. But we do need IITM.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nothing needed for iitm I beleive, I think this takes care of this under the hood - at least, in otel, they only have this functionality for RITM 🤔

isaacs added a commit that referenced this pull request Apr 10, 2026
Update the Express integration to accept the module export and a configuration
function, rather than a configuration object. This is needed to support lazily
calling Sentry.init *after* the module has been instrumented, without re-wrapping
the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 956e1d1 to 066e637CompareMay 5, 2026 13:46
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@mydea

Copy link
Copy Markdown
MemberAuthor

Closed in favor of #20900

@mydeamydea closed this May 21, 2026
@mydea
mydea deleted the fn/custom-iitm-wrapping branch May 21, 2026 11:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@isaacs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method - #20188

Closed
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping
Closed

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method#20188
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping

Conversation

@mydea

Copy link
Copy Markdown
Member

Part of #20171

This PR implements a new method in node-core:

registerModuleWrapper<OptionsType>({moduleName: 'express',supportedVersions: ['>=4<6'],
options,patch: (moduleExports,getOptions)=>{wrapExpressModule(moduleExports,getOptions);}});

This works similarly to otel wrapping, registering the patch with IITM and RITM using the same semantics, more or less. It is a bit simplified for our requirements but should generally behave the same.

registerModuleWrapper is designed to be idempotent and to be callable multiple times. It will only actually patch once, calling it subsequently will update the options though - any options required in the patch should be resolved at runtime (!) via the passed-in getOptions. (Why, you may ask yourself? Because we rely on this for preloading OTEL instrumentation, where we run the patch in --import preload.ts or similar but do not have the options yet, which are defined later in init(), but should update the instrumentation config accordingly).

I have tentatively implemented this for the existing express instrumentation. This is def. a breaking change so nothing we can ship now but it should show how this can/should eventually look.

Note that this should not be merged as it is a breaking change and only for showcase & discussion how this can/should work.

@mydeamydea self-assigned this Apr 10, 2026
@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Core

  • Add enableTruncation option to OpenAI integration by andreiborza in #20167
  • Export a reusable function to add tracing headers by JPeer264 in #20076

Other

  • (deps) Bump defu from 6.1.4 to 6.1.6 by dependabot in #20104
  • (node) Implement registerModuleWrapper as alternative IITM/RITM wrapping method by mydea in #20188

Internal Changes 🔧

  • (size-limit) Bump failing size limit scenario by Lms24 in #20186

🤖 This preview updates automatically when you update the PR.

@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser26.3 kB--
@sentry/browser - with treeshaking flags24.78 kB--
@sentry/browser (incl. Tracing)44.17 kB--
@sentry/browser (incl. Tracing + Span Streaming)46.39 kB--
@sentry/browser (incl. Tracing, Profiling)49.14 kB--
@sentry/browser (incl. Tracing, Replay)83.55 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags73.01 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)88.23 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)100.84 kB--
@sentry/browser (incl. Feedback)43.44 kB--
@sentry/browser (incl. sendFeedback)31.11 kB--
@sentry/browser (incl. FeedbackAsync)36.19 kB--
@sentry/browser (incl. Metrics)27.6 kB--
@sentry/browser (incl. Logs)27.73 kB--
@sentry/browser (incl. Metrics & Logs)28.43 kB--
@sentry/react28.04 kB--
@sentry/react (incl. Tracing)46.4 kB--
@sentry/vue31.18 kB--
@sentry/vue (incl. Tracing)46.02 kB--
@sentry/svelte26.32 kB--
CDN Bundle28.91 kB--
CDN Bundle (incl. Tracing)46.94 kB--
CDN Bundle (incl. Logs, Metrics)30.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)48.04 kB--
CDN Bundle (incl. Replay, Logs, Metrics)69.4 kB--
CDN Bundle (incl. Tracing, Replay)84.07 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)85.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)89.89 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)90.99 kB--
CDN Bundle - uncompressed84.88 kB--
CDN Bundle (incl. Tracing) - uncompressed140.44 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed89.08 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed143.9 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed212.99 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed258.24 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed261.69 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed271.94 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed275.38 kB--
@sentry/nextjs (client)48.9 kB--
@sentry/sveltekit (client)44.64 kB--
@sentry/node-core59.13 kB+0.03%+12 B 🔺
⛔️ @sentry/node (max: 176 kB)180.65 kB+5.89%+10.03 kB 🔺
@sentry/node - without tracing97.16 kB+0.01%+6 B 🔺
@sentry/aws-serverless113.98 kB+0.03%+30 B 🔺
@sentry/cloudflare (withSentry) - minified166.9 kB--
@sentry/cloudflare (withSentry)421.79 kB--

View base workflow run

@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 6c2f752 to 9192a07CompareApril 10, 2026 08:38
Comment threadpackages/node-core/src/module-wrapper/singleton.ts Outdated
/* eslint-disable no-param-reassign */

import * as path from 'node:path';
import { Hook } from 'require-in-the-middle';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably we'll also need a version of this for iitm, and also need to pull the relevant guts out for use in Bun, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, wait, nevermind, this is node-core, not core, so no bun stuff. But we do need IITM.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nothing needed for iitm I beleive, I think this takes care of this under the hood - at least, in otel, they only have this functionality for RITM 🤔

isaacs added a commit that referenced this pull request Apr 10, 2026
Update the Express integration to accept the module export and a configuration
function, rather than a configuration object. This is needed to support lazily
calling Sentry.init *after* the module has been instrumented, without re-wrapping
the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 956e1d1 to 066e637CompareMay 5, 2026 13:46
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@mydea

Copy link
Copy Markdown
MemberAuthor

Closed in favor of #20900

@mydeamydea closed this May 21, 2026
@mydea
mydea deleted the fn/custom-iitm-wrapping branch May 21, 2026 11:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@isaacs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method - #20188

Closed
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping
Closed

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method#20188
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping

Conversation

@mydea

Copy link
Copy Markdown
Member

Part of #20171

This PR implements a new method in node-core:

registerModuleWrapper<OptionsType>({moduleName: 'express',supportedVersions: ['>=4<6'],
options,patch: (moduleExports,getOptions)=>{wrapExpressModule(moduleExports,getOptions);}});

This works similarly to otel wrapping, registering the patch with IITM and RITM using the same semantics, more or less. It is a bit simplified for our requirements but should generally behave the same.

registerModuleWrapper is designed to be idempotent and to be callable multiple times. It will only actually patch once, calling it subsequently will update the options though - any options required in the patch should be resolved at runtime (!) via the passed-in getOptions. (Why, you may ask yourself? Because we rely on this for preloading OTEL instrumentation, where we run the patch in --import preload.ts or similar but do not have the options yet, which are defined later in init(), but should update the instrumentation config accordingly).

I have tentatively implemented this for the existing express instrumentation. This is def. a breaking change so nothing we can ship now but it should show how this can/should eventually look.

Note that this should not be merged as it is a breaking change and only for showcase & discussion how this can/should work.

@mydeamydea self-assigned this Apr 10, 2026
@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Core

  • Add enableTruncation option to OpenAI integration by andreiborza in #20167
  • Export a reusable function to add tracing headers by JPeer264 in #20076

Other

  • (deps) Bump defu from 6.1.4 to 6.1.6 by dependabot in #20104
  • (node) Implement registerModuleWrapper as alternative IITM/RITM wrapping method by mydea in #20188

Internal Changes 🔧

  • (size-limit) Bump failing size limit scenario by Lms24 in #20186

🤖 This preview updates automatically when you update the PR.

@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser26.3 kB--
@sentry/browser - with treeshaking flags24.78 kB--
@sentry/browser (incl. Tracing)44.17 kB--
@sentry/browser (incl. Tracing + Span Streaming)46.39 kB--
@sentry/browser (incl. Tracing, Profiling)49.14 kB--
@sentry/browser (incl. Tracing, Replay)83.55 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags73.01 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)88.23 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)100.84 kB--
@sentry/browser (incl. Feedback)43.44 kB--
@sentry/browser (incl. sendFeedback)31.11 kB--
@sentry/browser (incl. FeedbackAsync)36.19 kB--
@sentry/browser (incl. Metrics)27.6 kB--
@sentry/browser (incl. Logs)27.73 kB--
@sentry/browser (incl. Metrics & Logs)28.43 kB--
@sentry/react28.04 kB--
@sentry/react (incl. Tracing)46.4 kB--
@sentry/vue31.18 kB--
@sentry/vue (incl. Tracing)46.02 kB--
@sentry/svelte26.32 kB--
CDN Bundle28.91 kB--
CDN Bundle (incl. Tracing)46.94 kB--
CDN Bundle (incl. Logs, Metrics)30.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)48.04 kB--
CDN Bundle (incl. Replay, Logs, Metrics)69.4 kB--
CDN Bundle (incl. Tracing, Replay)84.07 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)85.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)89.89 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)90.99 kB--
CDN Bundle - uncompressed84.88 kB--
CDN Bundle (incl. Tracing) - uncompressed140.44 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed89.08 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed143.9 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed212.99 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed258.24 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed261.69 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed271.94 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed275.38 kB--
@sentry/nextjs (client)48.9 kB--
@sentry/sveltekit (client)44.64 kB--
@sentry/node-core59.13 kB+0.03%+12 B 🔺
⛔️ @sentry/node (max: 176 kB)180.65 kB+5.89%+10.03 kB 🔺
@sentry/node - without tracing97.16 kB+0.01%+6 B 🔺
@sentry/aws-serverless113.98 kB+0.03%+30 B 🔺
@sentry/cloudflare (withSentry) - minified166.9 kB--
@sentry/cloudflare (withSentry)421.79 kB--

View base workflow run

@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 6c2f752 to 9192a07CompareApril 10, 2026 08:38
Comment threadpackages/node-core/src/module-wrapper/singleton.ts Outdated
/* eslint-disable no-param-reassign */

import * as path from 'node:path';
import { Hook } from 'require-in-the-middle';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably we'll also need a version of this for iitm, and also need to pull the relevant guts out for use in Bun, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, wait, nevermind, this is node-core, not core, so no bun stuff. But we do need IITM.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nothing needed for iitm I beleive, I think this takes care of this under the hood - at least, in otel, they only have this functionality for RITM 🤔

isaacs added a commit that referenced this pull request Apr 10, 2026
Update the Express integration to accept the module export and a configuration
function, rather than a configuration object. This is needed to support lazily
calling Sentry.init *after* the module has been instrumented, without re-wrapping
the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 956e1d1 to 066e637CompareMay 5, 2026 13:46
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@mydea

Copy link
Copy Markdown
MemberAuthor

Closed in favor of #20900

@mydeamydea closed this May 21, 2026
@mydea
mydea deleted the fn/custom-iitm-wrapping branch May 21, 2026 11:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@isaacs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method - #20188

Closed
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping
Closed

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method#20188
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping

Conversation

@mydea

Copy link
Copy Markdown
Member

Part of #20171

This PR implements a new method in node-core:

registerModuleWrapper<OptionsType>({moduleName: 'express',supportedVersions: ['>=4<6'],
options,patch: (moduleExports,getOptions)=>{wrapExpressModule(moduleExports,getOptions);}});

This works similarly to otel wrapping, registering the patch with IITM and RITM using the same semantics, more or less. It is a bit simplified for our requirements but should generally behave the same.

registerModuleWrapper is designed to be idempotent and to be callable multiple times. It will only actually patch once, calling it subsequently will update the options though - any options required in the patch should be resolved at runtime (!) via the passed-in getOptions. (Why, you may ask yourself? Because we rely on this for preloading OTEL instrumentation, where we run the patch in --import preload.ts or similar but do not have the options yet, which are defined later in init(), but should update the instrumentation config accordingly).

I have tentatively implemented this for the existing express instrumentation. This is def. a breaking change so nothing we can ship now but it should show how this can/should eventually look.

Note that this should not be merged as it is a breaking change and only for showcase & discussion how this can/should work.

@mydeamydea self-assigned this Apr 10, 2026
@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Core

  • Add enableTruncation option to OpenAI integration by andreiborza in #20167
  • Export a reusable function to add tracing headers by JPeer264 in #20076

Other

  • (deps) Bump defu from 6.1.4 to 6.1.6 by dependabot in #20104
  • (node) Implement registerModuleWrapper as alternative IITM/RITM wrapping method by mydea in #20188

Internal Changes 🔧

  • (size-limit) Bump failing size limit scenario by Lms24 in #20186

🤖 This preview updates automatically when you update the PR.

@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser26.3 kB--
@sentry/browser - with treeshaking flags24.78 kB--
@sentry/browser (incl. Tracing)44.17 kB--
@sentry/browser (incl. Tracing + Span Streaming)46.39 kB--
@sentry/browser (incl. Tracing, Profiling)49.14 kB--
@sentry/browser (incl. Tracing, Replay)83.55 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags73.01 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)88.23 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)100.84 kB--
@sentry/browser (incl. Feedback)43.44 kB--
@sentry/browser (incl. sendFeedback)31.11 kB--
@sentry/browser (incl. FeedbackAsync)36.19 kB--
@sentry/browser (incl. Metrics)27.6 kB--
@sentry/browser (incl. Logs)27.73 kB--
@sentry/browser (incl. Metrics & Logs)28.43 kB--
@sentry/react28.04 kB--
@sentry/react (incl. Tracing)46.4 kB--
@sentry/vue31.18 kB--
@sentry/vue (incl. Tracing)46.02 kB--
@sentry/svelte26.32 kB--
CDN Bundle28.91 kB--
CDN Bundle (incl. Tracing)46.94 kB--
CDN Bundle (incl. Logs, Metrics)30.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)48.04 kB--
CDN Bundle (incl. Replay, Logs, Metrics)69.4 kB--
CDN Bundle (incl. Tracing, Replay)84.07 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)85.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)89.89 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)90.99 kB--
CDN Bundle - uncompressed84.88 kB--
CDN Bundle (incl. Tracing) - uncompressed140.44 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed89.08 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed143.9 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed212.99 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed258.24 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed261.69 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed271.94 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed275.38 kB--
@sentry/nextjs (client)48.9 kB--
@sentry/sveltekit (client)44.64 kB--
@sentry/node-core59.13 kB+0.03%+12 B 🔺
⛔️ @sentry/node (max: 176 kB)180.65 kB+5.89%+10.03 kB 🔺
@sentry/node - without tracing97.16 kB+0.01%+6 B 🔺
@sentry/aws-serverless113.98 kB+0.03%+30 B 🔺
@sentry/cloudflare (withSentry) - minified166.9 kB--
@sentry/cloudflare (withSentry)421.79 kB--

View base workflow run

@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 6c2f752 to 9192a07CompareApril 10, 2026 08:38
Comment threadpackages/node-core/src/module-wrapper/singleton.ts Outdated
/* eslint-disable no-param-reassign */

import * as path from 'node:path';
import { Hook } from 'require-in-the-middle';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably we'll also need a version of this for iitm, and also need to pull the relevant guts out for use in Bun, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, wait, nevermind, this is node-core, not core, so no bun stuff. But we do need IITM.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nothing needed for iitm I beleive, I think this takes care of this under the hood - at least, in otel, they only have this functionality for RITM 🤔

isaacs added a commit that referenced this pull request Apr 10, 2026
Update the Express integration to accept the module export and a configuration
function, rather than a configuration object. This is needed to support lazily
calling Sentry.init *after* the module has been instrumented, without re-wrapping
the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 956e1d1 to 066e637CompareMay 5, 2026 13:46
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@mydea

Copy link
Copy Markdown
MemberAuthor

Closed in favor of #20900

@mydeamydea closed this May 21, 2026
@mydea
mydea deleted the fn/custom-iitm-wrapping branch May 21, 2026 11:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@isaacs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method - #20188

Closed
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping
Closed

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method#20188
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping

Conversation

@mydea

Copy link
Copy Markdown
Member

Part of #20171

This PR implements a new method in node-core:

registerModuleWrapper<OptionsType>({moduleName: 'express',supportedVersions: ['>=4<6'],
options,patch: (moduleExports,getOptions)=>{wrapExpressModule(moduleExports,getOptions);}});

This works similarly to otel wrapping, registering the patch with IITM and RITM using the same semantics, more or less. It is a bit simplified for our requirements but should generally behave the same.

registerModuleWrapper is designed to be idempotent and to be callable multiple times. It will only actually patch once, calling it subsequently will update the options though - any options required in the patch should be resolved at runtime (!) via the passed-in getOptions. (Why, you may ask yourself? Because we rely on this for preloading OTEL instrumentation, where we run the patch in --import preload.ts or similar but do not have the options yet, which are defined later in init(), but should update the instrumentation config accordingly).

I have tentatively implemented this for the existing express instrumentation. This is def. a breaking change so nothing we can ship now but it should show how this can/should eventually look.

Note that this should not be merged as it is a breaking change and only for showcase & discussion how this can/should work.

@mydeamydea self-assigned this Apr 10, 2026
@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Core

  • Add enableTruncation option to OpenAI integration by andreiborza in #20167
  • Export a reusable function to add tracing headers by JPeer264 in #20076

Other

  • (deps) Bump defu from 6.1.4 to 6.1.6 by dependabot in #20104
  • (node) Implement registerModuleWrapper as alternative IITM/RITM wrapping method by mydea in #20188

Internal Changes 🔧

  • (size-limit) Bump failing size limit scenario by Lms24 in #20186

🤖 This preview updates automatically when you update the PR.

@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser26.3 kB--
@sentry/browser - with treeshaking flags24.78 kB--
@sentry/browser (incl. Tracing)44.17 kB--
@sentry/browser (incl. Tracing + Span Streaming)46.39 kB--
@sentry/browser (incl. Tracing, Profiling)49.14 kB--
@sentry/browser (incl. Tracing, Replay)83.55 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags73.01 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)88.23 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)100.84 kB--
@sentry/browser (incl. Feedback)43.44 kB--
@sentry/browser (incl. sendFeedback)31.11 kB--
@sentry/browser (incl. FeedbackAsync)36.19 kB--
@sentry/browser (incl. Metrics)27.6 kB--
@sentry/browser (incl. Logs)27.73 kB--
@sentry/browser (incl. Metrics & Logs)28.43 kB--
@sentry/react28.04 kB--
@sentry/react (incl. Tracing)46.4 kB--
@sentry/vue31.18 kB--
@sentry/vue (incl. Tracing)46.02 kB--
@sentry/svelte26.32 kB--
CDN Bundle28.91 kB--
CDN Bundle (incl. Tracing)46.94 kB--
CDN Bundle (incl. Logs, Metrics)30.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)48.04 kB--
CDN Bundle (incl. Replay, Logs, Metrics)69.4 kB--
CDN Bundle (incl. Tracing, Replay)84.07 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)85.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)89.89 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)90.99 kB--
CDN Bundle - uncompressed84.88 kB--
CDN Bundle (incl. Tracing) - uncompressed140.44 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed89.08 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed143.9 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed212.99 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed258.24 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed261.69 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed271.94 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed275.38 kB--
@sentry/nextjs (client)48.9 kB--
@sentry/sveltekit (client)44.64 kB--
@sentry/node-core59.13 kB+0.03%+12 B 🔺
⛔️ @sentry/node (max: 176 kB)180.65 kB+5.89%+10.03 kB 🔺
@sentry/node - without tracing97.16 kB+0.01%+6 B 🔺
@sentry/aws-serverless113.98 kB+0.03%+30 B 🔺
@sentry/cloudflare (withSentry) - minified166.9 kB--
@sentry/cloudflare (withSentry)421.79 kB--

View base workflow run

@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 6c2f752 to 9192a07CompareApril 10, 2026 08:38
Comment threadpackages/node-core/src/module-wrapper/singleton.ts Outdated
/* eslint-disable no-param-reassign */

import * as path from 'node:path';
import { Hook } from 'require-in-the-middle';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably we'll also need a version of this for iitm, and also need to pull the relevant guts out for use in Bun, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, wait, nevermind, this is node-core, not core, so no bun stuff. But we do need IITM.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nothing needed for iitm I beleive, I think this takes care of this under the hood - at least, in otel, they only have this functionality for RITM 🤔

isaacs added a commit that referenced this pull request Apr 10, 2026
Update the Express integration to accept the module export and a configuration
function, rather than a configuration object. This is needed to support lazily
calling Sentry.init *after* the module has been instrumented, without re-wrapping
the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 956e1d1 to 066e637CompareMay 5, 2026 13:46
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@mydea

Copy link
Copy Markdown
MemberAuthor

Closed in favor of #20900

@mydeamydea closed this May 21, 2026
@mydea
mydea deleted the fn/custom-iitm-wrapping branch May 21, 2026 11:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@isaacs
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method - #20188

Closed
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping
Closed

feat(node): Implement registerModuleWrapper as alternative IITM/RITM wrapping method#20188
mydea wants to merge 2 commits into
developfrom
fn/custom-iitm-wrapping

Conversation

@mydea

Copy link
Copy Markdown
Member

Part of #20171

This PR implements a new method in node-core:

registerModuleWrapper<OptionsType>({moduleName: 'express',supportedVersions: ['>=4<6'],
options,patch: (moduleExports,getOptions)=>{wrapExpressModule(moduleExports,getOptions);}});

This works similarly to otel wrapping, registering the patch with IITM and RITM using the same semantics, more or less. It is a bit simplified for our requirements but should generally behave the same.

registerModuleWrapper is designed to be idempotent and to be callable multiple times. It will only actually patch once, calling it subsequently will update the options though - any options required in the patch should be resolved at runtime (!) via the passed-in getOptions. (Why, you may ask yourself? Because we rely on this for preloading OTEL instrumentation, where we run the patch in --import preload.ts or similar but do not have the options yet, which are defined later in init(), but should update the instrumentation config accordingly).

I have tentatively implemented this for the existing express instrumentation. This is def. a breaking change so nothing we can ship now but it should show how this can/should eventually look.

Note that this should not be merged as it is a breaking change and only for showcase & discussion how this can/should work.

@mydeamydea self-assigned this Apr 10, 2026
@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

🟡 Minor (new features)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

Core

  • Add enableTruncation option to OpenAI integration by andreiborza in #20167
  • Export a reusable function to add tracing headers by JPeer264 in #20076

Other

  • (deps) Bump defu from 6.1.4 to 6.1.6 by dependabot in #20104
  • (node) Implement registerModuleWrapper as alternative IITM/RITM wrapping method by mydea in #20188

Internal Changes 🔧

  • (size-limit) Bump failing size limit scenario by Lms24 in #20186

🤖 This preview updates automatically when you update the PR.

@github-actions

github-actionsBot commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

⚠️Warning: Base artifact is not the latest one, because the latest workflow run is not done yet. This may lead to incorrect results. Try to re-run all tests to get up to date results.

PathSize% ChangeChange
@sentry/browser26.3 kB--
@sentry/browser - with treeshaking flags24.78 kB--
@sentry/browser (incl. Tracing)44.17 kB--
@sentry/browser (incl. Tracing + Span Streaming)46.39 kB--
@sentry/browser (incl. Tracing, Profiling)49.14 kB--
@sentry/browser (incl. Tracing, Replay)83.55 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags73.01 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)88.23 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)100.84 kB--
@sentry/browser (incl. Feedback)43.44 kB--
@sentry/browser (incl. sendFeedback)31.11 kB--
@sentry/browser (incl. FeedbackAsync)36.19 kB--
@sentry/browser (incl. Metrics)27.6 kB--
@sentry/browser (incl. Logs)27.73 kB--
@sentry/browser (incl. Metrics & Logs)28.43 kB--
@sentry/react28.04 kB--
@sentry/react (incl. Tracing)46.4 kB--
@sentry/vue31.18 kB--
@sentry/vue (incl. Tracing)46.02 kB--
@sentry/svelte26.32 kB--
CDN Bundle28.91 kB--
CDN Bundle (incl. Tracing)46.94 kB--
CDN Bundle (incl. Logs, Metrics)30.33 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)48.04 kB--
CDN Bundle (incl. Replay, Logs, Metrics)69.4 kB--
CDN Bundle (incl. Tracing, Replay)84.07 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)85.15 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)89.89 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)90.99 kB--
CDN Bundle - uncompressed84.88 kB--
CDN Bundle (incl. Tracing) - uncompressed140.44 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed89.08 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed143.9 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed212.99 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed258.24 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed261.69 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed271.94 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed275.38 kB--
@sentry/nextjs (client)48.9 kB--
@sentry/sveltekit (client)44.64 kB--
@sentry/node-core59.13 kB+0.03%+12 B 🔺
⛔️ @sentry/node (max: 176 kB)180.65 kB+5.89%+10.03 kB 🔺
@sentry/node - without tracing97.16 kB+0.01%+6 B 🔺
@sentry/aws-serverless113.98 kB+0.03%+30 B 🔺
@sentry/cloudflare (withSentry) - minified166.9 kB--
@sentry/cloudflare (withSentry)421.79 kB--

View base workflow run

@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 6c2f752 to 9192a07CompareApril 10, 2026 08:38
Comment threadpackages/node-core/src/module-wrapper/singleton.ts Outdated
/* eslint-disable no-param-reassign */

import * as path from 'node:path';
import { Hook } from 'require-in-the-middle';

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Presumably we'll also need a version of this for iitm, and also need to pull the relevant guts out for use in Bun, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, wait, nevermind, this is node-core, not core, so no bun stuff. But we do need IITM.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nothing needed for iitm I beleive, I think this takes care of this under the hood - at least, in otel, they only have this functionality for RITM 🤔

isaacs added a commit that referenced this pull request Apr 10, 2026
Update the Express integration to accept the module export and a configuration
function, rather than a configuration object. This is needed to support lazily
calling Sentry.init *after* the module has been instrumented, without re-wrapping
the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
isaacs added a commit that referenced this pull request Apr 13, 2026
Update the Express integration to accept the module export and a
configuration function, rather than a configuration object. This is
needed to support lazily calling Sentry.init *after* the module has been
instrumented, without re-wrapping the methods to get the new config.
via: @mydea in #20188
@mydea
mydeaforce-pushed the fn/custom-iitm-wrapping branch from 956e1d1 to 066e637CompareMay 5, 2026 13:46
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@getsentrygetsentry deleted a comment from github-actionsBotMay 5, 2026
@mydea

Copy link
Copy Markdown
MemberAuthor

Closed in favor of #20900

@mydeamydea closed this May 21, 2026
@mydea
mydea deleted the fn/custom-iitm-wrapping branch May 21, 2026 11:46
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@mydea@isaacs