Skip to content

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR - #126830

Merged
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js
Apr 17, 2026
Merged

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR#126830
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

Ports the EventPipe (EP) diagnostic server TypeScript implementation from the Mono.

This is just the JavaScript part split from #126324 for easier review.
(it doesn't work end to end yet)

Changes

New files — Diagnostic server (TypeScript)

These files under src/native/libs/System.Native.Browser/diagnostics/ implement the diagnostic server protocol and built-in diagnostic commands for the CoreCLR path:

  • client-commands.ts — IPC protocol serialization: EventPipe commands (CollectTracing2, StopTracing), process commands (ResumeRuntime, ProcessInfo3), GC heap dump, counters, and sample profiler command builders.
  • common.tsDiagnosticConnectionBase class with send/receive message buffering and heap memory read/write. downloadBlob() helper for trace file downloads.
  • diagnostic-server.ts — Core socket management: ds_rt_websocket_create/send/poll/recv/close functions that the C runtime calls via the cross-module exchange. Routes connections to either JS-based or WebSocket-based transports. connectDSRouter() for switching to dotnet-dsrouter. initializeDS() for startup configuration.
  • diagnostic-server-js.ts — In-browser JS diagnostic client: handles the IPC advert/response/data protocol without a WebSocket, supports scenario-based auto-start (js://gcdump, js://counters, js://cpu-samples) and custom globalThis.dotnetDiagnosticClient providers.
  • diagnostic-server-ws.ts — WebSocket transport for connecting to external tools via dotnet-dsrouter.
  • dotnet-gcdump.tscollectGcDump() — triggers a GC heap dump trace collection.
  • dotnet-counters.tscollectMetrics() — collects System.Runtime counters for a configurable duration.
  • dotnet-cpu-profiler.tscollectCpuSamples() — collects CPU sample profiling traces.
  • types.ts — Protocol enums (CommandSetId, EventPipeCommandId, Keywords, etc.) and interfaces (IDiagnosticConnection, IDiagnosticSession, IDiagnosticClient).

New files — Native bridge

  • diagnostic_server_jobs.c — C job queue for scheduling diagnostic server callbacks from native code. Used by the CoreCLR EventPipe runtime to post work back to the JS event loop.
  • diagnostic_server_jobs.h — Header with SystemJS_DiagnosticServerQueueJob and SystemJS_ExecuteDiagnosticServerCallback declarations.
  • native/diagnostics.ts — Thin forwarding layer that routes ds_rt_websocket_* calls from the emscripten native module to the diagnostics module via cross-module exports.
  • native/scheduling.tsSystemJS_ScheduleDiagnosticServer() — schedules the diagnostic server callback via safeSetTimeout, following the same pattern as timer/threadpool/finalization scheduling.

Modified files — Cross-module exchange wiring

  • Common/JavaScript/cross-module/index.ts — Added dotnetDiagnosticsExports and its diagnosticsExportsFromTable() deserializer for the new DiagnosticsExportsTable.
  • Common/JavaScript/types/exchange.ts — Added DiagnosticsExports, DiagnosticsExportsTable, and NativeBrowserExports.SystemJS_ScheduleDiagnosticServer types. Added imports for ds_rt_websocket_* and SystemJS_ScheduleDiagnosticServer.
  • Common/JavaScript/types/ems-ambient.ts — Added _SystemJS_ExecuteDiagnosticServerCallback and _SystemJS_ScheduleDiagnosticServer to the emscripten ambient type. Added lastScheduledDiagnosticServerId to DOTNET state.
  • Common/JavaScript/types/public-api.ts — Added DiagnosticsAPIType with collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to APIType.
  • Common/JavaScript/loader/dotnet.d.ts — Updated public type declarations to include DiagnosticsAPIType.
  • Common/JavaScript/CMakeLists.txt — Added new TypeScript source files to the rollup input list.

Modified files — Diagnostics module registration

  • System.Native.Browser/diagnostics/index.ts — Registers ds_rt_websocket_* in the DiagnosticsExportsTable and assigns collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to the public dotnetApi. Calls initializeDS() on module init.
  • System.Native.Browser/native/index.ts — Exports SystemJS_ScheduleDiagnosticServer and ds_rt_websocket_*. Adds SystemJS_ScheduleDiagnosticServer to NativeBrowserExportsTable.
  • System.Native.Browser/utils/scheduling.ts — Added _SystemJS_ExecuteDiagnosticServerCallback() to runBackgroundTimers() and cleanup to abortBackgroundTimers().
  • System.Native.Browser/libSystem.Native.Browser.footer.js — Added SystemJS_ExecuteDiagnosticServerCallback to the emscripten exported functions list.
  • System.Native.Browser/CMakeLists.txt — Added diagnostic_server_jobs.c to the build.

Modified files — Mono renames

Mechanical rename of C/TypeScript symbols to follow the SystemJS_ convention:

  • mono_wasm_ds_execSystemJS_ExecuteDiagnosticServerCallback (C function and all TS wrappers)
  • mono_schedule_ds_jobSystemJS_DiagnosticServerQueueJob (C function and all callers)

Affected files:

  • src/mono/browser/runtime/cwraps.ts
  • src/mono/browser/runtime/diagnostics/common.ts
  • src/mono/browser/runtime/diagnostics/diagnostics-ws.ts (also added as any casts for ws.send)
  • src/mono/browser/runtime/exports.ts
  • src/mono/browser/runtime/types/internal.ts
  • src/mono/mono/eventpipe/ep-rt-mono.h
  • src/mono/mono/mini/mini-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.h
  • src/mono/mono/utils/mono-threads.h

Other

  • rollup.config.plugins.js — Extended circular dependency warning suppression to include diagnostics-js module (in addition to existing marshal-to-cs/marshal-to-js).

- renamed SystemJS_ExecuteDiagnosticServerCallback, SystemJS_DiagnosticServerQueueJob
@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 13, 2026
@pavelsavarapavelsavara self-assigned this Apr 13, 2026
CopilotAI review requested due to automatic review settings April 13, 2026 10:08
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-Diagnostics-coreclr os-browser Browser variant of arch-wasm labels Apr 13, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Ports the EventPipe diagnostic server TypeScript implementation into the CoreCLR browser runtime path, adding a JS/TS diagnostic server (JS-transport + dsrouter WebSocket transport) and wiring it through the existing cross-module exchange so native EventPipe can drive it.

Changes:

  • Added CoreCLR browser diagnostics server implementation (protocol, transports, and built-in commands for gcdump/counters/cpu-samples).
  • Added native job-queue bridge and scheduling hook so native code can post diagnostic-server work back onto the JS event loop.
  • Extended cross-module exchange/types and build wiring (rollup + CMake) to include the new exports and sources.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/native/rollup.config.plugins.jsSuppresses circular-dependency warnings for diagnostics module.
src/native/libs/System.Native.Browser/utils/scheduling.tsRuns/aborts diagnostic-server callback as part of background timer processing.
src/native/libs/System.Native.Browser/native/scheduling.tsAdds SystemJS_ScheduleDiagnosticServer() JS scheduling function.
src/native/libs/System.Native.Browser/native/index.tsExposes diagnostic scheduling + websocket shims via cross-module exchange.
src/native/libs/System.Native.Browser/native/diagnostics.tsForwards ds_rt_websocket_* from native module to diagnostics module via exchange.
src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.jsExports SystemJS_ExecuteDiagnosticServerCallback to JS.
src/native/libs/System.Native.Browser/diagnostics/types.tsAdds diagnostics protocol and client/session interfaces + enums.
src/native/libs/System.Native.Browser/diagnostics/index.tsRegisters diagnostics exports and wires new public API methods.
src/native/libs/System.Native.Browser/diagnostics/dotnet-gcdump.tsImplements collectGcDump() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-cpu-profiler.tsImplements collectCpuSamples() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-counters.tsImplements collectMetrics() command helper.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server.tsCore connection routing + ds_rt_websocket_* entrypoints + dsrouter reconnect.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-ws.tsWebSocket transport implementation for dsrouter.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.tsIn-browser “JS transport” implementation + scenario-based auto-start plumbing.
src/native/libs/System.Native.Browser/diagnostics/common.tsShared buffering + heap read/write + trace download helper.
src/native/libs/System.Native.Browser/diagnostics/client-commands.tsIPC protocol serialization for EventPipe/process commands.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.hDeclares diagnostic-server native job queue API.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.cImplements diagnostic-server native job queue.
src/native/libs/System.Native.Browser/CMakeLists.txtAdds diagnostic_server_jobs.c to System.Native.Browser build.
src/native/libs/Common/JavaScript/types/public-api.tsUpdates public diagnostics option types (providerName).
src/native/libs/Common/JavaScript/types/exchange.tsAdds diagnostics exports table + diagnostic scheduling export type.
src/native/libs/Common/JavaScript/types/ems-ambient.tsAdds ambient typings for diagnostic-server callbacks/scheduling state.
src/native/libs/Common/JavaScript/loader/dotnet.d.tsUpdates generated public typings (providerName).
src/native/libs/Common/JavaScript/cross-module/index.tsDeserializes new cross-module exports for diagnostics + native browser.
src/native/libs/Common/JavaScript/CMakeLists.txtAdds new diagnostics TS sources to rollup input set.
src/mono/mono/utils/mono-threads.hRenames diagnostic-server scheduling symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.hRenames diagnostic-server exec callback symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.cApplies SystemJS_* renames and adjusts debug strings.
src/mono/mono/mini/mini-wasm.cUpdates exported symbol name for diagnostic-server callback.
src/mono/mono/eventpipe/ep-rt-mono.hUpdates symbol name used to requeue EP jobs.
src/mono/browser/runtime/types/internal.tsRenames runtime helper from mono_wasm_ds_exec to SystemJS_ExecuteDiagnosticServerCallback.
src/mono/browser/runtime/exports.tsWires renamed diagnostic-server callback into runtime helpers export.
src/mono/browser/runtime/diagnostics/diagnostics-ws.tsAdds casts for ws.send and keeps WebSocket transport compiling.
src/mono/browser/runtime/diagnostics/common.tsSwitches to renamed diagnostic-server callback.
src/mono/browser/runtime/cwraps.tsUpdates cwrap bindings for renamed diagnostic-server callback.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/native/index.ts
CopilotAI review requested due to automatic review settings April 16, 2026 07:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 35 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/rollup.config.plugins.js
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
CopilotAI review requested due to automatic review settings April 16, 2026 08:57

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 37 changed files in this pull request and generated 4 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/Common/JavaScript/types/public-api.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/common.ts
@pavelsavara
pavelsavara marked this pull request as ready for review April 16, 2026 15:05
CopilotAI review requested due to automatic review settings April 16, 2026 15:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 39 out of 41 changed files in this pull request and generated 7 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts

@marafmaraf left a comment

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.

Looks good to me & my copilot 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated issues

@pavelsavara
pavelsavara merged commit 69fb4fe into dotnet:mainApr 17, 2026
170 of 177 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_coreclr_js branch April 17, 2026 10:57
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-coreclros-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@maraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR by pavelsavara · Pull Request #126830 · dotnet/runtime · GitHub
Skip to content

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR - #126830

Merged
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js
Apr 17, 2026
Merged

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR#126830
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

Ports the EventPipe (EP) diagnostic server TypeScript implementation from the Mono.

This is just the JavaScript part split from #126324 for easier review.
(it doesn't work end to end yet)

Changes

New files — Diagnostic server (TypeScript)

These files under src/native/libs/System.Native.Browser/diagnostics/ implement the diagnostic server protocol and built-in diagnostic commands for the CoreCLR path:

  • client-commands.ts — IPC protocol serialization: EventPipe commands (CollectTracing2, StopTracing), process commands (ResumeRuntime, ProcessInfo3), GC heap dump, counters, and sample profiler command builders.
  • common.tsDiagnosticConnectionBase class with send/receive message buffering and heap memory read/write. downloadBlob() helper for trace file downloads.
  • diagnostic-server.ts — Core socket management: ds_rt_websocket_create/send/poll/recv/close functions that the C runtime calls via the cross-module exchange. Routes connections to either JS-based or WebSocket-based transports. connectDSRouter() for switching to dotnet-dsrouter. initializeDS() for startup configuration.
  • diagnostic-server-js.ts — In-browser JS diagnostic client: handles the IPC advert/response/data protocol without a WebSocket, supports scenario-based auto-start (js://gcdump, js://counters, js://cpu-samples) and custom globalThis.dotnetDiagnosticClient providers.
  • diagnostic-server-ws.ts — WebSocket transport for connecting to external tools via dotnet-dsrouter.
  • dotnet-gcdump.tscollectGcDump() — triggers a GC heap dump trace collection.
  • dotnet-counters.tscollectMetrics() — collects System.Runtime counters for a configurable duration.
  • dotnet-cpu-profiler.tscollectCpuSamples() — collects CPU sample profiling traces.
  • types.ts — Protocol enums (CommandSetId, EventPipeCommandId, Keywords, etc.) and interfaces (IDiagnosticConnection, IDiagnosticSession, IDiagnosticClient).

New files — Native bridge

  • diagnostic_server_jobs.c — C job queue for scheduling diagnostic server callbacks from native code. Used by the CoreCLR EventPipe runtime to post work back to the JS event loop.
  • diagnostic_server_jobs.h — Header with SystemJS_DiagnosticServerQueueJob and SystemJS_ExecuteDiagnosticServerCallback declarations.
  • native/diagnostics.ts — Thin forwarding layer that routes ds_rt_websocket_* calls from the emscripten native module to the diagnostics module via cross-module exports.
  • native/scheduling.tsSystemJS_ScheduleDiagnosticServer() — schedules the diagnostic server callback via safeSetTimeout, following the same pattern as timer/threadpool/finalization scheduling.

Modified files — Cross-module exchange wiring

  • Common/JavaScript/cross-module/index.ts — Added dotnetDiagnosticsExports and its diagnosticsExportsFromTable() deserializer for the new DiagnosticsExportsTable.
  • Common/JavaScript/types/exchange.ts — Added DiagnosticsExports, DiagnosticsExportsTable, and NativeBrowserExports.SystemJS_ScheduleDiagnosticServer types. Added imports for ds_rt_websocket_* and SystemJS_ScheduleDiagnosticServer.
  • Common/JavaScript/types/ems-ambient.ts — Added _SystemJS_ExecuteDiagnosticServerCallback and _SystemJS_ScheduleDiagnosticServer to the emscripten ambient type. Added lastScheduledDiagnosticServerId to DOTNET state.
  • Common/JavaScript/types/public-api.ts — Added DiagnosticsAPIType with collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to APIType.
  • Common/JavaScript/loader/dotnet.d.ts — Updated public type declarations to include DiagnosticsAPIType.
  • Common/JavaScript/CMakeLists.txt — Added new TypeScript source files to the rollup input list.

Modified files — Diagnostics module registration

  • System.Native.Browser/diagnostics/index.ts — Registers ds_rt_websocket_* in the DiagnosticsExportsTable and assigns collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to the public dotnetApi. Calls initializeDS() on module init.
  • System.Native.Browser/native/index.ts — Exports SystemJS_ScheduleDiagnosticServer and ds_rt_websocket_*. Adds SystemJS_ScheduleDiagnosticServer to NativeBrowserExportsTable.
  • System.Native.Browser/utils/scheduling.ts — Added _SystemJS_ExecuteDiagnosticServerCallback() to runBackgroundTimers() and cleanup to abortBackgroundTimers().
  • System.Native.Browser/libSystem.Native.Browser.footer.js — Added SystemJS_ExecuteDiagnosticServerCallback to the emscripten exported functions list.
  • System.Native.Browser/CMakeLists.txt — Added diagnostic_server_jobs.c to the build.

Modified files — Mono renames

Mechanical rename of C/TypeScript symbols to follow the SystemJS_ convention:

  • mono_wasm_ds_execSystemJS_ExecuteDiagnosticServerCallback (C function and all TS wrappers)
  • mono_schedule_ds_jobSystemJS_DiagnosticServerQueueJob (C function and all callers)

Affected files:

  • src/mono/browser/runtime/cwraps.ts
  • src/mono/browser/runtime/diagnostics/common.ts
  • src/mono/browser/runtime/diagnostics/diagnostics-ws.ts (also added as any casts for ws.send)
  • src/mono/browser/runtime/exports.ts
  • src/mono/browser/runtime/types/internal.ts
  • src/mono/mono/eventpipe/ep-rt-mono.h
  • src/mono/mono/mini/mini-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.h
  • src/mono/mono/utils/mono-threads.h

Other

  • rollup.config.plugins.js — Extended circular dependency warning suppression to include diagnostics-js module (in addition to existing marshal-to-cs/marshal-to-js).

- renamed SystemJS_ExecuteDiagnosticServerCallback, SystemJS_DiagnosticServerQueueJob
@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 13, 2026
@pavelsavarapavelsavara self-assigned this Apr 13, 2026
CopilotAI review requested due to automatic review settings April 13, 2026 10:08
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-Diagnostics-coreclr os-browser Browser variant of arch-wasm labels Apr 13, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Ports the EventPipe diagnostic server TypeScript implementation into the CoreCLR browser runtime path, adding a JS/TS diagnostic server (JS-transport + dsrouter WebSocket transport) and wiring it through the existing cross-module exchange so native EventPipe can drive it.

Changes:

  • Added CoreCLR browser diagnostics server implementation (protocol, transports, and built-in commands for gcdump/counters/cpu-samples).
  • Added native job-queue bridge and scheduling hook so native code can post diagnostic-server work back onto the JS event loop.
  • Extended cross-module exchange/types and build wiring (rollup + CMake) to include the new exports and sources.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/native/rollup.config.plugins.jsSuppresses circular-dependency warnings for diagnostics module.
src/native/libs/System.Native.Browser/utils/scheduling.tsRuns/aborts diagnostic-server callback as part of background timer processing.
src/native/libs/System.Native.Browser/native/scheduling.tsAdds SystemJS_ScheduleDiagnosticServer() JS scheduling function.
src/native/libs/System.Native.Browser/native/index.tsExposes diagnostic scheduling + websocket shims via cross-module exchange.
src/native/libs/System.Native.Browser/native/diagnostics.tsForwards ds_rt_websocket_* from native module to diagnostics module via exchange.
src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.jsExports SystemJS_ExecuteDiagnosticServerCallback to JS.
src/native/libs/System.Native.Browser/diagnostics/types.tsAdds diagnostics protocol and client/session interfaces + enums.
src/native/libs/System.Native.Browser/diagnostics/index.tsRegisters diagnostics exports and wires new public API methods.
src/native/libs/System.Native.Browser/diagnostics/dotnet-gcdump.tsImplements collectGcDump() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-cpu-profiler.tsImplements collectCpuSamples() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-counters.tsImplements collectMetrics() command helper.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server.tsCore connection routing + ds_rt_websocket_* entrypoints + dsrouter reconnect.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-ws.tsWebSocket transport implementation for dsrouter.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.tsIn-browser “JS transport” implementation + scenario-based auto-start plumbing.
src/native/libs/System.Native.Browser/diagnostics/common.tsShared buffering + heap read/write + trace download helper.
src/native/libs/System.Native.Browser/diagnostics/client-commands.tsIPC protocol serialization for EventPipe/process commands.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.hDeclares diagnostic-server native job queue API.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.cImplements diagnostic-server native job queue.
src/native/libs/System.Native.Browser/CMakeLists.txtAdds diagnostic_server_jobs.c to System.Native.Browser build.
src/native/libs/Common/JavaScript/types/public-api.tsUpdates public diagnostics option types (providerName).
src/native/libs/Common/JavaScript/types/exchange.tsAdds diagnostics exports table + diagnostic scheduling export type.
src/native/libs/Common/JavaScript/types/ems-ambient.tsAdds ambient typings for diagnostic-server callbacks/scheduling state.
src/native/libs/Common/JavaScript/loader/dotnet.d.tsUpdates generated public typings (providerName).
src/native/libs/Common/JavaScript/cross-module/index.tsDeserializes new cross-module exports for diagnostics + native browser.
src/native/libs/Common/JavaScript/CMakeLists.txtAdds new diagnostics TS sources to rollup input set.
src/mono/mono/utils/mono-threads.hRenames diagnostic-server scheduling symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.hRenames diagnostic-server exec callback symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.cApplies SystemJS_* renames and adjusts debug strings.
src/mono/mono/mini/mini-wasm.cUpdates exported symbol name for diagnostic-server callback.
src/mono/mono/eventpipe/ep-rt-mono.hUpdates symbol name used to requeue EP jobs.
src/mono/browser/runtime/types/internal.tsRenames runtime helper from mono_wasm_ds_exec to SystemJS_ExecuteDiagnosticServerCallback.
src/mono/browser/runtime/exports.tsWires renamed diagnostic-server callback into runtime helpers export.
src/mono/browser/runtime/diagnostics/diagnostics-ws.tsAdds casts for ws.send and keeps WebSocket transport compiling.
src/mono/browser/runtime/diagnostics/common.tsSwitches to renamed diagnostic-server callback.
src/mono/browser/runtime/cwraps.tsUpdates cwrap bindings for renamed diagnostic-server callback.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/native/index.ts
CopilotAI review requested due to automatic review settings April 16, 2026 07:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 35 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/rollup.config.plugins.js
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
CopilotAI review requested due to automatic review settings April 16, 2026 08:57

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 37 changed files in this pull request and generated 4 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/Common/JavaScript/types/public-api.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/common.ts
@pavelsavara
pavelsavara marked this pull request as ready for review April 16, 2026 15:05
CopilotAI review requested due to automatic review settings April 16, 2026 15:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 39 out of 41 changed files in this pull request and generated 7 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts

@marafmaraf left a comment

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.

Looks good to me & my copilot 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated issues

@pavelsavara
pavelsavara merged commit 69fb4fe into dotnet:mainApr 17, 2026
170 of 177 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_coreclr_js branch April 17, 2026 10:57
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-coreclros-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@maraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR by pavelsavara · Pull Request #126830 · dotnet/runtime · GitHub
Skip to content

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR - #126830

Merged
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js
Apr 17, 2026
Merged

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR#126830
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

Ports the EventPipe (EP) diagnostic server TypeScript implementation from the Mono.

This is just the JavaScript part split from #126324 for easier review.
(it doesn't work end to end yet)

Changes

New files — Diagnostic server (TypeScript)

These files under src/native/libs/System.Native.Browser/diagnostics/ implement the diagnostic server protocol and built-in diagnostic commands for the CoreCLR path:

  • client-commands.ts — IPC protocol serialization: EventPipe commands (CollectTracing2, StopTracing), process commands (ResumeRuntime, ProcessInfo3), GC heap dump, counters, and sample profiler command builders.
  • common.tsDiagnosticConnectionBase class with send/receive message buffering and heap memory read/write. downloadBlob() helper for trace file downloads.
  • diagnostic-server.ts — Core socket management: ds_rt_websocket_create/send/poll/recv/close functions that the C runtime calls via the cross-module exchange. Routes connections to either JS-based or WebSocket-based transports. connectDSRouter() for switching to dotnet-dsrouter. initializeDS() for startup configuration.
  • diagnostic-server-js.ts — In-browser JS diagnostic client: handles the IPC advert/response/data protocol without a WebSocket, supports scenario-based auto-start (js://gcdump, js://counters, js://cpu-samples) and custom globalThis.dotnetDiagnosticClient providers.
  • diagnostic-server-ws.ts — WebSocket transport for connecting to external tools via dotnet-dsrouter.
  • dotnet-gcdump.tscollectGcDump() — triggers a GC heap dump trace collection.
  • dotnet-counters.tscollectMetrics() — collects System.Runtime counters for a configurable duration.
  • dotnet-cpu-profiler.tscollectCpuSamples() — collects CPU sample profiling traces.
  • types.ts — Protocol enums (CommandSetId, EventPipeCommandId, Keywords, etc.) and interfaces (IDiagnosticConnection, IDiagnosticSession, IDiagnosticClient).

New files — Native bridge

  • diagnostic_server_jobs.c — C job queue for scheduling diagnostic server callbacks from native code. Used by the CoreCLR EventPipe runtime to post work back to the JS event loop.
  • diagnostic_server_jobs.h — Header with SystemJS_DiagnosticServerQueueJob and SystemJS_ExecuteDiagnosticServerCallback declarations.
  • native/diagnostics.ts — Thin forwarding layer that routes ds_rt_websocket_* calls from the emscripten native module to the diagnostics module via cross-module exports.
  • native/scheduling.tsSystemJS_ScheduleDiagnosticServer() — schedules the diagnostic server callback via safeSetTimeout, following the same pattern as timer/threadpool/finalization scheduling.

Modified files — Cross-module exchange wiring

  • Common/JavaScript/cross-module/index.ts — Added dotnetDiagnosticsExports and its diagnosticsExportsFromTable() deserializer for the new DiagnosticsExportsTable.
  • Common/JavaScript/types/exchange.ts — Added DiagnosticsExports, DiagnosticsExportsTable, and NativeBrowserExports.SystemJS_ScheduleDiagnosticServer types. Added imports for ds_rt_websocket_* and SystemJS_ScheduleDiagnosticServer.
  • Common/JavaScript/types/ems-ambient.ts — Added _SystemJS_ExecuteDiagnosticServerCallback and _SystemJS_ScheduleDiagnosticServer to the emscripten ambient type. Added lastScheduledDiagnosticServerId to DOTNET state.
  • Common/JavaScript/types/public-api.ts — Added DiagnosticsAPIType with collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to APIType.
  • Common/JavaScript/loader/dotnet.d.ts — Updated public type declarations to include DiagnosticsAPIType.
  • Common/JavaScript/CMakeLists.txt — Added new TypeScript source files to the rollup input list.

Modified files — Diagnostics module registration

  • System.Native.Browser/diagnostics/index.ts — Registers ds_rt_websocket_* in the DiagnosticsExportsTable and assigns collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to the public dotnetApi. Calls initializeDS() on module init.
  • System.Native.Browser/native/index.ts — Exports SystemJS_ScheduleDiagnosticServer and ds_rt_websocket_*. Adds SystemJS_ScheduleDiagnosticServer to NativeBrowserExportsTable.
  • System.Native.Browser/utils/scheduling.ts — Added _SystemJS_ExecuteDiagnosticServerCallback() to runBackgroundTimers() and cleanup to abortBackgroundTimers().
  • System.Native.Browser/libSystem.Native.Browser.footer.js — Added SystemJS_ExecuteDiagnosticServerCallback to the emscripten exported functions list.
  • System.Native.Browser/CMakeLists.txt — Added diagnostic_server_jobs.c to the build.

Modified files — Mono renames

Mechanical rename of C/TypeScript symbols to follow the SystemJS_ convention:

  • mono_wasm_ds_execSystemJS_ExecuteDiagnosticServerCallback (C function and all TS wrappers)
  • mono_schedule_ds_jobSystemJS_DiagnosticServerQueueJob (C function and all callers)

Affected files:

  • src/mono/browser/runtime/cwraps.ts
  • src/mono/browser/runtime/diagnostics/common.ts
  • src/mono/browser/runtime/diagnostics/diagnostics-ws.ts (also added as any casts for ws.send)
  • src/mono/browser/runtime/exports.ts
  • src/mono/browser/runtime/types/internal.ts
  • src/mono/mono/eventpipe/ep-rt-mono.h
  • src/mono/mono/mini/mini-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.h
  • src/mono/mono/utils/mono-threads.h

Other

  • rollup.config.plugins.js — Extended circular dependency warning suppression to include diagnostics-js module (in addition to existing marshal-to-cs/marshal-to-js).

- renamed SystemJS_ExecuteDiagnosticServerCallback, SystemJS_DiagnosticServerQueueJob
@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 13, 2026
@pavelsavarapavelsavara self-assigned this Apr 13, 2026
CopilotAI review requested due to automatic review settings April 13, 2026 10:08
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-Diagnostics-coreclr os-browser Browser variant of arch-wasm labels Apr 13, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Ports the EventPipe diagnostic server TypeScript implementation into the CoreCLR browser runtime path, adding a JS/TS diagnostic server (JS-transport + dsrouter WebSocket transport) and wiring it through the existing cross-module exchange so native EventPipe can drive it.

Changes:

  • Added CoreCLR browser diagnostics server implementation (protocol, transports, and built-in commands for gcdump/counters/cpu-samples).
  • Added native job-queue bridge and scheduling hook so native code can post diagnostic-server work back onto the JS event loop.
  • Extended cross-module exchange/types and build wiring (rollup + CMake) to include the new exports and sources.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/native/rollup.config.plugins.jsSuppresses circular-dependency warnings for diagnostics module.
src/native/libs/System.Native.Browser/utils/scheduling.tsRuns/aborts diagnostic-server callback as part of background timer processing.
src/native/libs/System.Native.Browser/native/scheduling.tsAdds SystemJS_ScheduleDiagnosticServer() JS scheduling function.
src/native/libs/System.Native.Browser/native/index.tsExposes diagnostic scheduling + websocket shims via cross-module exchange.
src/native/libs/System.Native.Browser/native/diagnostics.tsForwards ds_rt_websocket_* from native module to diagnostics module via exchange.
src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.jsExports SystemJS_ExecuteDiagnosticServerCallback to JS.
src/native/libs/System.Native.Browser/diagnostics/types.tsAdds diagnostics protocol and client/session interfaces + enums.
src/native/libs/System.Native.Browser/diagnostics/index.tsRegisters diagnostics exports and wires new public API methods.
src/native/libs/System.Native.Browser/diagnostics/dotnet-gcdump.tsImplements collectGcDump() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-cpu-profiler.tsImplements collectCpuSamples() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-counters.tsImplements collectMetrics() command helper.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server.tsCore connection routing + ds_rt_websocket_* entrypoints + dsrouter reconnect.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-ws.tsWebSocket transport implementation for dsrouter.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.tsIn-browser “JS transport” implementation + scenario-based auto-start plumbing.
src/native/libs/System.Native.Browser/diagnostics/common.tsShared buffering + heap read/write + trace download helper.
src/native/libs/System.Native.Browser/diagnostics/client-commands.tsIPC protocol serialization for EventPipe/process commands.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.hDeclares diagnostic-server native job queue API.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.cImplements diagnostic-server native job queue.
src/native/libs/System.Native.Browser/CMakeLists.txtAdds diagnostic_server_jobs.c to System.Native.Browser build.
src/native/libs/Common/JavaScript/types/public-api.tsUpdates public diagnostics option types (providerName).
src/native/libs/Common/JavaScript/types/exchange.tsAdds diagnostics exports table + diagnostic scheduling export type.
src/native/libs/Common/JavaScript/types/ems-ambient.tsAdds ambient typings for diagnostic-server callbacks/scheduling state.
src/native/libs/Common/JavaScript/loader/dotnet.d.tsUpdates generated public typings (providerName).
src/native/libs/Common/JavaScript/cross-module/index.tsDeserializes new cross-module exports for diagnostics + native browser.
src/native/libs/Common/JavaScript/CMakeLists.txtAdds new diagnostics TS sources to rollup input set.
src/mono/mono/utils/mono-threads.hRenames diagnostic-server scheduling symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.hRenames diagnostic-server exec callback symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.cApplies SystemJS_* renames and adjusts debug strings.
src/mono/mono/mini/mini-wasm.cUpdates exported symbol name for diagnostic-server callback.
src/mono/mono/eventpipe/ep-rt-mono.hUpdates symbol name used to requeue EP jobs.
src/mono/browser/runtime/types/internal.tsRenames runtime helper from mono_wasm_ds_exec to SystemJS_ExecuteDiagnosticServerCallback.
src/mono/browser/runtime/exports.tsWires renamed diagnostic-server callback into runtime helpers export.
src/mono/browser/runtime/diagnostics/diagnostics-ws.tsAdds casts for ws.send and keeps WebSocket transport compiling.
src/mono/browser/runtime/diagnostics/common.tsSwitches to renamed diagnostic-server callback.
src/mono/browser/runtime/cwraps.tsUpdates cwrap bindings for renamed diagnostic-server callback.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/native/index.ts
CopilotAI review requested due to automatic review settings April 16, 2026 07:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 35 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/rollup.config.plugins.js
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
CopilotAI review requested due to automatic review settings April 16, 2026 08:57

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 37 changed files in this pull request and generated 4 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/Common/JavaScript/types/public-api.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/common.ts
@pavelsavara
pavelsavara marked this pull request as ready for review April 16, 2026 15:05
CopilotAI review requested due to automatic review settings April 16, 2026 15:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 39 out of 41 changed files in this pull request and generated 7 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts

@marafmaraf left a comment

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.

Looks good to me & my copilot 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated issues

@pavelsavara
pavelsavara merged commit 69fb4fe into dotnet:mainApr 17, 2026
170 of 177 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_coreclr_js branch April 17, 2026 10:57
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-coreclros-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR - #126830

Merged
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js
Apr 17, 2026
Merged

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR#126830
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

Ports the EventPipe (EP) diagnostic server TypeScript implementation from the Mono.

This is just the JavaScript part split from #126324 for easier review.
(it doesn't work end to end yet)

Changes

New files — Diagnostic server (TypeScript)

These files under src/native/libs/System.Native.Browser/diagnostics/ implement the diagnostic server protocol and built-in diagnostic commands for the CoreCLR path:

  • client-commands.ts — IPC protocol serialization: EventPipe commands (CollectTracing2, StopTracing), process commands (ResumeRuntime, ProcessInfo3), GC heap dump, counters, and sample profiler command builders.
  • common.tsDiagnosticConnectionBase class with send/receive message buffering and heap memory read/write. downloadBlob() helper for trace file downloads.
  • diagnostic-server.ts — Core socket management: ds_rt_websocket_create/send/poll/recv/close functions that the C runtime calls via the cross-module exchange. Routes connections to either JS-based or WebSocket-based transports. connectDSRouter() for switching to dotnet-dsrouter. initializeDS() for startup configuration.
  • diagnostic-server-js.ts — In-browser JS diagnostic client: handles the IPC advert/response/data protocol without a WebSocket, supports scenario-based auto-start (js://gcdump, js://counters, js://cpu-samples) and custom globalThis.dotnetDiagnosticClient providers.
  • diagnostic-server-ws.ts — WebSocket transport for connecting to external tools via dotnet-dsrouter.
  • dotnet-gcdump.tscollectGcDump() — triggers a GC heap dump trace collection.
  • dotnet-counters.tscollectMetrics() — collects System.Runtime counters for a configurable duration.
  • dotnet-cpu-profiler.tscollectCpuSamples() — collects CPU sample profiling traces.
  • types.ts — Protocol enums (CommandSetId, EventPipeCommandId, Keywords, etc.) and interfaces (IDiagnosticConnection, IDiagnosticSession, IDiagnosticClient).

New files — Native bridge

  • diagnostic_server_jobs.c — C job queue for scheduling diagnostic server callbacks from native code. Used by the CoreCLR EventPipe runtime to post work back to the JS event loop.
  • diagnostic_server_jobs.h — Header with SystemJS_DiagnosticServerQueueJob and SystemJS_ExecuteDiagnosticServerCallback declarations.
  • native/diagnostics.ts — Thin forwarding layer that routes ds_rt_websocket_* calls from the emscripten native module to the diagnostics module via cross-module exports.
  • native/scheduling.tsSystemJS_ScheduleDiagnosticServer() — schedules the diagnostic server callback via safeSetTimeout, following the same pattern as timer/threadpool/finalization scheduling.

Modified files — Cross-module exchange wiring

  • Common/JavaScript/cross-module/index.ts — Added dotnetDiagnosticsExports and its diagnosticsExportsFromTable() deserializer for the new DiagnosticsExportsTable.
  • Common/JavaScript/types/exchange.ts — Added DiagnosticsExports, DiagnosticsExportsTable, and NativeBrowserExports.SystemJS_ScheduleDiagnosticServer types. Added imports for ds_rt_websocket_* and SystemJS_ScheduleDiagnosticServer.
  • Common/JavaScript/types/ems-ambient.ts — Added _SystemJS_ExecuteDiagnosticServerCallback and _SystemJS_ScheduleDiagnosticServer to the emscripten ambient type. Added lastScheduledDiagnosticServerId to DOTNET state.
  • Common/JavaScript/types/public-api.ts — Added DiagnosticsAPIType with collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to APIType.
  • Common/JavaScript/loader/dotnet.d.ts — Updated public type declarations to include DiagnosticsAPIType.
  • Common/JavaScript/CMakeLists.txt — Added new TypeScript source files to the rollup input list.

Modified files — Diagnostics module registration

  • System.Native.Browser/diagnostics/index.ts — Registers ds_rt_websocket_* in the DiagnosticsExportsTable and assigns collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to the public dotnetApi. Calls initializeDS() on module init.
  • System.Native.Browser/native/index.ts — Exports SystemJS_ScheduleDiagnosticServer and ds_rt_websocket_*. Adds SystemJS_ScheduleDiagnosticServer to NativeBrowserExportsTable.
  • System.Native.Browser/utils/scheduling.ts — Added _SystemJS_ExecuteDiagnosticServerCallback() to runBackgroundTimers() and cleanup to abortBackgroundTimers().
  • System.Native.Browser/libSystem.Native.Browser.footer.js — Added SystemJS_ExecuteDiagnosticServerCallback to the emscripten exported functions list.
  • System.Native.Browser/CMakeLists.txt — Added diagnostic_server_jobs.c to the build.

Modified files — Mono renames

Mechanical rename of C/TypeScript symbols to follow the SystemJS_ convention:

  • mono_wasm_ds_execSystemJS_ExecuteDiagnosticServerCallback (C function and all TS wrappers)
  • mono_schedule_ds_jobSystemJS_DiagnosticServerQueueJob (C function and all callers)

Affected files:

  • src/mono/browser/runtime/cwraps.ts
  • src/mono/browser/runtime/diagnostics/common.ts
  • src/mono/browser/runtime/diagnostics/diagnostics-ws.ts (also added as any casts for ws.send)
  • src/mono/browser/runtime/exports.ts
  • src/mono/browser/runtime/types/internal.ts
  • src/mono/mono/eventpipe/ep-rt-mono.h
  • src/mono/mono/mini/mini-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.h
  • src/mono/mono/utils/mono-threads.h

Other

  • rollup.config.plugins.js — Extended circular dependency warning suppression to include diagnostics-js module (in addition to existing marshal-to-cs/marshal-to-js).

- renamed SystemJS_ExecuteDiagnosticServerCallback, SystemJS_DiagnosticServerQueueJob
@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 13, 2026
@pavelsavarapavelsavara self-assigned this Apr 13, 2026
CopilotAI review requested due to automatic review settings April 13, 2026 10:08
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-Diagnostics-coreclr os-browser Browser variant of arch-wasm labels Apr 13, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Ports the EventPipe diagnostic server TypeScript implementation into the CoreCLR browser runtime path, adding a JS/TS diagnostic server (JS-transport + dsrouter WebSocket transport) and wiring it through the existing cross-module exchange so native EventPipe can drive it.

Changes:

  • Added CoreCLR browser diagnostics server implementation (protocol, transports, and built-in commands for gcdump/counters/cpu-samples).
  • Added native job-queue bridge and scheduling hook so native code can post diagnostic-server work back onto the JS event loop.
  • Extended cross-module exchange/types and build wiring (rollup + CMake) to include the new exports and sources.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/native/rollup.config.plugins.jsSuppresses circular-dependency warnings for diagnostics module.
src/native/libs/System.Native.Browser/utils/scheduling.tsRuns/aborts diagnostic-server callback as part of background timer processing.
src/native/libs/System.Native.Browser/native/scheduling.tsAdds SystemJS_ScheduleDiagnosticServer() JS scheduling function.
src/native/libs/System.Native.Browser/native/index.tsExposes diagnostic scheduling + websocket shims via cross-module exchange.
src/native/libs/System.Native.Browser/native/diagnostics.tsForwards ds_rt_websocket_* from native module to diagnostics module via exchange.
src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.jsExports SystemJS_ExecuteDiagnosticServerCallback to JS.
src/native/libs/System.Native.Browser/diagnostics/types.tsAdds diagnostics protocol and client/session interfaces + enums.
src/native/libs/System.Native.Browser/diagnostics/index.tsRegisters diagnostics exports and wires new public API methods.
src/native/libs/System.Native.Browser/diagnostics/dotnet-gcdump.tsImplements collectGcDump() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-cpu-profiler.tsImplements collectCpuSamples() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-counters.tsImplements collectMetrics() command helper.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server.tsCore connection routing + ds_rt_websocket_* entrypoints + dsrouter reconnect.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-ws.tsWebSocket transport implementation for dsrouter.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.tsIn-browser “JS transport” implementation + scenario-based auto-start plumbing.
src/native/libs/System.Native.Browser/diagnostics/common.tsShared buffering + heap read/write + trace download helper.
src/native/libs/System.Native.Browser/diagnostics/client-commands.tsIPC protocol serialization for EventPipe/process commands.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.hDeclares diagnostic-server native job queue API.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.cImplements diagnostic-server native job queue.
src/native/libs/System.Native.Browser/CMakeLists.txtAdds diagnostic_server_jobs.c to System.Native.Browser build.
src/native/libs/Common/JavaScript/types/public-api.tsUpdates public diagnostics option types (providerName).
src/native/libs/Common/JavaScript/types/exchange.tsAdds diagnostics exports table + diagnostic scheduling export type.
src/native/libs/Common/JavaScript/types/ems-ambient.tsAdds ambient typings for diagnostic-server callbacks/scheduling state.
src/native/libs/Common/JavaScript/loader/dotnet.d.tsUpdates generated public typings (providerName).
src/native/libs/Common/JavaScript/cross-module/index.tsDeserializes new cross-module exports for diagnostics + native browser.
src/native/libs/Common/JavaScript/CMakeLists.txtAdds new diagnostics TS sources to rollup input set.
src/mono/mono/utils/mono-threads.hRenames diagnostic-server scheduling symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.hRenames diagnostic-server exec callback symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.cApplies SystemJS_* renames and adjusts debug strings.
src/mono/mono/mini/mini-wasm.cUpdates exported symbol name for diagnostic-server callback.
src/mono/mono/eventpipe/ep-rt-mono.hUpdates symbol name used to requeue EP jobs.
src/mono/browser/runtime/types/internal.tsRenames runtime helper from mono_wasm_ds_exec to SystemJS_ExecuteDiagnosticServerCallback.
src/mono/browser/runtime/exports.tsWires renamed diagnostic-server callback into runtime helpers export.
src/mono/browser/runtime/diagnostics/diagnostics-ws.tsAdds casts for ws.send and keeps WebSocket transport compiling.
src/mono/browser/runtime/diagnostics/common.tsSwitches to renamed diagnostic-server callback.
src/mono/browser/runtime/cwraps.tsUpdates cwrap bindings for renamed diagnostic-server callback.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/native/index.ts
CopilotAI review requested due to automatic review settings April 16, 2026 07:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 35 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/rollup.config.plugins.js
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
CopilotAI review requested due to automatic review settings April 16, 2026 08:57

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 37 changed files in this pull request and generated 4 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/Common/JavaScript/types/public-api.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/common.ts
@pavelsavara
pavelsavara marked this pull request as ready for review April 16, 2026 15:05
CopilotAI review requested due to automatic review settings April 16, 2026 15:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 39 out of 41 changed files in this pull request and generated 7 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts

@marafmaraf left a comment

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.

Looks good to me & my copilot 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated issues

@pavelsavara
pavelsavara merged commit 69fb4fe into dotnet:mainApr 17, 2026
170 of 177 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_coreclr_js branch April 17, 2026 10:57
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-coreclros-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR - #126830

Merged
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js
Apr 17, 2026
Merged

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR#126830
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

Ports the EventPipe (EP) diagnostic server TypeScript implementation from the Mono.

This is just the JavaScript part split from #126324 for easier review.
(it doesn't work end to end yet)

Changes

New files — Diagnostic server (TypeScript)

These files under src/native/libs/System.Native.Browser/diagnostics/ implement the diagnostic server protocol and built-in diagnostic commands for the CoreCLR path:

  • client-commands.ts — IPC protocol serialization: EventPipe commands (CollectTracing2, StopTracing), process commands (ResumeRuntime, ProcessInfo3), GC heap dump, counters, and sample profiler command builders.
  • common.tsDiagnosticConnectionBase class with send/receive message buffering and heap memory read/write. downloadBlob() helper for trace file downloads.
  • diagnostic-server.ts — Core socket management: ds_rt_websocket_create/send/poll/recv/close functions that the C runtime calls via the cross-module exchange. Routes connections to either JS-based or WebSocket-based transports. connectDSRouter() for switching to dotnet-dsrouter. initializeDS() for startup configuration.
  • diagnostic-server-js.ts — In-browser JS diagnostic client: handles the IPC advert/response/data protocol without a WebSocket, supports scenario-based auto-start (js://gcdump, js://counters, js://cpu-samples) and custom globalThis.dotnetDiagnosticClient providers.
  • diagnostic-server-ws.ts — WebSocket transport for connecting to external tools via dotnet-dsrouter.
  • dotnet-gcdump.tscollectGcDump() — triggers a GC heap dump trace collection.
  • dotnet-counters.tscollectMetrics() — collects System.Runtime counters for a configurable duration.
  • dotnet-cpu-profiler.tscollectCpuSamples() — collects CPU sample profiling traces.
  • types.ts — Protocol enums (CommandSetId, EventPipeCommandId, Keywords, etc.) and interfaces (IDiagnosticConnection, IDiagnosticSession, IDiagnosticClient).

New files — Native bridge

  • diagnostic_server_jobs.c — C job queue for scheduling diagnostic server callbacks from native code. Used by the CoreCLR EventPipe runtime to post work back to the JS event loop.
  • diagnostic_server_jobs.h — Header with SystemJS_DiagnosticServerQueueJob and SystemJS_ExecuteDiagnosticServerCallback declarations.
  • native/diagnostics.ts — Thin forwarding layer that routes ds_rt_websocket_* calls from the emscripten native module to the diagnostics module via cross-module exports.
  • native/scheduling.tsSystemJS_ScheduleDiagnosticServer() — schedules the diagnostic server callback via safeSetTimeout, following the same pattern as timer/threadpool/finalization scheduling.

Modified files — Cross-module exchange wiring

  • Common/JavaScript/cross-module/index.ts — Added dotnetDiagnosticsExports and its diagnosticsExportsFromTable() deserializer for the new DiagnosticsExportsTable.
  • Common/JavaScript/types/exchange.ts — Added DiagnosticsExports, DiagnosticsExportsTable, and NativeBrowserExports.SystemJS_ScheduleDiagnosticServer types. Added imports for ds_rt_websocket_* and SystemJS_ScheduleDiagnosticServer.
  • Common/JavaScript/types/ems-ambient.ts — Added _SystemJS_ExecuteDiagnosticServerCallback and _SystemJS_ScheduleDiagnosticServer to the emscripten ambient type. Added lastScheduledDiagnosticServerId to DOTNET state.
  • Common/JavaScript/types/public-api.ts — Added DiagnosticsAPIType with collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to APIType.
  • Common/JavaScript/loader/dotnet.d.ts — Updated public type declarations to include DiagnosticsAPIType.
  • Common/JavaScript/CMakeLists.txt — Added new TypeScript source files to the rollup input list.

Modified files — Diagnostics module registration

  • System.Native.Browser/diagnostics/index.ts — Registers ds_rt_websocket_* in the DiagnosticsExportsTable and assigns collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to the public dotnetApi. Calls initializeDS() on module init.
  • System.Native.Browser/native/index.ts — Exports SystemJS_ScheduleDiagnosticServer and ds_rt_websocket_*. Adds SystemJS_ScheduleDiagnosticServer to NativeBrowserExportsTable.
  • System.Native.Browser/utils/scheduling.ts — Added _SystemJS_ExecuteDiagnosticServerCallback() to runBackgroundTimers() and cleanup to abortBackgroundTimers().
  • System.Native.Browser/libSystem.Native.Browser.footer.js — Added SystemJS_ExecuteDiagnosticServerCallback to the emscripten exported functions list.
  • System.Native.Browser/CMakeLists.txt — Added diagnostic_server_jobs.c to the build.

Modified files — Mono renames

Mechanical rename of C/TypeScript symbols to follow the SystemJS_ convention:

  • mono_wasm_ds_execSystemJS_ExecuteDiagnosticServerCallback (C function and all TS wrappers)
  • mono_schedule_ds_jobSystemJS_DiagnosticServerQueueJob (C function and all callers)

Affected files:

  • src/mono/browser/runtime/cwraps.ts
  • src/mono/browser/runtime/diagnostics/common.ts
  • src/mono/browser/runtime/diagnostics/diagnostics-ws.ts (also added as any casts for ws.send)
  • src/mono/browser/runtime/exports.ts
  • src/mono/browser/runtime/types/internal.ts
  • src/mono/mono/eventpipe/ep-rt-mono.h
  • src/mono/mono/mini/mini-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.h
  • src/mono/mono/utils/mono-threads.h

Other

  • rollup.config.plugins.js — Extended circular dependency warning suppression to include diagnostics-js module (in addition to existing marshal-to-cs/marshal-to-js).

- renamed SystemJS_ExecuteDiagnosticServerCallback, SystemJS_DiagnosticServerQueueJob
@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 13, 2026
@pavelsavarapavelsavara self-assigned this Apr 13, 2026
CopilotAI review requested due to automatic review settings April 13, 2026 10:08
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-Diagnostics-coreclr os-browser Browser variant of arch-wasm labels Apr 13, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Ports the EventPipe diagnostic server TypeScript implementation into the CoreCLR browser runtime path, adding a JS/TS diagnostic server (JS-transport + dsrouter WebSocket transport) and wiring it through the existing cross-module exchange so native EventPipe can drive it.

Changes:

  • Added CoreCLR browser diagnostics server implementation (protocol, transports, and built-in commands for gcdump/counters/cpu-samples).
  • Added native job-queue bridge and scheduling hook so native code can post diagnostic-server work back onto the JS event loop.
  • Extended cross-module exchange/types and build wiring (rollup + CMake) to include the new exports and sources.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/native/rollup.config.plugins.jsSuppresses circular-dependency warnings for diagnostics module.
src/native/libs/System.Native.Browser/utils/scheduling.tsRuns/aborts diagnostic-server callback as part of background timer processing.
src/native/libs/System.Native.Browser/native/scheduling.tsAdds SystemJS_ScheduleDiagnosticServer() JS scheduling function.
src/native/libs/System.Native.Browser/native/index.tsExposes diagnostic scheduling + websocket shims via cross-module exchange.
src/native/libs/System.Native.Browser/native/diagnostics.tsForwards ds_rt_websocket_* from native module to diagnostics module via exchange.
src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.jsExports SystemJS_ExecuteDiagnosticServerCallback to JS.
src/native/libs/System.Native.Browser/diagnostics/types.tsAdds diagnostics protocol and client/session interfaces + enums.
src/native/libs/System.Native.Browser/diagnostics/index.tsRegisters diagnostics exports and wires new public API methods.
src/native/libs/System.Native.Browser/diagnostics/dotnet-gcdump.tsImplements collectGcDump() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-cpu-profiler.tsImplements collectCpuSamples() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-counters.tsImplements collectMetrics() command helper.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server.tsCore connection routing + ds_rt_websocket_* entrypoints + dsrouter reconnect.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-ws.tsWebSocket transport implementation for dsrouter.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.tsIn-browser “JS transport” implementation + scenario-based auto-start plumbing.
src/native/libs/System.Native.Browser/diagnostics/common.tsShared buffering + heap read/write + trace download helper.
src/native/libs/System.Native.Browser/diagnostics/client-commands.tsIPC protocol serialization for EventPipe/process commands.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.hDeclares diagnostic-server native job queue API.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.cImplements diagnostic-server native job queue.
src/native/libs/System.Native.Browser/CMakeLists.txtAdds diagnostic_server_jobs.c to System.Native.Browser build.
src/native/libs/Common/JavaScript/types/public-api.tsUpdates public diagnostics option types (providerName).
src/native/libs/Common/JavaScript/types/exchange.tsAdds diagnostics exports table + diagnostic scheduling export type.
src/native/libs/Common/JavaScript/types/ems-ambient.tsAdds ambient typings for diagnostic-server callbacks/scheduling state.
src/native/libs/Common/JavaScript/loader/dotnet.d.tsUpdates generated public typings (providerName).
src/native/libs/Common/JavaScript/cross-module/index.tsDeserializes new cross-module exports for diagnostics + native browser.
src/native/libs/Common/JavaScript/CMakeLists.txtAdds new diagnostics TS sources to rollup input set.
src/mono/mono/utils/mono-threads.hRenames diagnostic-server scheduling symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.hRenames diagnostic-server exec callback symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.cApplies SystemJS_* renames and adjusts debug strings.
src/mono/mono/mini/mini-wasm.cUpdates exported symbol name for diagnostic-server callback.
src/mono/mono/eventpipe/ep-rt-mono.hUpdates symbol name used to requeue EP jobs.
src/mono/browser/runtime/types/internal.tsRenames runtime helper from mono_wasm_ds_exec to SystemJS_ExecuteDiagnosticServerCallback.
src/mono/browser/runtime/exports.tsWires renamed diagnostic-server callback into runtime helpers export.
src/mono/browser/runtime/diagnostics/diagnostics-ws.tsAdds casts for ws.send and keeps WebSocket transport compiling.
src/mono/browser/runtime/diagnostics/common.tsSwitches to renamed diagnostic-server callback.
src/mono/browser/runtime/cwraps.tsUpdates cwrap bindings for renamed diagnostic-server callback.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/native/index.ts
CopilotAI review requested due to automatic review settings April 16, 2026 07:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 35 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/rollup.config.plugins.js
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
CopilotAI review requested due to automatic review settings April 16, 2026 08:57

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 37 changed files in this pull request and generated 4 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/Common/JavaScript/types/public-api.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/common.ts
@pavelsavara
pavelsavara marked this pull request as ready for review April 16, 2026 15:05
CopilotAI review requested due to automatic review settings April 16, 2026 15:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 39 out of 41 changed files in this pull request and generated 7 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts

@marafmaraf left a comment

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.

Looks good to me & my copilot 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated issues

@pavelsavara
pavelsavara merged commit 69fb4fe into dotnet:mainApr 17, 2026
170 of 177 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_coreclr_js branch April 17, 2026 10:57
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-coreclros-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@maraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR by pavelsavara · Pull Request #126830 · dotnet/runtime · GitHub
Skip to content

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR - #126830

Merged
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js
Apr 17, 2026
Merged

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR#126830
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

Ports the EventPipe (EP) diagnostic server TypeScript implementation from the Mono.

This is just the JavaScript part split from #126324 for easier review.
(it doesn't work end to end yet)

Changes

New files — Diagnostic server (TypeScript)

These files under src/native/libs/System.Native.Browser/diagnostics/ implement the diagnostic server protocol and built-in diagnostic commands for the CoreCLR path:

  • client-commands.ts — IPC protocol serialization: EventPipe commands (CollectTracing2, StopTracing), process commands (ResumeRuntime, ProcessInfo3), GC heap dump, counters, and sample profiler command builders.
  • common.tsDiagnosticConnectionBase class with send/receive message buffering and heap memory read/write. downloadBlob() helper for trace file downloads.
  • diagnostic-server.ts — Core socket management: ds_rt_websocket_create/send/poll/recv/close functions that the C runtime calls via the cross-module exchange. Routes connections to either JS-based or WebSocket-based transports. connectDSRouter() for switching to dotnet-dsrouter. initializeDS() for startup configuration.
  • diagnostic-server-js.ts — In-browser JS diagnostic client: handles the IPC advert/response/data protocol without a WebSocket, supports scenario-based auto-start (js://gcdump, js://counters, js://cpu-samples) and custom globalThis.dotnetDiagnosticClient providers.
  • diagnostic-server-ws.ts — WebSocket transport for connecting to external tools via dotnet-dsrouter.
  • dotnet-gcdump.tscollectGcDump() — triggers a GC heap dump trace collection.
  • dotnet-counters.tscollectMetrics() — collects System.Runtime counters for a configurable duration.
  • dotnet-cpu-profiler.tscollectCpuSamples() — collects CPU sample profiling traces.
  • types.ts — Protocol enums (CommandSetId, EventPipeCommandId, Keywords, etc.) and interfaces (IDiagnosticConnection, IDiagnosticSession, IDiagnosticClient).

New files — Native bridge

  • diagnostic_server_jobs.c — C job queue for scheduling diagnostic server callbacks from native code. Used by the CoreCLR EventPipe runtime to post work back to the JS event loop.
  • diagnostic_server_jobs.h — Header with SystemJS_DiagnosticServerQueueJob and SystemJS_ExecuteDiagnosticServerCallback declarations.
  • native/diagnostics.ts — Thin forwarding layer that routes ds_rt_websocket_* calls from the emscripten native module to the diagnostics module via cross-module exports.
  • native/scheduling.tsSystemJS_ScheduleDiagnosticServer() — schedules the diagnostic server callback via safeSetTimeout, following the same pattern as timer/threadpool/finalization scheduling.

Modified files — Cross-module exchange wiring

  • Common/JavaScript/cross-module/index.ts — Added dotnetDiagnosticsExports and its diagnosticsExportsFromTable() deserializer for the new DiagnosticsExportsTable.
  • Common/JavaScript/types/exchange.ts — Added DiagnosticsExports, DiagnosticsExportsTable, and NativeBrowserExports.SystemJS_ScheduleDiagnosticServer types. Added imports for ds_rt_websocket_* and SystemJS_ScheduleDiagnosticServer.
  • Common/JavaScript/types/ems-ambient.ts — Added _SystemJS_ExecuteDiagnosticServerCallback and _SystemJS_ScheduleDiagnosticServer to the emscripten ambient type. Added lastScheduledDiagnosticServerId to DOTNET state.
  • Common/JavaScript/types/public-api.ts — Added DiagnosticsAPIType with collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to APIType.
  • Common/JavaScript/loader/dotnet.d.ts — Updated public type declarations to include DiagnosticsAPIType.
  • Common/JavaScript/CMakeLists.txt — Added new TypeScript source files to the rollup input list.

Modified files — Diagnostics module registration

  • System.Native.Browser/diagnostics/index.ts — Registers ds_rt_websocket_* in the DiagnosticsExportsTable and assigns collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to the public dotnetApi. Calls initializeDS() on module init.
  • System.Native.Browser/native/index.ts — Exports SystemJS_ScheduleDiagnosticServer and ds_rt_websocket_*. Adds SystemJS_ScheduleDiagnosticServer to NativeBrowserExportsTable.
  • System.Native.Browser/utils/scheduling.ts — Added _SystemJS_ExecuteDiagnosticServerCallback() to runBackgroundTimers() and cleanup to abortBackgroundTimers().
  • System.Native.Browser/libSystem.Native.Browser.footer.js — Added SystemJS_ExecuteDiagnosticServerCallback to the emscripten exported functions list.
  • System.Native.Browser/CMakeLists.txt — Added diagnostic_server_jobs.c to the build.

Modified files — Mono renames

Mechanical rename of C/TypeScript symbols to follow the SystemJS_ convention:

  • mono_wasm_ds_execSystemJS_ExecuteDiagnosticServerCallback (C function and all TS wrappers)
  • mono_schedule_ds_jobSystemJS_DiagnosticServerQueueJob (C function and all callers)

Affected files:

  • src/mono/browser/runtime/cwraps.ts
  • src/mono/browser/runtime/diagnostics/common.ts
  • src/mono/browser/runtime/diagnostics/diagnostics-ws.ts (also added as any casts for ws.send)
  • src/mono/browser/runtime/exports.ts
  • src/mono/browser/runtime/types/internal.ts
  • src/mono/mono/eventpipe/ep-rt-mono.h
  • src/mono/mono/mini/mini-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.h
  • src/mono/mono/utils/mono-threads.h

Other

  • rollup.config.plugins.js — Extended circular dependency warning suppression to include diagnostics-js module (in addition to existing marshal-to-cs/marshal-to-js).

- renamed SystemJS_ExecuteDiagnosticServerCallback, SystemJS_DiagnosticServerQueueJob
@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 13, 2026
@pavelsavarapavelsavara self-assigned this Apr 13, 2026
CopilotAI review requested due to automatic review settings April 13, 2026 10:08
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-Diagnostics-coreclr os-browser Browser variant of arch-wasm labels Apr 13, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Ports the EventPipe diagnostic server TypeScript implementation into the CoreCLR browser runtime path, adding a JS/TS diagnostic server (JS-transport + dsrouter WebSocket transport) and wiring it through the existing cross-module exchange so native EventPipe can drive it.

Changes:

  • Added CoreCLR browser diagnostics server implementation (protocol, transports, and built-in commands for gcdump/counters/cpu-samples).
  • Added native job-queue bridge and scheduling hook so native code can post diagnostic-server work back onto the JS event loop.
  • Extended cross-module exchange/types and build wiring (rollup + CMake) to include the new exports and sources.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/native/rollup.config.plugins.jsSuppresses circular-dependency warnings for diagnostics module.
src/native/libs/System.Native.Browser/utils/scheduling.tsRuns/aborts diagnostic-server callback as part of background timer processing.
src/native/libs/System.Native.Browser/native/scheduling.tsAdds SystemJS_ScheduleDiagnosticServer() JS scheduling function.
src/native/libs/System.Native.Browser/native/index.tsExposes diagnostic scheduling + websocket shims via cross-module exchange.
src/native/libs/System.Native.Browser/native/diagnostics.tsForwards ds_rt_websocket_* from native module to diagnostics module via exchange.
src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.jsExports SystemJS_ExecuteDiagnosticServerCallback to JS.
src/native/libs/System.Native.Browser/diagnostics/types.tsAdds diagnostics protocol and client/session interfaces + enums.
src/native/libs/System.Native.Browser/diagnostics/index.tsRegisters diagnostics exports and wires new public API methods.
src/native/libs/System.Native.Browser/diagnostics/dotnet-gcdump.tsImplements collectGcDump() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-cpu-profiler.tsImplements collectCpuSamples() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-counters.tsImplements collectMetrics() command helper.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server.tsCore connection routing + ds_rt_websocket_* entrypoints + dsrouter reconnect.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-ws.tsWebSocket transport implementation for dsrouter.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.tsIn-browser “JS transport” implementation + scenario-based auto-start plumbing.
src/native/libs/System.Native.Browser/diagnostics/common.tsShared buffering + heap read/write + trace download helper.
src/native/libs/System.Native.Browser/diagnostics/client-commands.tsIPC protocol serialization for EventPipe/process commands.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.hDeclares diagnostic-server native job queue API.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.cImplements diagnostic-server native job queue.
src/native/libs/System.Native.Browser/CMakeLists.txtAdds diagnostic_server_jobs.c to System.Native.Browser build.
src/native/libs/Common/JavaScript/types/public-api.tsUpdates public diagnostics option types (providerName).
src/native/libs/Common/JavaScript/types/exchange.tsAdds diagnostics exports table + diagnostic scheduling export type.
src/native/libs/Common/JavaScript/types/ems-ambient.tsAdds ambient typings for diagnostic-server callbacks/scheduling state.
src/native/libs/Common/JavaScript/loader/dotnet.d.tsUpdates generated public typings (providerName).
src/native/libs/Common/JavaScript/cross-module/index.tsDeserializes new cross-module exports for diagnostics + native browser.
src/native/libs/Common/JavaScript/CMakeLists.txtAdds new diagnostics TS sources to rollup input set.
src/mono/mono/utils/mono-threads.hRenames diagnostic-server scheduling symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.hRenames diagnostic-server exec callback symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.cApplies SystemJS_* renames and adjusts debug strings.
src/mono/mono/mini/mini-wasm.cUpdates exported symbol name for diagnostic-server callback.
src/mono/mono/eventpipe/ep-rt-mono.hUpdates symbol name used to requeue EP jobs.
src/mono/browser/runtime/types/internal.tsRenames runtime helper from mono_wasm_ds_exec to SystemJS_ExecuteDiagnosticServerCallback.
src/mono/browser/runtime/exports.tsWires renamed diagnostic-server callback into runtime helpers export.
src/mono/browser/runtime/diagnostics/diagnostics-ws.tsAdds casts for ws.send and keeps WebSocket transport compiling.
src/mono/browser/runtime/diagnostics/common.tsSwitches to renamed diagnostic-server callback.
src/mono/browser/runtime/cwraps.tsUpdates cwrap bindings for renamed diagnostic-server callback.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/native/index.ts
CopilotAI review requested due to automatic review settings April 16, 2026 07:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 35 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/rollup.config.plugins.js
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
CopilotAI review requested due to automatic review settings April 16, 2026 08:57

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 37 changed files in this pull request and generated 4 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/Common/JavaScript/types/public-api.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/common.ts
@pavelsavara
pavelsavara marked this pull request as ready for review April 16, 2026 15:05
CopilotAI review requested due to automatic review settings April 16, 2026 15:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 39 out of 41 changed files in this pull request and generated 7 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts

@marafmaraf left a comment

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.

Looks good to me & my copilot 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated issues

@pavelsavara
pavelsavara merged commit 69fb4fe into dotnet:mainApr 17, 2026
170 of 177 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_coreclr_js branch April 17, 2026 10:57
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-coreclros-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@maraf
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR by pavelsavara · Pull Request #126830 · dotnet/runtime · GitHub
Skip to content

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR - #126830

Merged
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js
Apr 17, 2026
Merged

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR#126830
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

Ports the EventPipe (EP) diagnostic server TypeScript implementation from the Mono.

This is just the JavaScript part split from #126324 for easier review.
(it doesn't work end to end yet)

Changes

New files — Diagnostic server (TypeScript)

These files under src/native/libs/System.Native.Browser/diagnostics/ implement the diagnostic server protocol and built-in diagnostic commands for the CoreCLR path:

  • client-commands.ts — IPC protocol serialization: EventPipe commands (CollectTracing2, StopTracing), process commands (ResumeRuntime, ProcessInfo3), GC heap dump, counters, and sample profiler command builders.
  • common.tsDiagnosticConnectionBase class with send/receive message buffering and heap memory read/write. downloadBlob() helper for trace file downloads.
  • diagnostic-server.ts — Core socket management: ds_rt_websocket_create/send/poll/recv/close functions that the C runtime calls via the cross-module exchange. Routes connections to either JS-based or WebSocket-based transports. connectDSRouter() for switching to dotnet-dsrouter. initializeDS() for startup configuration.
  • diagnostic-server-js.ts — In-browser JS diagnostic client: handles the IPC advert/response/data protocol without a WebSocket, supports scenario-based auto-start (js://gcdump, js://counters, js://cpu-samples) and custom globalThis.dotnetDiagnosticClient providers.
  • diagnostic-server-ws.ts — WebSocket transport for connecting to external tools via dotnet-dsrouter.
  • dotnet-gcdump.tscollectGcDump() — triggers a GC heap dump trace collection.
  • dotnet-counters.tscollectMetrics() — collects System.Runtime counters for a configurable duration.
  • dotnet-cpu-profiler.tscollectCpuSamples() — collects CPU sample profiling traces.
  • types.ts — Protocol enums (CommandSetId, EventPipeCommandId, Keywords, etc.) and interfaces (IDiagnosticConnection, IDiagnosticSession, IDiagnosticClient).

New files — Native bridge

  • diagnostic_server_jobs.c — C job queue for scheduling diagnostic server callbacks from native code. Used by the CoreCLR EventPipe runtime to post work back to the JS event loop.
  • diagnostic_server_jobs.h — Header with SystemJS_DiagnosticServerQueueJob and SystemJS_ExecuteDiagnosticServerCallback declarations.
  • native/diagnostics.ts — Thin forwarding layer that routes ds_rt_websocket_* calls from the emscripten native module to the diagnostics module via cross-module exports.
  • native/scheduling.tsSystemJS_ScheduleDiagnosticServer() — schedules the diagnostic server callback via safeSetTimeout, following the same pattern as timer/threadpool/finalization scheduling.

Modified files — Cross-module exchange wiring

  • Common/JavaScript/cross-module/index.ts — Added dotnetDiagnosticsExports and its diagnosticsExportsFromTable() deserializer for the new DiagnosticsExportsTable.
  • Common/JavaScript/types/exchange.ts — Added DiagnosticsExports, DiagnosticsExportsTable, and NativeBrowserExports.SystemJS_ScheduleDiagnosticServer types. Added imports for ds_rt_websocket_* and SystemJS_ScheduleDiagnosticServer.
  • Common/JavaScript/types/ems-ambient.ts — Added _SystemJS_ExecuteDiagnosticServerCallback and _SystemJS_ScheduleDiagnosticServer to the emscripten ambient type. Added lastScheduledDiagnosticServerId to DOTNET state.
  • Common/JavaScript/types/public-api.ts — Added DiagnosticsAPIType with collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to APIType.
  • Common/JavaScript/loader/dotnet.d.ts — Updated public type declarations to include DiagnosticsAPIType.
  • Common/JavaScript/CMakeLists.txt — Added new TypeScript source files to the rollup input list.

Modified files — Diagnostics module registration

  • System.Native.Browser/diagnostics/index.ts — Registers ds_rt_websocket_* in the DiagnosticsExportsTable and assigns collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to the public dotnetApi. Calls initializeDS() on module init.
  • System.Native.Browser/native/index.ts — Exports SystemJS_ScheduleDiagnosticServer and ds_rt_websocket_*. Adds SystemJS_ScheduleDiagnosticServer to NativeBrowserExportsTable.
  • System.Native.Browser/utils/scheduling.ts — Added _SystemJS_ExecuteDiagnosticServerCallback() to runBackgroundTimers() and cleanup to abortBackgroundTimers().
  • System.Native.Browser/libSystem.Native.Browser.footer.js — Added SystemJS_ExecuteDiagnosticServerCallback to the emscripten exported functions list.
  • System.Native.Browser/CMakeLists.txt — Added diagnostic_server_jobs.c to the build.

Modified files — Mono renames

Mechanical rename of C/TypeScript symbols to follow the SystemJS_ convention:

  • mono_wasm_ds_execSystemJS_ExecuteDiagnosticServerCallback (C function and all TS wrappers)
  • mono_schedule_ds_jobSystemJS_DiagnosticServerQueueJob (C function and all callers)

Affected files:

  • src/mono/browser/runtime/cwraps.ts
  • src/mono/browser/runtime/diagnostics/common.ts
  • src/mono/browser/runtime/diagnostics/diagnostics-ws.ts (also added as any casts for ws.send)
  • src/mono/browser/runtime/exports.ts
  • src/mono/browser/runtime/types/internal.ts
  • src/mono/mono/eventpipe/ep-rt-mono.h
  • src/mono/mono/mini/mini-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.h
  • src/mono/mono/utils/mono-threads.h

Other

  • rollup.config.plugins.js — Extended circular dependency warning suppression to include diagnostics-js module (in addition to existing marshal-to-cs/marshal-to-js).

- renamed SystemJS_ExecuteDiagnosticServerCallback, SystemJS_DiagnosticServerQueueJob
@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 13, 2026
@pavelsavarapavelsavara self-assigned this Apr 13, 2026
CopilotAI review requested due to automatic review settings April 13, 2026 10:08
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-Diagnostics-coreclr os-browser Browser variant of arch-wasm labels Apr 13, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Ports the EventPipe diagnostic server TypeScript implementation into the CoreCLR browser runtime path, adding a JS/TS diagnostic server (JS-transport + dsrouter WebSocket transport) and wiring it through the existing cross-module exchange so native EventPipe can drive it.

Changes:

  • Added CoreCLR browser diagnostics server implementation (protocol, transports, and built-in commands for gcdump/counters/cpu-samples).
  • Added native job-queue bridge and scheduling hook so native code can post diagnostic-server work back onto the JS event loop.
  • Extended cross-module exchange/types and build wiring (rollup + CMake) to include the new exports and sources.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/native/rollup.config.plugins.jsSuppresses circular-dependency warnings for diagnostics module.
src/native/libs/System.Native.Browser/utils/scheduling.tsRuns/aborts diagnostic-server callback as part of background timer processing.
src/native/libs/System.Native.Browser/native/scheduling.tsAdds SystemJS_ScheduleDiagnosticServer() JS scheduling function.
src/native/libs/System.Native.Browser/native/index.tsExposes diagnostic scheduling + websocket shims via cross-module exchange.
src/native/libs/System.Native.Browser/native/diagnostics.tsForwards ds_rt_websocket_* from native module to diagnostics module via exchange.
src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.jsExports SystemJS_ExecuteDiagnosticServerCallback to JS.
src/native/libs/System.Native.Browser/diagnostics/types.tsAdds diagnostics protocol and client/session interfaces + enums.
src/native/libs/System.Native.Browser/diagnostics/index.tsRegisters diagnostics exports and wires new public API methods.
src/native/libs/System.Native.Browser/diagnostics/dotnet-gcdump.tsImplements collectGcDump() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-cpu-profiler.tsImplements collectCpuSamples() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-counters.tsImplements collectMetrics() command helper.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server.tsCore connection routing + ds_rt_websocket_* entrypoints + dsrouter reconnect.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-ws.tsWebSocket transport implementation for dsrouter.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.tsIn-browser “JS transport” implementation + scenario-based auto-start plumbing.
src/native/libs/System.Native.Browser/diagnostics/common.tsShared buffering + heap read/write + trace download helper.
src/native/libs/System.Native.Browser/diagnostics/client-commands.tsIPC protocol serialization for EventPipe/process commands.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.hDeclares diagnostic-server native job queue API.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.cImplements diagnostic-server native job queue.
src/native/libs/System.Native.Browser/CMakeLists.txtAdds diagnostic_server_jobs.c to System.Native.Browser build.
src/native/libs/Common/JavaScript/types/public-api.tsUpdates public diagnostics option types (providerName).
src/native/libs/Common/JavaScript/types/exchange.tsAdds diagnostics exports table + diagnostic scheduling export type.
src/native/libs/Common/JavaScript/types/ems-ambient.tsAdds ambient typings for diagnostic-server callbacks/scheduling state.
src/native/libs/Common/JavaScript/loader/dotnet.d.tsUpdates generated public typings (providerName).
src/native/libs/Common/JavaScript/cross-module/index.tsDeserializes new cross-module exports for diagnostics + native browser.
src/native/libs/Common/JavaScript/CMakeLists.txtAdds new diagnostics TS sources to rollup input set.
src/mono/mono/utils/mono-threads.hRenames diagnostic-server scheduling symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.hRenames diagnostic-server exec callback symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.cApplies SystemJS_* renames and adjusts debug strings.
src/mono/mono/mini/mini-wasm.cUpdates exported symbol name for diagnostic-server callback.
src/mono/mono/eventpipe/ep-rt-mono.hUpdates symbol name used to requeue EP jobs.
src/mono/browser/runtime/types/internal.tsRenames runtime helper from mono_wasm_ds_exec to SystemJS_ExecuteDiagnosticServerCallback.
src/mono/browser/runtime/exports.tsWires renamed diagnostic-server callback into runtime helpers export.
src/mono/browser/runtime/diagnostics/diagnostics-ws.tsAdds casts for ws.send and keeps WebSocket transport compiling.
src/mono/browser/runtime/diagnostics/common.tsSwitches to renamed diagnostic-server callback.
src/mono/browser/runtime/cwraps.tsUpdates cwrap bindings for renamed diagnostic-server callback.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/native/index.ts
CopilotAI review requested due to automatic review settings April 16, 2026 07:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 35 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/rollup.config.plugins.js
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
CopilotAI review requested due to automatic review settings April 16, 2026 08:57

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 37 changed files in this pull request and generated 4 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/Common/JavaScript/types/public-api.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/common.ts
@pavelsavara
pavelsavara marked this pull request as ready for review April 16, 2026 15:05
CopilotAI review requested due to automatic review settings April 16, 2026 15:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 39 out of 41 changed files in this pull request and generated 7 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts

@marafmaraf left a comment

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.

Looks good to me & my copilot 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated issues

@pavelsavara
pavelsavara merged commit 69fb4fe into dotnet:mainApr 17, 2026
170 of 177 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_coreclr_js branch April 17, 2026 10:57
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-coreclros-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR - #126830

Merged
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js
Apr 17, 2026
Merged

[browser][event-pipe] EventPipe diagnostic server TypeScript for CoreCLR#126830
pavelsavara merged 9 commits into
dotnet:mainfrom
pavelsavara:browser_EP_coreclr_js

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 13, 2026

Copy link
Copy Markdown
Member

Summary

Ports the EventPipe (EP) diagnostic server TypeScript implementation from the Mono.

This is just the JavaScript part split from #126324 for easier review.
(it doesn't work end to end yet)

Changes

New files — Diagnostic server (TypeScript)

These files under src/native/libs/System.Native.Browser/diagnostics/ implement the diagnostic server protocol and built-in diagnostic commands for the CoreCLR path:

  • client-commands.ts — IPC protocol serialization: EventPipe commands (CollectTracing2, StopTracing), process commands (ResumeRuntime, ProcessInfo3), GC heap dump, counters, and sample profiler command builders.
  • common.tsDiagnosticConnectionBase class with send/receive message buffering and heap memory read/write. downloadBlob() helper for trace file downloads.
  • diagnostic-server.ts — Core socket management: ds_rt_websocket_create/send/poll/recv/close functions that the C runtime calls via the cross-module exchange. Routes connections to either JS-based or WebSocket-based transports. connectDSRouter() for switching to dotnet-dsrouter. initializeDS() for startup configuration.
  • diagnostic-server-js.ts — In-browser JS diagnostic client: handles the IPC advert/response/data protocol without a WebSocket, supports scenario-based auto-start (js://gcdump, js://counters, js://cpu-samples) and custom globalThis.dotnetDiagnosticClient providers.
  • diagnostic-server-ws.ts — WebSocket transport for connecting to external tools via dotnet-dsrouter.
  • dotnet-gcdump.tscollectGcDump() — triggers a GC heap dump trace collection.
  • dotnet-counters.tscollectMetrics() — collects System.Runtime counters for a configurable duration.
  • dotnet-cpu-profiler.tscollectCpuSamples() — collects CPU sample profiling traces.
  • types.ts — Protocol enums (CommandSetId, EventPipeCommandId, Keywords, etc.) and interfaces (IDiagnosticConnection, IDiagnosticSession, IDiagnosticClient).

New files — Native bridge

  • diagnostic_server_jobs.c — C job queue for scheduling diagnostic server callbacks from native code. Used by the CoreCLR EventPipe runtime to post work back to the JS event loop.
  • diagnostic_server_jobs.h — Header with SystemJS_DiagnosticServerQueueJob and SystemJS_ExecuteDiagnosticServerCallback declarations.
  • native/diagnostics.ts — Thin forwarding layer that routes ds_rt_websocket_* calls from the emscripten native module to the diagnostics module via cross-module exports.
  • native/scheduling.tsSystemJS_ScheduleDiagnosticServer() — schedules the diagnostic server callback via safeSetTimeout, following the same pattern as timer/threadpool/finalization scheduling.

Modified files — Cross-module exchange wiring

  • Common/JavaScript/cross-module/index.ts — Added dotnetDiagnosticsExports and its diagnosticsExportsFromTable() deserializer for the new DiagnosticsExportsTable.
  • Common/JavaScript/types/exchange.ts — Added DiagnosticsExports, DiagnosticsExportsTable, and NativeBrowserExports.SystemJS_ScheduleDiagnosticServer types. Added imports for ds_rt_websocket_* and SystemJS_ScheduleDiagnosticServer.
  • Common/JavaScript/types/ems-ambient.ts — Added _SystemJS_ExecuteDiagnosticServerCallback and _SystemJS_ScheduleDiagnosticServer to the emscripten ambient type. Added lastScheduledDiagnosticServerId to DOTNET state.
  • Common/JavaScript/types/public-api.ts — Added DiagnosticsAPIType with collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to APIType.
  • Common/JavaScript/loader/dotnet.d.ts — Updated public type declarations to include DiagnosticsAPIType.
  • Common/JavaScript/CMakeLists.txt — Added new TypeScript source files to the rollup input list.

Modified files — Diagnostics module registration

  • System.Native.Browser/diagnostics/index.ts — Registers ds_rt_websocket_* in the DiagnosticsExportsTable and assigns collectCpuSamples, collectMetrics, collectGcDump, connectDSRouter to the public dotnetApi. Calls initializeDS() on module init.
  • System.Native.Browser/native/index.ts — Exports SystemJS_ScheduleDiagnosticServer and ds_rt_websocket_*. Adds SystemJS_ScheduleDiagnosticServer to NativeBrowserExportsTable.
  • System.Native.Browser/utils/scheduling.ts — Added _SystemJS_ExecuteDiagnosticServerCallback() to runBackgroundTimers() and cleanup to abortBackgroundTimers().
  • System.Native.Browser/libSystem.Native.Browser.footer.js — Added SystemJS_ExecuteDiagnosticServerCallback to the emscripten exported functions list.
  • System.Native.Browser/CMakeLists.txt — Added diagnostic_server_jobs.c to the build.

Modified files — Mono renames

Mechanical rename of C/TypeScript symbols to follow the SystemJS_ convention:

  • mono_wasm_ds_execSystemJS_ExecuteDiagnosticServerCallback (C function and all TS wrappers)
  • mono_schedule_ds_jobSystemJS_DiagnosticServerQueueJob (C function and all callers)

Affected files:

  • src/mono/browser/runtime/cwraps.ts
  • src/mono/browser/runtime/diagnostics/common.ts
  • src/mono/browser/runtime/diagnostics/diagnostics-ws.ts (also added as any casts for ws.send)
  • src/mono/browser/runtime/exports.ts
  • src/mono/browser/runtime/types/internal.ts
  • src/mono/mono/eventpipe/ep-rt-mono.h
  • src/mono/mono/mini/mini-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.c
  • src/mono/mono/utils/mono-threads-wasm.h
  • src/mono/mono/utils/mono-threads.h

Other

  • rollup.config.plugins.js — Extended circular dependency warning suppression to include diagnostics-js module (in addition to existing marshal-to-cs/marshal-to-js).

- renamed SystemJS_ExecuteDiagnosticServerCallback, SystemJS_DiagnosticServerQueueJob
@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 13, 2026
@pavelsavarapavelsavara self-assigned this Apr 13, 2026
CopilotAI review requested due to automatic review settings April 13, 2026 10:08
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-Diagnostics-coreclr os-browser Browser variant of arch-wasm labels Apr 13, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Ports the EventPipe diagnostic server TypeScript implementation into the CoreCLR browser runtime path, adding a JS/TS diagnostic server (JS-transport + dsrouter WebSocket transport) and wiring it through the existing cross-module exchange so native EventPipe can drive it.

Changes:

  • Added CoreCLR browser diagnostics server implementation (protocol, transports, and built-in commands for gcdump/counters/cpu-samples).
  • Added native job-queue bridge and scheduling hook so native code can post diagnostic-server work back onto the JS event loop.
  • Extended cross-module exchange/types and build wiring (rollup + CMake) to include the new exports and sources.

Reviewed changes

Copilot reviewed 34 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/native/rollup.config.plugins.jsSuppresses circular-dependency warnings for diagnostics module.
src/native/libs/System.Native.Browser/utils/scheduling.tsRuns/aborts diagnostic-server callback as part of background timer processing.
src/native/libs/System.Native.Browser/native/scheduling.tsAdds SystemJS_ScheduleDiagnosticServer() JS scheduling function.
src/native/libs/System.Native.Browser/native/index.tsExposes diagnostic scheduling + websocket shims via cross-module exchange.
src/native/libs/System.Native.Browser/native/diagnostics.tsForwards ds_rt_websocket_* from native module to diagnostics module via exchange.
src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.jsExports SystemJS_ExecuteDiagnosticServerCallback to JS.
src/native/libs/System.Native.Browser/diagnostics/types.tsAdds diagnostics protocol and client/session interfaces + enums.
src/native/libs/System.Native.Browser/diagnostics/index.tsRegisters diagnostics exports and wires new public API methods.
src/native/libs/System.Native.Browser/diagnostics/dotnet-gcdump.tsImplements collectGcDump() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-cpu-profiler.tsImplements collectCpuSamples() command helper.
src/native/libs/System.Native.Browser/diagnostics/dotnet-counters.tsImplements collectMetrics() command helper.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server.tsCore connection routing + ds_rt_websocket_* entrypoints + dsrouter reconnect.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-ws.tsWebSocket transport implementation for dsrouter.
src/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.tsIn-browser “JS transport” implementation + scenario-based auto-start plumbing.
src/native/libs/System.Native.Browser/diagnostics/common.tsShared buffering + heap read/write + trace download helper.
src/native/libs/System.Native.Browser/diagnostics/client-commands.tsIPC protocol serialization for EventPipe/process commands.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.hDeclares diagnostic-server native job queue API.
src/native/libs/System.Native.Browser/diagnostic_server_jobs.cImplements diagnostic-server native job queue.
src/native/libs/System.Native.Browser/CMakeLists.txtAdds diagnostic_server_jobs.c to System.Native.Browser build.
src/native/libs/Common/JavaScript/types/public-api.tsUpdates public diagnostics option types (providerName).
src/native/libs/Common/JavaScript/types/exchange.tsAdds diagnostics exports table + diagnostic scheduling export type.
src/native/libs/Common/JavaScript/types/ems-ambient.tsAdds ambient typings for diagnostic-server callbacks/scheduling state.
src/native/libs/Common/JavaScript/loader/dotnet.d.tsUpdates generated public typings (providerName).
src/native/libs/Common/JavaScript/cross-module/index.tsDeserializes new cross-module exports for diagnostics + native browser.
src/native/libs/Common/JavaScript/CMakeLists.txtAdds new diagnostics TS sources to rollup input set.
src/mono/mono/utils/mono-threads.hRenames diagnostic-server scheduling symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.hRenames diagnostic-server exec callback symbol to SystemJS_*.
src/mono/mono/utils/mono-threads-wasm.cApplies SystemJS_* renames and adjusts debug strings.
src/mono/mono/mini/mini-wasm.cUpdates exported symbol name for diagnostic-server callback.
src/mono/mono/eventpipe/ep-rt-mono.hUpdates symbol name used to requeue EP jobs.
src/mono/browser/runtime/types/internal.tsRenames runtime helper from mono_wasm_ds_exec to SystemJS_ExecuteDiagnosticServerCallback.
src/mono/browser/runtime/exports.tsWires renamed diagnostic-server callback into runtime helpers export.
src/mono/browser/runtime/diagnostics/diagnostics-ws.tsAdds casts for ws.send and keeps WebSocket transport compiling.
src/mono/browser/runtime/diagnostics/common.tsSwitches to renamed diagnostic-server callback.
src/mono/browser/runtime/cwraps.tsUpdates cwrap bindings for renamed diagnostic-server callback.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/native/index.ts
CopilotAI review requested due to automatic review settings April 16, 2026 07:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 34 out of 35 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/rollup.config.plugins.js
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
CopilotAI review requested due to automatic review settings April 16, 2026 08:57

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 36 out of 37 changed files in this pull request and generated 4 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server-js.ts Outdated
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/diagnostic-server.ts Outdated
Comment threadsrc/native/libs/Common/JavaScript/types/public-api.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/common.ts
@pavelsavara
pavelsavara marked this pull request as ready for review April 16, 2026 15:05
CopilotAI review requested due to automatic review settings April 16, 2026 15:05

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 39 out of 41 changed files in this pull request and generated 7 comments.

Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts
Comment threadsrc/native/libs/System.Native.Browser/diagnostics/types.ts

@marafmaraf left a comment

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.

Looks good to me & my copilot 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated issues

@pavelsavara
pavelsavara merged commit 69fb4fe into dotnet:mainApr 17, 2026
170 of 177 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_coreclr_js branch April 17, 2026 10:57
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 18, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-coreclros-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@maraf