40 lines
1.0 KiB
TypeScript
40 lines
1.0 KiB
TypeScript
import type { BrowserWindow } from 'electron';
|
|
import type { PerfDiagEntry } from './diagnostics.models';
|
|
|
|
export async function collectImmediateRendererSamples(
|
|
window: BrowserWindow | null | undefined
|
|
): Promise<PerfDiagEntry[]> {
|
|
if (!window || window.isDestroyed()) {
|
|
return [];
|
|
}
|
|
|
|
try {
|
|
const result = await window.webContents.executeJavaScript(`
|
|
(function () {
|
|
const collect = globalThis.__collectPerfDiagSample;
|
|
|
|
return typeof collect === 'function' ? collect() : [];
|
|
})()
|
|
`, true);
|
|
|
|
if (!Array.isArray(result)) {
|
|
return [];
|
|
}
|
|
|
|
return result
|
|
.filter((entry) => entry && typeof entry === 'object')
|
|
.map((entry) => normalizeImmediateRendererEntry(entry as Partial<PerfDiagEntry>));
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
function normalizeImmediateRendererEntry(entry: Partial<PerfDiagEntry>): PerfDiagEntry {
|
|
return {
|
|
collectedAt: Number(entry.collectedAt) || Date.now(),
|
|
source: 'renderer',
|
|
type: entry.type ?? 'session',
|
|
payload: entry.payload ?? {}
|
|
};
|
|
}
|