mirror of
https://github.com/morluto/rea
synced 2026-10-26 22:28:27 -04:00
b27e1a74c9
Resolve eight nested README links from their owning directory. Preserve the shared README/website inventory contract by registering Malayalam with an explicitly untranslated catalog and the existing visible, noindex English fallback. Regenerate the shared website navigation and catalog references. Existing parsed translations remain unchanged. Validation: docs check, full website check (401 HTML pages, 27790 local references, 19 tests), all 19 generated Malayalam fallback pages, and two source reviews. No Malayalam website translation or browser layout claim. Fixes #4821
515 lines
26 KiB
HTML
515 lines
26 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<title>JavaScript and Electron Analysis — REA</title>
|
||
<meta
|
||
name="description"
|
||
content="Trace a Notes CSV export through a renderer API, preload and IPC handler with REA. Includes downloadable example files and a verified analysis result."
|
||
/>
|
||
<!-- website:sharing:start -->
|
||
<!-- prettier-ignore -->
|
||
<link rel="canonical" href="https://rea.tools/guides/javascript/" />
|
||
<!-- website:languages:start -->
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="en" href="https://rea.tools/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="zh-CN" href="https://rea.tools/zh-CN/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="zh-TW" href="https://rea.tools/zh-TW/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="ja" href="https://rea.tools/ja/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="ko" href="https://rea.tools/ko/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="tr" href="https://rea.tools/tr/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="ru" href="https://rea.tools/ru/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="vi" href="https://rea.tools/vi/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="th" href="https://rea.tools/th/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="de" href="https://rea.tools/de/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="es" href="https://rea.tools/es/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="fr" href="https://rea.tools/fr/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="uk" href="https://rea.tools/uk/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="pl" href="https://rea.tools/pl/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="pt-BR" href="https://rea.tools/pt-BR/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="ar" href="https://rea.tools/ar/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="fa" href="https://rea.tools/fa/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="id" href="https://rea.tools/id/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="it" href="https://rea.tools/it/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="el" href="https://rea.tools/el/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="ml" href="https://rea.tools/ml/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<link rel="alternate" hreflang="x-default" href="https://rea.tools/guides/javascript/" />
|
||
<!-- website:languages:end -->
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:type" content="website" />
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:site_name" content="REA" />
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:title" content="JavaScript and Electron Analysis — REA" />
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:description" content="Trace a Notes CSV export through a renderer API, preload and IPC handler with REA. Includes downloadable example files and a verified analysis result." />
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:url" content="https://rea.tools/guides/javascript/" />
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:image" content="https://rea.tools/assets/social-card.png" />
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:image:type" content="image/png" />
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:image:width" content="1200" />
|
||
<!-- prettier-ignore -->
|
||
<meta property="og:image:height" content="630" />
|
||
<!-- prettier-ignore -->
|
||
<meta
|
||
property="og:image:alt"
|
||
content="REA — Find out how software works. Reverse engineering with your coding agent."
|
||
/>
|
||
<!-- prettier-ignore -->
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
<!-- prettier-ignore -->
|
||
<meta name="twitter:title" content="JavaScript and Electron Analysis — REA" />
|
||
<!-- prettier-ignore -->
|
||
<meta name="twitter:description" content="Trace a Notes CSV export through a renderer API, preload and IPC handler with REA. Includes downloadable example files and a verified analysis result." />
|
||
<!-- prettier-ignore -->
|
||
<meta name="twitter:image" content="https://rea.tools/assets/social-card.png" />
|
||
<!-- prettier-ignore -->
|
||
<meta
|
||
name="twitter:image:alt"
|
||
content="REA — Find out how software works. Reverse engineering with your coding agent."
|
||
/>
|
||
<!-- website:sharing:end -->
|
||
<!-- website:theme:start -->
|
||
<meta name="theme-color" content="#ffffff" />
|
||
<!-- Apply the saved theme before styles load, to avoid a flash on navigation. -->
|
||
<script src="../../assets/theme.js"></script>
|
||
<!-- website:theme:end -->
|
||
<link rel="icon" href="../../assets/favicon.svg" type="image/svg+xml" />
|
||
<link rel="stylesheet" href="../../assets/styles.css" />
|
||
<script src="../../assets/main.js" defer></script>
|
||
</head>
|
||
<body id="top">
|
||
<a class="skip-link" href="#main">Skip to content</a>
|
||
<!-- website:header:start -->
|
||
<!-- prettier-ignore -->
|
||
<header class="site-header">
|
||
<div class="container header-inner">
|
||
<a class="brand" href="../../" aria-label="REA home"
|
||
><span class="brand-name">REA</span
|
||
><span class="brand-caption" data-i18n-skip>Reverse Engineer Anything</span></a
|
||
>
|
||
<nav class="navigation" aria-label="Main navigation">
|
||
<a href="../../get-started/" class="nav-start">Get started</a>
|
||
<a href="../../showcase/">Showcases</a>
|
||
<a href="../../blog/">Blog</a>
|
||
<a href="../../guides/" aria-current="page">Guides</a>
|
||
<a href="../../faq/">FAQ</a>
|
||
<a href="../../contributors/">Contributors</a>
|
||
</nav>
|
||
<div class="header-social">
|
||
<details class="language-picker" data-i18n-skip><summary><span aria-hidden="true">文 / A</span> <span>English</span></summary><nav aria-label="English"><a href="../../guides/javascript/" lang="en" dir="ltr" data-language="en" aria-current="true">English</a><a href="../../zh-CN/guides/javascript/" lang="zh-CN" dir="ltr" data-language="zh-CN">简体中文</a><a href="../../zh-TW/guides/javascript/" lang="zh-TW" dir="ltr" data-language="zh-TW">繁體中文</a><a href="../../ja/guides/javascript/" lang="ja" dir="ltr" data-language="ja">日本語</a><a href="../../ko/guides/javascript/" lang="ko" dir="ltr" data-language="ko">한국어</a><a href="../../tr/guides/javascript/" lang="tr" dir="ltr" data-language="tr">Türkçe</a><a href="../../ru/guides/javascript/" lang="ru" dir="ltr" data-language="ru">Русский</a><a href="../../vi/guides/javascript/" lang="vi" dir="ltr" data-language="vi">Tiếng Việt</a><a href="../../th/guides/javascript/" lang="th" dir="ltr" data-language="th">ไทย</a><a href="../../de/guides/javascript/" lang="de" dir="ltr" data-language="de">Deutsch</a><a href="../../es/guides/javascript/" lang="es" dir="ltr" data-language="es">Español</a><a href="../../fr/guides/javascript/" lang="fr" dir="ltr" data-language="fr">Français</a><a href="../../uk/guides/javascript/" lang="uk" dir="ltr" data-language="uk">Українська</a><a href="../../pl/guides/javascript/" lang="pl" dir="ltr" data-language="pl">Polski</a><a href="../../pt-BR/guides/javascript/" lang="pt-BR" dir="ltr" data-language="pt-BR">Português (Brasil)</a><a href="../../ar/guides/javascript/" lang="ar" dir="rtl" data-language="ar">العربية</a><a href="../../fa/guides/javascript/" lang="fa" dir="rtl" data-language="fa">فارسی</a><a href="../../id/guides/javascript/" lang="id" dir="ltr" data-language="id">Bahasa Indonesia</a><a href="../../it/guides/javascript/" lang="it" dir="ltr" data-language="it">Italiano</a><a href="../../el/guides/javascript/" lang="el" dir="ltr" data-language="el">Ελληνικά</a><a href="../../ml/guides/javascript/" lang="ml" dir="ltr" data-language="ml">മലയാളം</a></nav></details>
|
||
<button class="theme-toggle" type="button" data-theme-toggle hidden>
|
||
<svg class="theme-moon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">
|
||
<path d="M20.9 13a9 9 0 0 1-9.9-9.9A9 9 0 1 0 20.9 13Z" />
|
||
</svg>
|
||
<svg class="theme-sun" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true" focusable="false">
|
||
<circle cx="12" cy="12" r="4" />
|
||
<path d="M12 2v2m0 16v2M2 12h2m16 0h2M4.93 4.93l1.42 1.42m11.3 11.3 1.42 1.42M4.93 19.07l1.42-1.42m11.3-11.3 1.42-1.42" />
|
||
</svg>
|
||
</button>
|
||
<a
|
||
class="nav-github"
|
||
href="https://github.com/morluto/rea"
|
||
aria-label="REA on GitHub"
|
||
title="REA on GitHub"
|
||
>
|
||
<svg
|
||
width="22"
|
||
height="22"
|
||
viewBox="0 0 16 16"
|
||
aria-hidden="true"
|
||
focusable="false"
|
||
>
|
||
<path
|
||
fill="currentColor"
|
||
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.65 7.65 0 0 1 2-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"
|
||
/>
|
||
</svg>
|
||
<span class="nav-github-count" hidden aria-hidden="true"></span>
|
||
</a>
|
||
<a
|
||
class="nav-discord"
|
||
href="https://discord.gg/GkcryMnJDM"
|
||
aria-label="Join REA on Discord"
|
||
title="Join REA on Discord"
|
||
>
|
||
<svg
|
||
width="22"
|
||
height="22"
|
||
viewBox="0 0 24 24"
|
||
aria-hidden="true"
|
||
focusable="false"
|
||
>
|
||
<path
|
||
fill="currentColor"
|
||
d="M20.317 4.3698a19.7913 19.7913 0 0 0-4.8851-1.5152.0741.0741 0 0 0-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 0 0-.0785-.037 19.7363 19.7363 0 0 0-4.8852 1.515.0699.0699 0 0 0-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 0 0 .0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 0 0 .0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 0 0-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 0 1-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 0 1 .0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 0 1 .0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 0 1-.0066.1276 12.2986 12.2986 0 0 1-1.873.8914.0766.0766 0 0 0-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 0 0 .0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 0 0 .0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 0 0-.0312-.0286ZM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189Zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z"
|
||
/>
|
||
</svg>
|
||
</a>
|
||
<a
|
||
class="nav-x"
|
||
href="https://x.com/reatools"
|
||
aria-label="Follow REA on X"
|
||
title="Follow REA on X"
|
||
>
|
||
<svg
|
||
width="18"
|
||
height="18"
|
||
viewBox="0 0 24 24"
|
||
aria-hidden="true"
|
||
focusable="false"
|
||
>
|
||
<path
|
||
fill="currentColor"
|
||
d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z"
|
||
/>
|
||
</svg>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
<!-- website:header:end -->
|
||
<main id="main" class="container">
|
||
<div class="page-heading">
|
||
<p class="breadcrumb">
|
||
<a href="../../">Home</a> / <a href="../">Guides</a> / JavaScript
|
||
& Electron
|
||
</p>
|
||
<h1>Trace an Electron<br />CSV export.</h1>
|
||
<p class="lede">
|
||
Follow a button click from the page API, through Electron IPC, to the
|
||
CSV file writer.
|
||
</p>
|
||
</div>
|
||
<div class="article-layout">
|
||
<nav class="contents" aria-label="On this page">
|
||
<p>In this guide</p>
|
||
<ul>
|
||
<li><a href="#example">The example</a></li>
|
||
<li><a href="#ask">Ask your agent</a></li>
|
||
<li><a href="#follow">Trace the export code</a></li>
|
||
<li><a href="#try">Try the example</a></li>
|
||
<li><a href="#next">Inspect the CSV writer</a></li>
|
||
</ul>
|
||
</nav>
|
||
<article class="article" aria-label="JavaScript & Electron">
|
||
<section class="article-section" id="example">
|
||
<h2>Where does “Export notes” go?</h2>
|
||
<p>
|
||
This guide uses a small Electron app. Clicking
|
||
<strong>Export notes</strong> calls an API in the page, crosses
|
||
into the main process, and writes a CSV. The behavior is spread
|
||
across several files.
|
||
</p>
|
||
<figure class="workflow-figure">
|
||
<p class="figure-title">
|
||
The CSV export across Electron processes
|
||
</p>
|
||
<ol class="flow-steps">
|
||
<li>
|
||
<span class="flow-label">Renderer → preload</span
|
||
><span class="flow-node"><code>notes.exportCsv()</code></span
|
||
><span class="flow-note"
|
||
><code>renderer.js</code> calls the API exposed by
|
||
<code>preload.js</code>.</span
|
||
>
|
||
</li>
|
||
<li>
|
||
<span class="flow-label">Between processes</span
|
||
><span class="flow-node"><code>notes:export</code></span
|
||
><span class="flow-note"
|
||
>The preload invokes an IPC channel: a named message to the
|
||
main process.</span
|
||
>
|
||
</li>
|
||
<li>
|
||
<span class="flow-label">Main process</span
|
||
><span class="flow-node">An export handler</span
|
||
><span class="flow-note"
|
||
><code>main.js</code> handles that channel and calls the CSV
|
||
writer.</span
|
||
>
|
||
</li>
|
||
</ol>
|
||
<p class="flow-result">
|
||
<code>csv.js</code> formats the notes →
|
||
<code>main.js</code> writes <code>downloads/notes.csv</code>.
|
||
</p>
|
||
<figcaption>
|
||
REA matches the literal IPC call to its handler and identifies
|
||
the exposed API. The path is inferred from code; a runtime
|
||
capture can check what executes.
|
||
</figcaption>
|
||
</figure>
|
||
</section>
|
||
<section class="article-section" id="ask">
|
||
<h2>Ask about the CSV export</h2>
|
||
<p>
|
||
<a href="../../get-started/#agent">Connect your agent to REA</a>
|
||
and give it the app directory or ASAR file:
|
||
</p>
|
||
<div class="agent-terminal">
|
||
<div class="terminal-header">
|
||
<span class="terminal-title"
|
||
><span class="terminal-dots" aria-hidden="true"
|
||
><i></i><i></i><i></i></span
|
||
>Your coding agent</span
|
||
><button
|
||
class="copy-button"
|
||
type="button"
|
||
data-copy="javascript-prompt"
|
||
aria-label="Copy example prompt"
|
||
>
|
||
Copy
|
||
</button>
|
||
</div>
|
||
<p class="terminal-prompt">
|
||
<span class="prompt-symbol" aria-hidden="true">›</span
|
||
><span id="javascript-prompt"
|
||
>Use REA to find what happens when I export notes in this app.
|
||
Where is the CSV created?</span
|
||
><span class="terminal-cursor" aria-hidden="true"></span>
|
||
</p>
|
||
</div>
|
||
<p class="caption">
|
||
Example prompt. Include the absolute path to the application
|
||
folder or <code>app.asar</code>.
|
||
</p>
|
||
<p>
|
||
REA reads the application files and builds a map of entrypoints,
|
||
modules and process boundaries. Your agent uses that map to narrow
|
||
the investigation to the export feature.
|
||
</p>
|
||
</section>
|
||
<section class="article-section" id="follow">
|
||
<h2>Trace the export code</h2>
|
||
<h3>The page calls a small API</h3>
|
||
<div class="code-block">
|
||
<div class="code-header">
|
||
<span
|
||
><span translate="no">renderer.js</span> · example
|
||
source</span
|
||
>
|
||
</div>
|
||
<pre><code>document.querySelector("#export").addEventListener("click", async () => {
|
||
const destination = await window.notes.exportCsv();
|
||
document.querySelector("#status").textContent = `Saved to ${destination}`;
|
||
});</code></pre>
|
||
</div>
|
||
<p>
|
||
The page knows the method name. The implementation lives in the
|
||
preload, which exposes it to the renderer.
|
||
</p>
|
||
<div class="code-block">
|
||
<div class="code-header">
|
||
<span
|
||
><span translate="no">preload.js</span> · example source</span
|
||
>
|
||
</div>
|
||
<pre><code>contextBridge.exposeInMainWorld("notes", {
|
||
exportCsv: () => ipcRenderer.invoke("notes:export"),
|
||
});</code></pre>
|
||
</div>
|
||
<p>
|
||
REA records <code>notes.exportCsv</code> and the literal channel
|
||
<code>notes:export</code>. It pairs that invocation with the
|
||
single matching handler in the main process.
|
||
</p>
|
||
<div class="code-block">
|
||
<div class="code-header">
|
||
<span
|
||
><span translate="no">main.js</span> · example source</span
|
||
>
|
||
</div>
|
||
<pre><code>ipcMain.handle("notes:export", () => {
|
||
const destination = path.join(app.getPath("downloads"), "notes.csv");
|
||
writeFileSync(destination, toCsv(notes), "utf8");
|
||
return destination;
|
||
});</code></pre>
|
||
</div>
|
||
<p>
|
||
Reading the handler answers the original question:
|
||
<code>csv.js</code> formats the notes, and the main process writes
|
||
<code>notes.csv</code> into the user's Downloads folder.
|
||
</p>
|
||
<div class="code-block">
|
||
<div class="code-header">
|
||
<span>REA result · summary.ipc excerpt</span>
|
||
</div>
|
||
<pre><code>{
|
||
"literal_channels": 1,
|
||
"renderer_transmissions": 1,
|
||
"main_handlers": 1,
|
||
"paired_renderer_transmissions": 1,
|
||
"ambiguous_renderer_transmissions": 0
|
||
}</code></pre>
|
||
</div>
|
||
<p class="caption">
|
||
Recorded by REA 4.1.0 on the downloadable example below. Source
|
||
locations accompany the API, channel and handler findings.
|
||
</p>
|
||
</section>
|
||
<section class="article-section" id="try">
|
||
<h2>Analyze the example yourself</h2>
|
||
<p>
|
||
Download the example and unzip it. The archive contains the
|
||
complete <code>notes-example</code> folder. Analyze it with
|
||
<span translate="no">Node.js</span> and npm; Electron is not
|
||
needed for this example.
|
||
</p>
|
||
<p>
|
||
<a
|
||
class="button"
|
||
href="../../examples/notes-example.zip"
|
||
download="notes-example.zip"
|
||
>Download example ZIP</a
|
||
>
|
||
</p>
|
||
<details class="evidence-details">
|
||
<summary>Browse the six source files</summary>
|
||
<ul class="example-files">
|
||
<li>
|
||
<a href="../../examples/notes-electron/package.json" download
|
||
><span translate="no">package.json</span></a
|
||
>
|
||
</li>
|
||
<li>
|
||
<a href="../../examples/notes-electron/main.js" download
|
||
><span translate="no">main.js</span></a
|
||
>
|
||
</li>
|
||
<li>
|
||
<a href="../../examples/notes-electron/preload.js" download
|
||
><span translate="no">preload.js</span></a
|
||
>
|
||
</li>
|
||
<li>
|
||
<a href="../../examples/notes-electron/renderer.js" download
|
||
><span translate="no">renderer.js</span></a
|
||
>
|
||
</li>
|
||
<li>
|
||
<a href="../../examples/notes-electron/csv.js" download
|
||
><span translate="no">csv.js</span></a
|
||
>
|
||
</li>
|
||
<li>
|
||
<a href="../../examples/notes-electron/index.html" download
|
||
><span translate="no">index.html</span></a
|
||
>
|
||
</li>
|
||
</ul>
|
||
</details>
|
||
<div class="code-block">
|
||
<div class="code-header">
|
||
<span>Static application analysis</span
|
||
><button
|
||
class="copy-button"
|
||
type="button"
|
||
data-copy="javascript-command"
|
||
aria-label="Copy static application analysis"
|
||
>
|
||
Copy
|
||
</button>
|
||
</div>
|
||
<pre><code id="javascript-command">npx -y rea-agents@latest analyze-javascript-application \
|
||
/absolute/path/to/notes-example --json</code></pre>
|
||
</div>
|
||
<p>
|
||
Replace the path with the folder you unzipped. You should find one
|
||
IPC channel and one matching handler in
|
||
<code>normalized_result.summary.ipc</code>. Source locations are
|
||
in <code>normalized_result.graph</code>.
|
||
</p>
|
||
<p>
|
||
For your own app, use the same command with its directory or ASAR
|
||
path. An agent can follow a literal string, API name or IPC
|
||
channel with REA's feature tracing tools.
|
||
</p>
|
||
</section>
|
||
<section class="article-section" id="next">
|
||
<h2>Inspect the CSV writer</h2>
|
||
<blockquote class="prompt">
|
||
<p>
|
||
Follow <code>notes:export</code> to its handler. Which inputs
|
||
reach the CSV writer, and what happens if writing the file
|
||
fails?
|
||
</p>
|
||
</blockquote>
|
||
<p>
|
||
Use the source locations to inspect those details. Computed
|
||
channel names and ambiguous handlers can remain unresolved;
|
||
runtime observations give you another way to investigate them.
|
||
</p>
|
||
<ul class="reading-list">
|
||
<li>
|
||
<a href="../../showcase/notion/"
|
||
>Follow Notion's clipboard bridge</a
|
||
>
|
||
<span>Apply the same approach to a packaged Electron app.</span>
|
||
</li>
|
||
<li>
|
||
<a href="../browser/">Observe a browser export</a
|
||
><span
|
||
>Capture a real click and see which request it makes.</span
|
||
>
|
||
</li>
|
||
<li>
|
||
<a href="../native/">Follow a native function</a
|
||
><span
|
||
>Continue into a binary when a feature depends on native
|
||
code.</span
|
||
>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
</article>
|
||
</div>
|
||
</main>
|
||
<!-- website:footer:start -->
|
||
<!-- prettier-ignore -->
|
||
<footer class="site-footer">
|
||
<div class="container footer-inner">
|
||
<p>REA · Reverse Engineer Anything</p>
|
||
<div class="footer-links">
|
||
<a href="../../contributors/">Contributors</a
|
||
><a href="https://github.com/morluto/rea">Source</a
|
||
><a href="https://github.com/morluto/rea/blob/main/LICENSE">MIT license</a
|
||
><a href="https://discord.gg/GkcryMnJDM">Join the community</a
|
||
><a href="https://x.com/reatools">Follow us on X</a>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
<p class="sr-only" id="copy-status" role="status" aria-live="polite"></p>
|
||
<a class="back-to-top" href="#top" aria-label="Back to top">
|
||
<span aria-hidden="true">↑</span> Top
|
||
</a>
|
||
<!-- website:footer:end -->
|
||
</body>
|
||
</html>
|