@rvanbaalen/roxyproxy 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -7
- package/dist/cli/commands/requests.js +150 -4
- package/dist/cli/commands/requests.js.map +1 -1
- package/dist/cli/format.d.ts +10 -0
- package/dist/cli/format.js +55 -12
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/tail-ui.d.ts +3 -0
- package/dist/cli/tail-ui.js +322 -0
- package/dist/cli/tail-ui.js.map +1 -0
- package/dist/server/api.d.ts +2 -1
- package/dist/server/api.js +17 -1
- package/dist/server/api.js.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
6
|
HTTP/HTTPS intercepting proxy with a CLI and web UI.<br>
|
|
7
|
-
Captures traffic, stores it in SQLite, and makes it queryable -- by humans and LLMs alike
|
|
7
|
+
Captures traffic, stores it in SQLite, and makes it queryable -- by humans and LLMs alike.<br>
|
|
8
|
+
<strong>Developed and tested on macOS.</strong>
|
|
8
9
|
</p>
|
|
9
10
|
|
|
10
11
|
<p align="center">
|
|
@@ -13,6 +14,7 @@
|
|
|
13
14
|
|
|
14
15
|
## Table of Contents
|
|
15
16
|
|
|
17
|
+
- [Platform](#platform)
|
|
16
18
|
- [Installation](#installation)
|
|
17
19
|
- [Claude Code Plugin](#claude-code-plugin)
|
|
18
20
|
- [Quick Start](#quick-start)
|
|
@@ -30,6 +32,7 @@
|
|
|
30
32
|
- [proxy-off](#proxy-off-macos)
|
|
31
33
|
- [Web UI](#web-ui)
|
|
32
34
|
- [HTTPS Interception](#https-interception)
|
|
35
|
+
- [iOS Device Inspection](#ios-device-inspection)
|
|
33
36
|
- [System Proxy](#system-proxy-macos)
|
|
34
37
|
- [Configuration](#configuration)
|
|
35
38
|
- [REST API](#rest-api)
|
|
@@ -38,6 +41,14 @@
|
|
|
38
41
|
|
|
39
42
|
---
|
|
40
43
|
|
|
44
|
+
## Platform
|
|
45
|
+
|
|
46
|
+
RoxyProxy is developed and tested on **macOS**. Core proxy and query functionality works on Linux, but the following features are macOS-only:
|
|
47
|
+
|
|
48
|
+
- **System proxy** (`proxy-on` / `proxy-off`) -- uses `networksetup`
|
|
49
|
+
- **Auto-enable system proxy** with `--tail` -- routes all macOS traffic through the proxy automatically
|
|
50
|
+
- **CA trust** (`trust-ca`) -- uses macOS Keychain; Linux support exists but is less tested
|
|
51
|
+
|
|
41
52
|
## Installation
|
|
42
53
|
|
|
43
54
|
Run directly without installing:
|
|
@@ -93,6 +104,20 @@ Just ask Claude anything about intercepting or inspecting HTTP traffic and it wi
|
|
|
93
104
|
|
|
94
105
|
## Quick Start
|
|
95
106
|
|
|
107
|
+
The fastest way to start capturing traffic:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# One command: starts proxy, enables system proxy, opens interactive TUI
|
|
111
|
+
roxyproxy requests --tail
|
|
112
|
+
|
|
113
|
+
# Filter for a specific host
|
|
114
|
+
roxyproxy requests --host api.example.com --tail
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
This auto-starts the proxy, routes macOS system traffic through it, and opens a live terminal UI. Press Ctrl+C to quit -- the system proxy is automatically disabled.
|
|
118
|
+
|
|
119
|
+
### Manual setup
|
|
120
|
+
|
|
96
121
|
```bash
|
|
97
122
|
# Start the proxy (default: proxy on :8080, web UI on :8081)
|
|
98
123
|
roxyproxy start
|
|
@@ -101,7 +126,7 @@ roxyproxy start
|
|
|
101
126
|
curl -x http://127.0.0.1:8080 http://httpbin.org/get
|
|
102
127
|
|
|
103
128
|
# View captured traffic
|
|
104
|
-
roxyproxy requests
|
|
129
|
+
roxyproxy requests
|
|
105
130
|
|
|
106
131
|
# Open the web UI
|
|
107
132
|
open http://127.0.0.1:8081
|
|
@@ -235,10 +260,12 @@ roxyproxy requests [options]
|
|
|
235
260
|
| `--since <time>` | | After this time (Unix ms or ISO date) |
|
|
236
261
|
| `--until <time>` | | Before this time (Unix ms or ISO date) |
|
|
237
262
|
| `--limit <n>` | `100` | Maximum number of results |
|
|
238
|
-
| `--format <format>` | `
|
|
263
|
+
| `--format <format>` | `table` | Output format: `table` (default) or `json` |
|
|
264
|
+
| `--tail` | | Stream new requests in real-time (interactive TUI) |
|
|
265
|
+
| `--ui-port <number>` | `8081` | UI/API port (used with `--tail`) |
|
|
239
266
|
| `--db-path <path>` | `~/.roxyproxy/data.db` | Database location |
|
|
240
267
|
|
|
241
|
-
The default
|
|
268
|
+
The default output is a human-readable table. Use `--format json` for piping to `jq` or feeding to LLMs:
|
|
242
269
|
|
|
243
270
|
```bash
|
|
244
271
|
# All 500 errors
|
|
@@ -250,16 +277,51 @@ roxyproxy requests --host api.example.com --method POST
|
|
|
250
277
|
# Search URLs
|
|
251
278
|
roxyproxy requests --search "/api/v2"
|
|
252
279
|
|
|
253
|
-
#
|
|
280
|
+
# Limit results
|
|
254
281
|
roxyproxy requests --format table --limit 20
|
|
255
282
|
|
|
256
283
|
# Time-bounded query
|
|
257
284
|
roxyproxy requests --since "2024-01-15T00:00:00Z" --until "2024-01-16T00:00:00Z"
|
|
258
285
|
|
|
259
|
-
#
|
|
260
|
-
roxyproxy requests --host stripe.com | jq '.data[].url'
|
|
286
|
+
# JSON for piping to jq
|
|
287
|
+
roxyproxy requests --format json --host stripe.com | jq '.data[].url'
|
|
261
288
|
```
|
|
262
289
|
|
|
290
|
+
#### Real-time tailing
|
|
291
|
+
|
|
292
|
+
The `--tail` flag launches an interactive terminal UI that streams new requests as they arrive:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# Tail all traffic (auto-starts proxy + system proxy if needed)
|
|
296
|
+
roxyproxy requests --tail
|
|
297
|
+
|
|
298
|
+
# Tail with filters
|
|
299
|
+
roxyproxy requests --host todoist.com --tail
|
|
300
|
+
roxyproxy requests --status 500 --tail
|
|
301
|
+
roxyproxy requests --method POST --host api.example.com --tail
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**What `--tail` does automatically:**
|
|
305
|
+
|
|
306
|
+
1. **Starts the proxy** if it isn't already running
|
|
307
|
+
2. **Enables the macOS system proxy** so all traffic routes through RoxyProxy
|
|
308
|
+
3. Opens an interactive TUI with arrow-key navigation
|
|
309
|
+
4. On quit (Ctrl+C), **disables the system proxy** and stops the proxy it started
|
|
310
|
+
|
|
311
|
+
**TUI keyboard shortcuts:**
|
|
312
|
+
|
|
313
|
+
| Key | Action |
|
|
314
|
+
|---|---|
|
|
315
|
+
| `↑` / `↓` | Navigate requests |
|
|
316
|
+
| `Enter` | View full request detail (headers, body) |
|
|
317
|
+
| `Esc` | Back to list from detail view |
|
|
318
|
+
| `g` / `G` | Jump to top (newest) / bottom (oldest) |
|
|
319
|
+
| `Ctrl+C` | Quit (cleans up proxy and system proxy) |
|
|
320
|
+
|
|
321
|
+
New requests auto-scroll to the top. Scrolling down disables auto-scroll; pressing `g` re-enables it.
|
|
322
|
+
|
|
323
|
+
To get raw JSON streaming instead of the TUI, use `--format json --tail`.
|
|
324
|
+
|
|
263
325
|
### request
|
|
264
326
|
|
|
265
327
|
Show full details of a single captured request, including headers and bodies.
|
|
@@ -455,6 +517,91 @@ roxyproxy proxy-on
|
|
|
455
517
|
|
|
456
518
|
---
|
|
457
519
|
|
|
520
|
+
## iOS Device Inspection
|
|
521
|
+
|
|
522
|
+
RoxyProxy can inspect HTTP/HTTPS traffic from an iOS device. Your computer and iOS device must be on the same Wi-Fi network.
|
|
523
|
+
|
|
524
|
+
### Setup
|
|
525
|
+
|
|
526
|
+
**Step 1: Start RoxyProxy on your computer**
|
|
527
|
+
|
|
528
|
+
```bash
|
|
529
|
+
roxyproxy start
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
**Step 2: Find your computer's local IP address**
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
# macOS
|
|
536
|
+
ipconfig getifaddr en0
|
|
537
|
+
|
|
538
|
+
# Linux
|
|
539
|
+
hostname -I | awk '{print $1}'
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
Note the IP (e.g., `192.168.1.42`).
|
|
543
|
+
|
|
544
|
+
**Step 3: Configure the iOS device to use the proxy**
|
|
545
|
+
|
|
546
|
+
1. Open **Settings > Wi-Fi**
|
|
547
|
+
2. Tap the **(i)** icon next to your connected network
|
|
548
|
+
3. Scroll down and tap **Configure Proxy**
|
|
549
|
+
4. Select **Manual**
|
|
550
|
+
5. Set **Server** to your computer's IP (e.g., `192.168.1.42`)
|
|
551
|
+
6. Set **Port** to `8080`
|
|
552
|
+
7. Tap **Save**
|
|
553
|
+
|
|
554
|
+
HTTP traffic is now being captured. For HTTPS inspection, continue below.
|
|
555
|
+
|
|
556
|
+
**Step 4: Install the CA certificate on iOS**
|
|
557
|
+
|
|
558
|
+
Open Safari on your iOS device and navigate to:
|
|
559
|
+
|
|
560
|
+
```
|
|
561
|
+
http://<your-computer-ip>:8081/api/ca.crt
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
For example: `http://192.168.1.42:8081/api/ca.crt`
|
|
565
|
+
|
|
566
|
+
Safari will prompt you to download a configuration profile. Tap **Allow**.
|
|
567
|
+
|
|
568
|
+
**Step 5: Install the profile**
|
|
569
|
+
|
|
570
|
+
1. Open **Settings > General > VPN & Device Management** (or **Profiles & Device Management** on older iOS)
|
|
571
|
+
2. Tap the **RoxyProxy CA** profile
|
|
572
|
+
3. Tap **Install** and enter your passcode
|
|
573
|
+
|
|
574
|
+
**Step 6: Enable full trust for the certificate**
|
|
575
|
+
|
|
576
|
+
1. Open **Settings > General > About > Certificate Trust Settings**
|
|
577
|
+
2. Toggle **Enable Full Trust** for **RoxyProxy CA**
|
|
578
|
+
3. Tap **Continue** on the warning dialog
|
|
579
|
+
|
|
580
|
+
HTTPS traffic from the iOS device is now fully inspectable through RoxyProxy.
|
|
581
|
+
|
|
582
|
+
### Viewing traffic
|
|
583
|
+
|
|
584
|
+
Open the web UI from any browser:
|
|
585
|
+
|
|
586
|
+
```
|
|
587
|
+
http://<your-computer-ip>:8081
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
Or use the CLI:
|
|
591
|
+
|
|
592
|
+
```bash
|
|
593
|
+
roxyproxy requests --tail
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
### Cleanup
|
|
597
|
+
|
|
598
|
+
When you're done inspecting, remove the proxy from iOS:
|
|
599
|
+
|
|
600
|
+
1. **Settings > Wi-Fi > (i) > Configure Proxy > Off**
|
|
601
|
+
2. Optionally remove the CA profile: **Settings > General > VPN & Device Management > RoxyProxy CA > Remove Profile**
|
|
602
|
+
|
|
603
|
+
---
|
|
604
|
+
|
|
458
605
|
## System Proxy (macOS)
|
|
459
606
|
|
|
460
607
|
On macOS, RoxyProxy can configure itself as the system-wide HTTP/HTTPS proxy. This routes all traffic from most applications through the proxy without needing per-app configuration.
|
|
@@ -589,6 +736,14 @@ Response:
|
|
|
589
736
|
}
|
|
590
737
|
```
|
|
591
738
|
|
|
739
|
+
#### `GET /api/ca.crt`
|
|
740
|
+
|
|
741
|
+
Download the RoxyProxy CA certificate. Useful for installing on mobile devices -- open this URL in the device's browser to trigger a certificate install prompt.
|
|
742
|
+
|
|
743
|
+
```bash
|
|
744
|
+
curl -O http://127.0.0.1:8081/api/ca.crt
|
|
745
|
+
```
|
|
746
|
+
|
|
592
747
|
#### `POST /api/proxy/start`
|
|
593
748
|
|
|
594
749
|
Start the proxy server.
|
|
@@ -710,6 +865,8 @@ src/
|
|
|
710
865
|
├── cli/ # CLI entry point, commands, interactive mode
|
|
711
866
|
│ ├── index.ts # Command registration (Commander.js)
|
|
712
867
|
│ ├── interactive.tsx # Interactive terminal menu (Ink/React)
|
|
868
|
+
│ ├── tail-ui.tsx # Real-time tail TUI (Ink/React)
|
|
869
|
+
│ ├── format.ts # Table/JSON output formatting
|
|
713
870
|
│ ├── commands/ # Individual CLI commands
|
|
714
871
|
│ └── system-proxy.ts # macOS system proxy & CA management
|
|
715
872
|
├── server/ # Proxy server, API, SSL, events
|
|
@@ -1,6 +1,50 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
1
5
|
import { Database } from '../../storage/db.js';
|
|
2
6
|
import { loadConfig } from '../../server/config.js';
|
|
3
|
-
import {
|
|
7
|
+
import { RoxyProxyServer } from '../../server/index.js';
|
|
8
|
+
import { formatRequests, formatTailLine } from '../format.js';
|
|
9
|
+
import { enableSystemProxy, disableSystemProxy, checkSystemProxyStatus } from '../system-proxy.js';
|
|
10
|
+
/** Try to reach the API; resolves true if proxy is reachable. */
|
|
11
|
+
function isProxyRunning(port) {
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
const req = http.request({ host: '127.0.0.1', port, path: '/api/status', method: 'GET', timeout: 1000 }, (res) => { res.resume(); resolve(res.statusCode === 200); });
|
|
14
|
+
req.on('error', () => resolve(false));
|
|
15
|
+
req.on('timeout', () => { req.destroy(); resolve(false); });
|
|
16
|
+
req.end();
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/** Start a proxy server, enable system proxy, return instance and ports. */
|
|
20
|
+
async function autoStartProxy(requestedUiPort) {
|
|
21
|
+
const config = loadConfig({ uiPort: requestedUiPort });
|
|
22
|
+
const pidPath = path.join(os.homedir(), '.roxyproxy', 'pid');
|
|
23
|
+
fs.mkdirSync(path.dirname(pidPath), { recursive: true });
|
|
24
|
+
fs.writeFileSync(pidPath, process.pid.toString());
|
|
25
|
+
const server = new RoxyProxyServer(config);
|
|
26
|
+
const ports = await server.start();
|
|
27
|
+
// Enable system proxy so traffic flows through automatically
|
|
28
|
+
let systemProxyEnabled = false;
|
|
29
|
+
const alreadyEnabled = await checkSystemProxyStatus();
|
|
30
|
+
if (!alreadyEnabled) {
|
|
31
|
+
const proxyResult = await enableSystemProxy(String(ports.proxyPort));
|
|
32
|
+
systemProxyEnabled = proxyResult.ok;
|
|
33
|
+
}
|
|
34
|
+
const shutdown = async () => {
|
|
35
|
+
if (systemProxyEnabled)
|
|
36
|
+
await disableSystemProxy();
|
|
37
|
+
await server.stop();
|
|
38
|
+
try {
|
|
39
|
+
fs.unlinkSync(pidPath);
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
process.exit(0);
|
|
43
|
+
};
|
|
44
|
+
process.on('SIGINT', shutdown);
|
|
45
|
+
process.on('SIGTERM', shutdown);
|
|
46
|
+
return { server, uiPort: ports.uiPort, systemProxyEnabled };
|
|
47
|
+
}
|
|
4
48
|
export function registerRequests(program) {
|
|
5
49
|
program
|
|
6
50
|
.command('requests')
|
|
@@ -12,9 +56,51 @@ export function registerRequests(program) {
|
|
|
12
56
|
.option('--since <time>', 'Requests after this time')
|
|
13
57
|
.option('--until <time>', 'Requests before this time')
|
|
14
58
|
.option('--limit <n>', 'Max results', '100')
|
|
15
|
-
.option('--format <format>', 'Output format (json|table)'
|
|
59
|
+
.option('--format <format>', 'Output format (json|table)')
|
|
60
|
+
.option('--tail', 'Stream new requests in real-time')
|
|
61
|
+
.option('--ui-port <number>', 'UI/API port for --tail', '8081')
|
|
16
62
|
.option('--db-path <path>', 'Database path')
|
|
17
|
-
.action((opts) => {
|
|
63
|
+
.action(async (opts) => {
|
|
64
|
+
if (opts.tail) {
|
|
65
|
+
const filter = {};
|
|
66
|
+
if (opts.host)
|
|
67
|
+
filter.host = opts.host;
|
|
68
|
+
if (opts.status)
|
|
69
|
+
filter.status = parseInt(opts.status, 10);
|
|
70
|
+
if (opts.method)
|
|
71
|
+
filter.method = opts.method;
|
|
72
|
+
if (opts.search)
|
|
73
|
+
filter.search = opts.search;
|
|
74
|
+
// Default to table (interactive TUI) when tailing
|
|
75
|
+
const format = opts.format ?? 'table';
|
|
76
|
+
let uiPort = parseInt(opts.uiPort, 10);
|
|
77
|
+
let server = null;
|
|
78
|
+
// Auto-start proxy if not running
|
|
79
|
+
let didEnableSystemProxy = false;
|
|
80
|
+
const running = await isProxyRunning(uiPort);
|
|
81
|
+
if (!running) {
|
|
82
|
+
try {
|
|
83
|
+
const result = await autoStartProxy(uiPort);
|
|
84
|
+
server = result.server;
|
|
85
|
+
uiPort = result.uiPort;
|
|
86
|
+
didEnableSystemProxy = result.systemProxyEnabled;
|
|
87
|
+
console.error(`Proxy started (UI on :${uiPort})${didEnableSystemProxy ? ' — system proxy enabled' : ''}`);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
console.error(`Failed to start proxy: ${e.message}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (format === 'table') {
|
|
95
|
+
// Launch interactive Ink TUI
|
|
96
|
+
const { launchTailUi } = await import('../tail-ui.js');
|
|
97
|
+
launchTailUi(uiPort, filter, server, didEnableSystemProxy);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// JSON streaming mode (plain stdout)
|
|
101
|
+
tailRequests(uiPort, filter, format);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
18
104
|
const config = loadConfig(opts.dbPath ? { dbPath: opts.dbPath } : {});
|
|
19
105
|
const db = new Database(config.dbPath);
|
|
20
106
|
const filter = {
|
|
@@ -33,10 +119,70 @@ export function registerRequests(program) {
|
|
|
33
119
|
if (opts.until)
|
|
34
120
|
filter.until = parseTime(opts.until);
|
|
35
121
|
const result = db.query(filter);
|
|
36
|
-
console.log(formatRequests(result, opts.format));
|
|
122
|
+
console.log(formatRequests(result, opts.format ?? 'table'));
|
|
37
123
|
db.close();
|
|
38
124
|
});
|
|
39
125
|
}
|
|
126
|
+
function matchesFilter(record, filter) {
|
|
127
|
+
if (filter.host && !record.host?.toLowerCase().includes(filter.host.toLowerCase()))
|
|
128
|
+
return false;
|
|
129
|
+
if (filter.status && record.status !== filter.status)
|
|
130
|
+
return false;
|
|
131
|
+
if (filter.method && record.method?.toUpperCase() !== filter.method.toUpperCase())
|
|
132
|
+
return false;
|
|
133
|
+
if (filter.search && !record.url?.toLowerCase().includes(filter.search.toLowerCase()))
|
|
134
|
+
return false;
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
function tailRequests(port, filter, format) {
|
|
138
|
+
const req = http.request({ host: '127.0.0.1', port, path: '/api/events', method: 'GET' }, (res) => {
|
|
139
|
+
if (res.statusCode !== 200) {
|
|
140
|
+
console.error(`Failed to connect to event stream (status ${res.statusCode}). Is the proxy running?`);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
if (format === 'table') {
|
|
144
|
+
console.log(`\n Tailing requests${filter.host ? ` (host: ${filter.host})` : ''}... (Ctrl+C to stop)\n`);
|
|
145
|
+
}
|
|
146
|
+
let buffer = '';
|
|
147
|
+
res.on('data', (chunk) => {
|
|
148
|
+
buffer += chunk.toString();
|
|
149
|
+
// Parse SSE events from the buffer
|
|
150
|
+
const parts = buffer.split('\n\n');
|
|
151
|
+
buffer = parts.pop() || '';
|
|
152
|
+
for (const part of parts) {
|
|
153
|
+
const lines = part.split('\n');
|
|
154
|
+
let eventType = '';
|
|
155
|
+
let data = '';
|
|
156
|
+
for (const line of lines) {
|
|
157
|
+
if (line.startsWith('event: '))
|
|
158
|
+
eventType = line.slice(7);
|
|
159
|
+
else if (line.startsWith('data: '))
|
|
160
|
+
data = line.slice(6);
|
|
161
|
+
}
|
|
162
|
+
if (eventType !== 'request' || !data)
|
|
163
|
+
continue;
|
|
164
|
+
try {
|
|
165
|
+
const record = JSON.parse(data);
|
|
166
|
+
if (matchesFilter(record, filter)) {
|
|
167
|
+
console.log(formatTailLine(record, format));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Ignore malformed events
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
res.on('end', () => {
|
|
176
|
+
console.error('Event stream closed.');
|
|
177
|
+
process.exit(0);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
req.on('error', () => {
|
|
181
|
+
console.error('Could not connect to proxy. Is it running?');
|
|
182
|
+
process.exit(1);
|
|
183
|
+
});
|
|
184
|
+
req.end();
|
|
185
|
+
}
|
|
40
186
|
function parseTime(value) {
|
|
41
187
|
const num = Number(value);
|
|
42
188
|
if (!isNaN(num))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../../src/cli/commands/requests.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../../src/cli/commands/requests.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGnG,iEAAiE;AACjE,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAC9E,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAC5D,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4EAA4E;AAC5E,KAAK,UAAU,cAAc,CAAC,eAAuB;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAC7D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAEnC,6DAA6D;IAC7D,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,MAAM,cAAc,GAAG,MAAM,sBAAsB,EAAE,CAAC;IACtD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QACrE,kBAAkB,GAAG,WAAW,CAAC,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,kBAAkB;YAAE,MAAM,kBAAkB,EAAE,CAAC;QACnD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;SAClD,MAAM,CAAC,mBAAmB,EAAE,uBAAuB,CAAC;SACpD,MAAM,CAAC,oBAAoB,EAAE,YAAY,CAAC;SAC1C,MAAM,CAAC,gBAAgB,EAAE,0BAA0B,CAAC;SACpD,MAAM,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;SACrD,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC;SAC3C,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;SACzD,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC;SACpD,MAAM,CAAC,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,CAAC;SAC9D,MAAM,CAAC,kBAAkB,EAAE,eAAe,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,MAAM,GAAkB,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7C,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE7C,kDAAkD;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;YACtC,IAAI,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,MAAM,GAA2B,IAAI,CAAC;YAE1C,kCAAkC;YAClC,IAAI,oBAAoB,GAAG,KAAK,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;oBAC5C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBACvB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBACvB,oBAAoB,GAAG,MAAM,CAAC,kBAAkB,CAAC;oBACjD,OAAO,CAAC,KAAK,CAAC,yBAAyB,MAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5G,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,0BAA2B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;oBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,6BAA6B;gBAC7B,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;gBACvD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,qCAAqC;YACrC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAkB;YAC5B,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;SAChC,CAAC;QACF,IAAI,IAAI,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC;QAC5D,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,aAAa,CAAC,MAAqB,EAAE,MAAqB;IACjE,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACjG,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;QAAE,OAAO,KAAK,CAAC;IAChG,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACpG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAAqB,EAAE,MAAc;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,EAC/D,CAAC,GAAG,EAAE,EAAE;QACN,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,6CAA6C,GAAG,CAAC,UAAU,0BAA0B,CAAC,CAAC;YACrG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC3G,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAE3B,mCAAmC;YACnC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,SAAS,GAAG,EAAE,CAAC;gBACnB,IAAI,IAAI,GAAG,EAAE,CAAC;gBAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;wBAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;yBACrD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;wBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3D,CAAC;gBAED,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAE/C,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;oBACjD,IAAI,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;wBAClC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,0BAA0B;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AACnC,CAAC"}
|
package/dist/cli/format.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
import type { RequestRecord, PaginatedResponse } from '../shared/types.js';
|
|
2
|
+
export declare const COL: {
|
|
3
|
+
readonly time: 12;
|
|
4
|
+
readonly method: 8;
|
|
5
|
+
readonly status: 8;
|
|
6
|
+
readonly host: 30;
|
|
7
|
+
readonly path: 30;
|
|
8
|
+
readonly duration: 10;
|
|
9
|
+
readonly size: 10;
|
|
10
|
+
};
|
|
2
11
|
export declare function formatRequests(result: PaginatedResponse<RequestRecord>, format: string): string;
|
|
3
12
|
export declare function formatRequest(record: RequestRecord, format: string): string;
|
|
13
|
+
export declare function formatTailLine(r: RequestRecord, format: string): string;
|
package/dist/cli/format.js
CHANGED
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
import pc from 'picocolors';
|
|
2
|
+
// ── Shared column widths ──
|
|
3
|
+
export const COL = {
|
|
4
|
+
time: 12,
|
|
5
|
+
method: 8,
|
|
6
|
+
status: 8,
|
|
7
|
+
host: 30,
|
|
8
|
+
path: 30,
|
|
9
|
+
duration: 10,
|
|
10
|
+
size: 10,
|
|
11
|
+
};
|
|
12
|
+
// ── ANSI-safe padding ──
|
|
13
|
+
const ANSI_RE = /\x1b\[[0-9;]*m/g;
|
|
14
|
+
function visibleLength(str) {
|
|
15
|
+
return str.replace(ANSI_RE, '').length;
|
|
16
|
+
}
|
|
17
|
+
function padAnsi(str, width) {
|
|
18
|
+
const pad = width - visibleLength(str);
|
|
19
|
+
return pad > 0 ? str + ' '.repeat(pad) : str;
|
|
20
|
+
}
|
|
21
|
+
// ── Colors ──
|
|
2
22
|
const methodColor = (method) => {
|
|
3
23
|
switch (method) {
|
|
4
24
|
case 'GET': return pc.blue(method);
|
|
@@ -21,6 +41,7 @@ const statusColor = (status) => {
|
|
|
21
41
|
return pc.magenta(s);
|
|
22
42
|
return pc.red(s);
|
|
23
43
|
};
|
|
44
|
+
// ── Table formatters ──
|
|
24
45
|
export function formatRequests(result, format) {
|
|
25
46
|
if (format === 'json') {
|
|
26
47
|
return JSON.stringify(result, null, 2);
|
|
@@ -28,21 +49,22 @@ export function formatRequests(result, format) {
|
|
|
28
49
|
if (result.data.length === 0) {
|
|
29
50
|
return `\n ${pc.dim('No requests found.')}\n`;
|
|
30
51
|
}
|
|
52
|
+
const totalWidth = COL.method + COL.status + COL.host + COL.path + COL.duration + COL.size;
|
|
31
53
|
const header = pc.dim(' ' +
|
|
32
|
-
'METHOD'.padEnd(
|
|
33
|
-
'STATUS'.padEnd(
|
|
34
|
-
'HOST'.padEnd(
|
|
35
|
-
'PATH'.padEnd(
|
|
36
|
-
'TIME'.padEnd(
|
|
37
|
-
'SIZE'.padEnd(
|
|
38
|
-
const divider = pc.dim(' ' + '─'.repeat(
|
|
54
|
+
'METHOD'.padEnd(COL.method) +
|
|
55
|
+
'STATUS'.padEnd(COL.status) +
|
|
56
|
+
'HOST'.padEnd(COL.host) +
|
|
57
|
+
'PATH'.padEnd(COL.path) +
|
|
58
|
+
'TIME'.padEnd(COL.duration) +
|
|
59
|
+
'SIZE'.padEnd(COL.size));
|
|
60
|
+
const divider = pc.dim(' ' + '─'.repeat(totalWidth));
|
|
39
61
|
const rows = result.data.map((r) => {
|
|
40
62
|
return ' ' +
|
|
41
|
-
methodColor(r.method || '').
|
|
42
|
-
statusColor(r.status).
|
|
43
|
-
(r.host || '').slice(0,
|
|
44
|
-
pc.dim((r.path || '').slice(0,
|
|
45
|
-
pc.dim(r.duration ? `${r.duration}ms` : '-').
|
|
63
|
+
padAnsi(methodColor(r.method || ''), COL.method) +
|
|
64
|
+
padAnsi(statusColor(r.status), COL.status) +
|
|
65
|
+
(r.host || '').slice(0, COL.host - 2).padEnd(COL.host) +
|
|
66
|
+
padAnsi(pc.dim((r.path || '').slice(0, COL.path - 2)), COL.path) +
|
|
67
|
+
padAnsi(pc.dim(r.duration ? `${r.duration}ms` : '-'), COL.duration) +
|
|
46
68
|
pc.dim(formatBytes(r.response_size || 0));
|
|
47
69
|
});
|
|
48
70
|
const footer = `\n ${pc.dim(`${result.total} total (showing ${result.data.length}, offset ${result.offset})`)}`;
|
|
@@ -102,6 +124,27 @@ function formatBody(body, contentType) {
|
|
|
102
124
|
}
|
|
103
125
|
return ` ${str}`;
|
|
104
126
|
}
|
|
127
|
+
export function formatTailLine(r, format) {
|
|
128
|
+
if (format === 'json') {
|
|
129
|
+
return JSON.stringify({
|
|
130
|
+
id: r.id,
|
|
131
|
+
timestamp: r.timestamp,
|
|
132
|
+
method: r.method,
|
|
133
|
+
status: r.status,
|
|
134
|
+
host: r.host,
|
|
135
|
+
path: r.path,
|
|
136
|
+
url: r.url,
|
|
137
|
+
duration: r.duration,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return ' ' +
|
|
141
|
+
padAnsi(pc.dim(new Date(r.timestamp).toLocaleTimeString()), COL.time) +
|
|
142
|
+
padAnsi(methodColor(r.method || ''), COL.method) +
|
|
143
|
+
padAnsi(statusColor(r.status), COL.status) +
|
|
144
|
+
(r.host || '').slice(0, COL.host - 2).padEnd(COL.host) +
|
|
145
|
+
padAnsi(pc.dim((r.path || '').slice(0, COL.path - 2)), COL.path) +
|
|
146
|
+
pc.dim(r.duration ? `${r.duration}ms` : '-');
|
|
147
|
+
}
|
|
105
148
|
function formatBytes(bytes) {
|
|
106
149
|
if (bytes < 1024)
|
|
107
150
|
return `${bytes}B`;
|
package/dist/cli/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/cli/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,MAAM,WAAW,GAAG,CAAC,MAAc,EAAU,EAAE;IAC7C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAqB,EAAU,EAAE;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,MAAwC,EAAE,MAAc;IACrF,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC;IACjD,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CACnB,IAAI;QACJ,QAAQ,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/cli/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React, { useState, useEffect, useRef } from 'react';
|
|
3
|
+
import { render, Box, Text, useApp, useInput, useStdout } from 'ink';
|
|
4
|
+
import http from 'node:http';
|
|
5
|
+
import { loadConfig } from '../server/config.js';
|
|
6
|
+
import { Database } from '../storage/db.js';
|
|
7
|
+
import { COL } from './format.js';
|
|
8
|
+
import { disableSystemProxy } from './system-proxy.js';
|
|
9
|
+
// ── Colors ──
|
|
10
|
+
const METHOD_COLORS = {
|
|
11
|
+
GET: 'blue',
|
|
12
|
+
POST: 'green',
|
|
13
|
+
PUT: 'yellow',
|
|
14
|
+
PATCH: 'magenta',
|
|
15
|
+
DELETE: 'red',
|
|
16
|
+
};
|
|
17
|
+
function statusColor(s) {
|
|
18
|
+
if (!s)
|
|
19
|
+
return 'gray';
|
|
20
|
+
if (s < 300)
|
|
21
|
+
return 'green';
|
|
22
|
+
if (s < 400)
|
|
23
|
+
return 'yellow';
|
|
24
|
+
if (s < 500)
|
|
25
|
+
return 'magenta';
|
|
26
|
+
return 'red';
|
|
27
|
+
}
|
|
28
|
+
function formatBytes(bytes) {
|
|
29
|
+
if (bytes < 1024)
|
|
30
|
+
return `${bytes}B`;
|
|
31
|
+
if (bytes < 1024 * 1024)
|
|
32
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
33
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
34
|
+
}
|
|
35
|
+
// ── Body helpers ──
|
|
36
|
+
function getContentTypeFromHeaders(headersJson) {
|
|
37
|
+
try {
|
|
38
|
+
const h = JSON.parse(headersJson);
|
|
39
|
+
const key = Object.keys(h).find(k => k.toLowerCase() === 'content-type');
|
|
40
|
+
return key ? String(h[key]) : null;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function looksLikeJson(str) {
|
|
47
|
+
const trimmed = str.trimStart();
|
|
48
|
+
return trimmed.startsWith('{') || trimmed.startsWith('[');
|
|
49
|
+
}
|
|
50
|
+
// ── Filter matching ──
|
|
51
|
+
function matchesFilter(record, filter) {
|
|
52
|
+
if (filter.host && !record.host?.toLowerCase().includes(filter.host.toLowerCase()))
|
|
53
|
+
return false;
|
|
54
|
+
if (filter.status && record.status !== filter.status)
|
|
55
|
+
return false;
|
|
56
|
+
if (filter.method && record.method?.toUpperCase() !== filter.method.toUpperCase())
|
|
57
|
+
return false;
|
|
58
|
+
if (filter.search && !record.url?.toLowerCase().includes(filter.search.toLowerCase()))
|
|
59
|
+
return false;
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
// ── Filter label ──
|
|
63
|
+
function filterLabel(filter) {
|
|
64
|
+
const parts = [];
|
|
65
|
+
if (filter.host)
|
|
66
|
+
parts.push(`host:${filter.host}`);
|
|
67
|
+
if (filter.method)
|
|
68
|
+
parts.push(`method:${filter.method}`);
|
|
69
|
+
if (filter.status)
|
|
70
|
+
parts.push(`status:${filter.status}`);
|
|
71
|
+
if (filter.search)
|
|
72
|
+
parts.push(`search:${filter.search}`);
|
|
73
|
+
return parts.length ? parts.join(' ') : '';
|
|
74
|
+
}
|
|
75
|
+
const TABS = [
|
|
76
|
+
{ key: 'overview', label: 'Overview' },
|
|
77
|
+
{ key: 'request', label: 'Request' },
|
|
78
|
+
{ key: 'response', label: 'Response' },
|
|
79
|
+
];
|
|
80
|
+
function DetailView({ record, onBack }) {
|
|
81
|
+
const [full, setFull] = useState(null);
|
|
82
|
+
const [tab, setTab] = useState('overview');
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
try {
|
|
85
|
+
const config = loadConfig();
|
|
86
|
+
const db = new Database(config.dbPath);
|
|
87
|
+
const result = db.getById(record.id);
|
|
88
|
+
db.close();
|
|
89
|
+
setFull(result);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
setFull(record);
|
|
93
|
+
}
|
|
94
|
+
}, [record.id]);
|
|
95
|
+
useInput((input, key) => {
|
|
96
|
+
if (key.escape) {
|
|
97
|
+
onBack();
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (key.leftArrow || input === 'h') {
|
|
101
|
+
const idx = TABS.findIndex(t => t.key === tab);
|
|
102
|
+
if (idx > 0)
|
|
103
|
+
setTab(TABS[idx - 1].key);
|
|
104
|
+
}
|
|
105
|
+
if (key.rightArrow || input === 'l') {
|
|
106
|
+
const idx = TABS.findIndex(t => t.key === tab);
|
|
107
|
+
if (idx < TABS.length - 1)
|
|
108
|
+
setTab(TABS[idx + 1].key);
|
|
109
|
+
}
|
|
110
|
+
// Number keys for quick tab switching
|
|
111
|
+
if (input === '1')
|
|
112
|
+
setTab('overview');
|
|
113
|
+
if (input === '2')
|
|
114
|
+
setTab('request');
|
|
115
|
+
if (input === '3')
|
|
116
|
+
setTab('response');
|
|
117
|
+
});
|
|
118
|
+
const r = full ?? record;
|
|
119
|
+
const parseHeaders = (raw) => {
|
|
120
|
+
if (!raw)
|
|
121
|
+
return {};
|
|
122
|
+
try {
|
|
123
|
+
return JSON.parse(raw);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return {};
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const decodeBody = (body) => {
|
|
130
|
+
if (!body)
|
|
131
|
+
return null;
|
|
132
|
+
if (Buffer.isBuffer(body))
|
|
133
|
+
return body.toString('utf-8');
|
|
134
|
+
// SSE records have base64-encoded bodies
|
|
135
|
+
if (typeof body === 'string') {
|
|
136
|
+
try {
|
|
137
|
+
return Buffer.from(body, 'base64').toString('utf-8');
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return body;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return String(body);
|
|
144
|
+
};
|
|
145
|
+
const formatBody = (body, headers) => {
|
|
146
|
+
const str = decodeBody(body);
|
|
147
|
+
if (!str)
|
|
148
|
+
return '(empty)';
|
|
149
|
+
const ct = headers ? getContentTypeFromHeaders(headers) : null;
|
|
150
|
+
const isJson = ct?.includes('json') || (!ct && looksLikeJson(str));
|
|
151
|
+
if (isJson) {
|
|
152
|
+
try {
|
|
153
|
+
const pretty = JSON.stringify(JSON.parse(str), null, 2);
|
|
154
|
+
return pretty.split('\n').map(line => ` ${line}`).join('\n');
|
|
155
|
+
}
|
|
156
|
+
catch { /* fallthrough */ }
|
|
157
|
+
}
|
|
158
|
+
return str.slice(0, 2000).split('\n').map(line => ` ${line}`).join('\n');
|
|
159
|
+
};
|
|
160
|
+
const renderHeaders = (raw) => {
|
|
161
|
+
const headers = parseHeaders(raw);
|
|
162
|
+
const entries = Object.entries(headers);
|
|
163
|
+
if (entries.length === 0)
|
|
164
|
+
return _jsx(Text, { dimColor: true, children: " (none)" });
|
|
165
|
+
return entries.map(([k, v]) => (_jsxs(Box, { children: [_jsxs(Text, { color: "magenta", children: [" ", k] }), _jsx(Text, { dimColor: true, children: ": " }), _jsx(Text, { children: String(v) })] }, k)));
|
|
166
|
+
};
|
|
167
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { color: METHOD_COLORS[r.method] ?? 'white', bold: true, children: [r.method, " "] }), _jsxs(Text, { color: statusColor(r.status), children: [String(r.status ?? '-'), " "] }), _jsx(Text, { color: "cyan", children: r.url }), r.duration && _jsxs(Text, { dimColor: true, children: [" ", r.duration, "ms"] })] }), _jsxs(Box, { children: [_jsx(Text, { children: " " }), TABS.map((t, i) => (_jsxs(React.Fragment, { children: [i > 0 && _jsx(Text, { dimColor: true, children: " " }), tab === t.key
|
|
168
|
+
? _jsxs(Text, { bold: true, color: "cyan", children: [" ", t.label, " "] })
|
|
169
|
+
: _jsxs(Text, { dimColor: true, children: [" ", t.label, " "] })] }, t.key)))] }), _jsxs(Text, { dimColor: true, children: [" ", '─'.repeat(40)] }), tab === 'overview' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " ID " }), _jsx(Text, { children: r.id })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " URL " }), _jsx(Text, { color: "cyan", children: r.url })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " Method " }), _jsx(Text, { color: METHOD_COLORS[r.method] ?? 'white', children: r.method })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " Status " }), _jsx(Text, { color: statusColor(r.status), children: String(r.status ?? '-') })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " Duration " }), _jsx(Text, { children: r.duration ? `${r.duration}ms` : '-' })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " Protocol " }), _jsx(Text, { children: r.protocol })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " Time " }), _jsx(Text, { children: new Date(r.timestamp).toISOString() })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " Req Size " }), _jsx(Text, { children: formatBytes(r.request_size || 0) })] }), _jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " Res Size " }), _jsx(Text, { children: formatBytes(r.response_size || 0) })] })] })), tab === 'request' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Box, { children: _jsx(Text, { bold: true, children: " Headers" }) }), renderHeaders(r.request_headers), r.request_body && (_jsxs(_Fragment, { children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, children: " Body" }) }), _jsx(Text, { children: formatBody(r.request_body, r.request_headers) })] })), !r.request_body && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: " No request body" }) }))] })), tab === 'response' && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Box, { children: _jsx(Text, { bold: true, children: " Headers" }) }), renderHeaders(r.response_headers), r.response_body && (_jsxs(_Fragment, { children: [_jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, children: " Body" }) }), _jsx(Text, { children: formatBody(r.response_body, r.response_headers) })] })), !r.response_body && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: " No response body" }) }))] })), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: " \u2190\u2192 or h/l switch tabs 1/2/3 jump to tab Esc back" }) })] }));
|
|
170
|
+
}
|
|
171
|
+
// ── Main Tail App ──
|
|
172
|
+
function TailApp({ port, filter, server, ownedSystemProxy }) {
|
|
173
|
+
const { exit } = useApp();
|
|
174
|
+
const { stdout } = useStdout();
|
|
175
|
+
const [records, setRecords] = useState([]);
|
|
176
|
+
const [cursor, setCursor] = useState(0);
|
|
177
|
+
const [connected, setConnected] = useState(false);
|
|
178
|
+
const [error, setError] = useState('');
|
|
179
|
+
const [selectedRecord, setSelectedRecord] = useState(null);
|
|
180
|
+
const autoScroll = useRef(true);
|
|
181
|
+
const termHeight = stdout?.rows ?? 24;
|
|
182
|
+
// Reserve rows for header (3), table header (2), footer (3)
|
|
183
|
+
const visibleRows = Math.max(5, termHeight - 8);
|
|
184
|
+
useEffect(() => {
|
|
185
|
+
const req = http.request({ host: '127.0.0.1', port, path: '/api/events', method: 'GET' }, (res) => {
|
|
186
|
+
if (res.statusCode !== 200) {
|
|
187
|
+
setError(`Failed to connect (status ${res.statusCode}). Is the proxy running?`);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
setConnected(true);
|
|
191
|
+
let buffer = '';
|
|
192
|
+
res.on('data', (chunk) => {
|
|
193
|
+
buffer += chunk.toString();
|
|
194
|
+
const parts = buffer.split('\n\n');
|
|
195
|
+
buffer = parts.pop() || '';
|
|
196
|
+
for (const part of parts) {
|
|
197
|
+
const lines = part.split('\n');
|
|
198
|
+
let eventType = '';
|
|
199
|
+
let data = '';
|
|
200
|
+
for (const line of lines) {
|
|
201
|
+
if (line.startsWith('event: '))
|
|
202
|
+
eventType = line.slice(7);
|
|
203
|
+
else if (line.startsWith('data: '))
|
|
204
|
+
data = line.slice(6);
|
|
205
|
+
}
|
|
206
|
+
if (eventType !== 'request' || !data)
|
|
207
|
+
continue;
|
|
208
|
+
try {
|
|
209
|
+
const record = JSON.parse(data);
|
|
210
|
+
if (matchesFilter(record, filter)) {
|
|
211
|
+
setRecords(prev => {
|
|
212
|
+
const next = [record, ...prev];
|
|
213
|
+
// Keep max 500 records in memory
|
|
214
|
+
if (next.length > 500)
|
|
215
|
+
next.length = 500;
|
|
216
|
+
return next;
|
|
217
|
+
});
|
|
218
|
+
// If cursor is at top (auto-scroll mode), keep it there
|
|
219
|
+
if (autoScroll.current) {
|
|
220
|
+
setCursor(0);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// Ignore malformed events
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
res.on('end', () => {
|
|
230
|
+
setError('Event stream closed.');
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
req.on('error', () => {
|
|
234
|
+
setError('Could not connect to proxy. Is it running?');
|
|
235
|
+
});
|
|
236
|
+
req.end();
|
|
237
|
+
return () => { req.destroy(); };
|
|
238
|
+
}, [port]);
|
|
239
|
+
useInput((input, key) => {
|
|
240
|
+
if (key.ctrl && input === 'c') {
|
|
241
|
+
const cleanup = async () => {
|
|
242
|
+
if (ownedSystemProxy)
|
|
243
|
+
await disableSystemProxy();
|
|
244
|
+
if (server)
|
|
245
|
+
await server.stop();
|
|
246
|
+
exit();
|
|
247
|
+
};
|
|
248
|
+
cleanup();
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (selectedRecord) {
|
|
252
|
+
// Detail view handles its own input
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (key.upArrow) {
|
|
256
|
+
setCursor(c => {
|
|
257
|
+
const next = Math.max(0, c - 1);
|
|
258
|
+
if (next === 0)
|
|
259
|
+
autoScroll.current = true;
|
|
260
|
+
else
|
|
261
|
+
autoScroll.current = false;
|
|
262
|
+
return next;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
if (key.downArrow) {
|
|
266
|
+
setCursor(c => {
|
|
267
|
+
autoScroll.current = false;
|
|
268
|
+
return Math.min(records.length - 1, c + 1);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Page up/down
|
|
272
|
+
if (key.pageUp || (key.shift && key.upArrow)) {
|
|
273
|
+
setCursor(c => {
|
|
274
|
+
const next = Math.max(0, c - visibleRows);
|
|
275
|
+
if (next === 0)
|
|
276
|
+
autoScroll.current = true;
|
|
277
|
+
return next;
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
if (key.pageDown || (key.shift && key.downArrow)) {
|
|
281
|
+
setCursor(c => {
|
|
282
|
+
autoScroll.current = false;
|
|
283
|
+
return Math.min(records.length - 1, c + visibleRows);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
// Home - jump to top (newest)
|
|
287
|
+
if (key.home || input === 'g') {
|
|
288
|
+
setCursor(0);
|
|
289
|
+
autoScroll.current = true;
|
|
290
|
+
}
|
|
291
|
+
// End - jump to bottom (oldest)
|
|
292
|
+
if (key.end || input === 'G') {
|
|
293
|
+
setCursor(Math.max(0, records.length - 1));
|
|
294
|
+
autoScroll.current = false;
|
|
295
|
+
}
|
|
296
|
+
if (key.return && records[cursor]) {
|
|
297
|
+
setSelectedRecord(records[cursor]);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
if (error) {
|
|
301
|
+
return (_jsx(Box, { flexDirection: "column", padding: 1, children: _jsx(Text, { color: "red", children: error }) }));
|
|
302
|
+
}
|
|
303
|
+
if (selectedRecord) {
|
|
304
|
+
return (_jsx(Box, { flexDirection: "column", padding: 1, children: _jsx(DetailView, { record: selectedRecord, onBack: () => setSelectedRecord(null) }) }));
|
|
305
|
+
}
|
|
306
|
+
// Calculate visible window
|
|
307
|
+
const scrollStart = Math.max(0, Math.min(cursor - Math.floor(visibleRows / 2), records.length - visibleRows));
|
|
308
|
+
const visibleRecords = records.slice(scrollStart, scrollStart + visibleRows);
|
|
309
|
+
const fl = filterLabel(filter);
|
|
310
|
+
return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, color: "cyan", children: " Tailing requests" }), fl && _jsxs(Text, { dimColor: true, children: [" (", fl, ")"] }), _jsx(Text, { children: " " }), connected
|
|
311
|
+
? _jsx(Text, { color: "green", children: "\u25CF connected" })
|
|
312
|
+
: _jsx(Text, { color: "yellow", children: "\u25CB connecting..." }), records.length > 0 && _jsxs(Text, { dimColor: true, children: [" ", records.length, " captured"] })] }), _jsx(Text, { children: " " }), _jsx(Box, { children: _jsxs(Text, { dimColor: true, children: [' ', 'TIME'.padEnd(COL.time), 'METHOD'.padEnd(COL.method), 'STATUS'.padEnd(COL.status), 'HOST'.padEnd(COL.host), 'PATH'.padEnd(COL.path), 'DURATION'] }) }), _jsx(Text, { dimColor: true, children: ' ' + '─'.repeat(COL.time + COL.method + COL.status + COL.host + COL.path + COL.duration) }), records.length === 0 ? (_jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: " Waiting for requests..." }) })) : (visibleRecords.map((r, i) => {
|
|
313
|
+
const globalIdx = scrollStart + i;
|
|
314
|
+
const selected = globalIdx === cursor;
|
|
315
|
+
const time = new Date(r.timestamp).toLocaleTimeString();
|
|
316
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: selected ? '> ' : ' ' }), _jsx(Text, { dimColor: true, children: time.padEnd(COL.time) }), _jsx(Text, { color: METHOD_COLORS[r.method] ?? 'white', children: r.method.padEnd(COL.method) }), _jsx(Text, { color: statusColor(r.status), children: String(r.status ?? '-').padEnd(COL.status) }), _jsx(Text, { children: (r.host || '').slice(0, COL.host - 2).padEnd(COL.host) }), _jsx(Text, { dimColor: true, children: (r.path || '').slice(0, COL.path - 2).padEnd(COL.path) }), _jsx(Text, { dimColor: true, children: r.duration ? `${r.duration}ms` : '-' })] }, r.id));
|
|
317
|
+
})), records.length > visibleRows && (_jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [' ', scrollStart > 0 ? '↑ more' : ' ', ' ', scrollStart + visibleRows < records.length ? '↓ more' : ' ', ' ', "(", cursor + 1, "/", records.length, ")"] }) })), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { dimColor: true, children: " \u2191\u2193 navigate Enter detail g/G top/bottom Ctrl+C quit" }), autoScroll.current && records.length > 0 && _jsx(Text, { color: "green", children: " [auto-scroll]" })] })] }));
|
|
318
|
+
}
|
|
319
|
+
export function launchTailUi(port, filter, server, ownedSystemProxy = false) {
|
|
320
|
+
render(_jsx(TailApp, { port: port, filter: filter, server: server ?? null, ownedSystemProxy: ownedSystemProxy }));
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=tail-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tail-ui.js","sourceRoot":"","sources":["../../src/cli/tail-ui.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,eAAe;AAEf,MAAM,aAAa,GAA2B;IAC5C,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,OAAO;IACb,GAAG,EAAE,QAAQ;IACb,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,SAAS,WAAW,CAAC,CAAgB;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtB,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC7B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,qBAAqB;AAErB,SAAS,yBAAyB,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,CAAC;QACzE,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAChC,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,wBAAwB;AAExB,SAAS,aAAa,CAAC,MAAqB,EAAE,MAAqB;IACjE,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACjG,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;QAAE,OAAO,KAAK,CAAC;IAChG,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACpG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qBAAqB;AAErB,SAAS,WAAW,CAAC,MAAqB;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,CAAC;AAKD,MAAM,IAAI,GAAwC;IAChD,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACtC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACpC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;CACvC,CAAC;AAEF,SAAS,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAiD;IACnF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAY,UAAU,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhB,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAAC,MAAM,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QACrC,IAAI,GAAG,CAAC,SAAS,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YAC/C,IAAI,GAAG,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YAC/C,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,sCAAsC;QACtC,IAAI,KAAK,KAAK,GAAG;YAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,KAAK,KAAK,GAAG;YAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,GAAG;YAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;IAEzB,MAAM,YAAY,GAAG,CAAC,GAAkB,EAA0B,EAAE;QAClE,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IACtD,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,IAA4B,EAAiB,EAAE;QACjE,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzD,yCAAyC;QACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC;gBAAC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;QACtF,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,IAA4B,EAAE,OAAsB,EAAU,EAAE;QAClF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/D,MAAM,MAAM,GAAG,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,GAAkB,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAC,IAAI,IAAC,QAAQ,iCAAkB,CAAC;QAClE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAC7B,MAAC,GAAG,eAAS,MAAC,IAAI,IAAC,KAAK,EAAC,SAAS,qBAAM,CAAC,IAAQ,EAAA,KAAC,IAAI,IAAC,QAAQ,yBAAU,EAAA,KAAC,IAAI,cAAE,MAAM,CAAC,CAAC,CAAC,GAAQ,KAAvF,CAAC,CAA4F,CACxG,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAEzB,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,MAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,IAAI,mBAAE,CAAC,CAAC,MAAM,SAAS,EACxE,MAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,aAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,EACrE,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,GAAG,GAAQ,EAChC,CAAC,CAAC,QAAQ,IAAI,MAAC,IAAI,IAAC,QAAQ,yBAAI,CAAC,CAAC,QAAQ,UAAU,IACjD,EAGN,MAAC,GAAG,eACF,KAAC,IAAI,qBAAU,EACd,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAClB,MAAC,KAAK,CAAC,QAAQ,eACZ,CAAC,GAAG,CAAC,IAAI,KAAC,IAAI,IAAC,QAAQ,yBAAU,EACjC,GAAG,KAAK,CAAC,CAAC,GAAG;gCACZ,CAAC,CAAC,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,kBAAG,CAAC,CAAC,KAAK,SAAS;gCAC5C,CAAC,CAAC,MAAC,IAAI,IAAC,QAAQ,wBAAG,CAAC,CAAC,KAAK,SAAS,KAJlB,CAAC,CAAC,GAAG,CAMT,CAClB,CAAC,IACE,EACN,MAAC,IAAI,IAAC,QAAQ,yBAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAQ,EAGvC,GAAG,KAAK,UAAU,IAAI,CACrB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,cAAE,CAAC,CAAC,EAAE,GAAQ,IAAM,EAChE,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,GAAG,GAAQ,IAAM,EAC9E,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,YAAG,CAAC,CAAC,MAAM,GAAQ,IAAM,EAC/G,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,YAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,GAAQ,IAAM,EACjH,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,cAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,GAAQ,IAAM,EAChG,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,cAAE,CAAC,CAAC,QAAQ,GAAQ,IAAM,EACtE,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,cAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,GAAQ,IAAM,EAC/F,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,cAAE,WAAW,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAQ,IAAM,EAC5F,MAAC,GAAG,eAAC,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAAA,KAAC,IAAI,cAAE,WAAW,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,GAAQ,IAAM,IACzF,CACP,EAEA,GAAG,KAAK,SAAS,IAAI,CACpB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,GAAG,cAAC,KAAC,IAAI,IAAC,IAAI,gCAAiB,GAAM,EACrC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,EAChC,CAAC,CAAC,YAAY,IAAI,CACjB,8BACE,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,IAAI,6BAAc,GAAM,EACjD,KAAC,IAAI,cAAE,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,eAAe,CAAC,GAAQ,IAC3D,CACJ,EACA,CAAC,CAAC,CAAC,YAAY,IAAI,CAClB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,QAAQ,wCAAyB,GAAM,CACjE,IACG,CACP,EAEA,GAAG,KAAK,UAAU,IAAI,CACrB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,GAAG,cAAC,KAAC,IAAI,IAAC,IAAI,gCAAiB,GAAM,EACrC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,EACjC,CAAC,CAAC,aAAa,IAAI,CAClB,8BACE,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,IAAI,6BAAc,GAAM,EACjD,KAAC,IAAI,cAAE,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAQ,IAC7D,CACJ,EACA,CAAC,CAAC,CAAC,aAAa,IAAI,CACnB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAAE,KAAC,IAAI,IAAC,QAAQ,yCAA0B,GAAM,CAClE,IACG,CACP,EAGD,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,QAAQ,qFAA4D,GACtE,IACF,CACP,CAAC;AACJ,CAAC;AAED,sBAAsB;AAEtB,SAAS,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAsG;IAC7J,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAuB,IAAI,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,UAAU,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;IACtC,4DAA4D;IAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,EAC/D,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,QAAQ,CAAC,6BAA6B,GAAG,CAAC,UAAU,0BAA0B,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/B,IAAI,SAAS,GAAG,EAAE,CAAC;oBACnB,IAAI,IAAI,GAAG,EAAE,CAAC;oBAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;4BAAE,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;6BACrD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;4BAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC3D,CAAC;oBAED,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI;wBAAE,SAAS;oBAE/C,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;wBACjD,IAAI,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;4BAClC,UAAU,CAAC,IAAI,CAAC,EAAE;gCAChB,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;gCAC/B,iCAAiC;gCACjC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;oCAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gCACzC,OAAO,IAAI,CAAC;4BACd,CAAC,CAAC,CAAC;4BACH,wDAAwD;4BACxD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gCACvB,SAAS,CAAC,CAAC,CAAC,CAAC;4BACf,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,0BAA0B;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,QAAQ,CAAC,sBAAsB,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,QAAQ,CAAC,4CAA4C,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE,CAAC;QAEV,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;gBACzB,IAAI,gBAAgB;oBAAE,MAAM,kBAAkB,EAAE,CAAC;gBACjD,IAAI,MAAM;oBAAE,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChC,IAAI,EAAE,CAAC;YACT,CAAC,CAAC;YACF,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,oCAAoC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,SAAS,CAAC,CAAC,CAAC,EAAE;gBACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChC,IAAI,IAAI,KAAK,CAAC;oBAAE,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;;oBACrC,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;gBAChC,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,SAAS,CAAC,CAAC,CAAC,EAAE;gBACZ,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,eAAe;QACf,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,SAAS,CAAC,CAAC,CAAC,EAAE;gBACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;gBAC1C,IAAI,IAAI,KAAK,CAAC;oBAAE,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC1C,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACjD,SAAS,CAAC,CAAC,CAAC,EAAE;gBACZ,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,SAAS,CAAC,CAAC,CAAC,CAAC;YACb,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,gCAAgC;QAChC,IAAI,GAAG,CAAC,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3C,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC7B,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,YACpC,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,YAAE,KAAK,GAAQ,GAC5B,CACP,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,YACpC,KAAC,UAAU,IAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAI,GACzE,CACP,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAC9G,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC;IAE7E,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aAEpC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,kCAAyB,EAC/C,EAAE,IAAI,MAAC,IAAI,IAAC,QAAQ,0BAAK,EAAE,SAAS,EACrC,KAAC,IAAI,oBAAS,EACb,SAAS;wBACR,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,iCAAmB;wBACxC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,qCAAuB,EAE9C,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAC,IAAI,IAAC,QAAQ,yBAAI,OAAO,CAAC,MAAM,iBAAiB,IACpE,EACN,KAAC,IAAI,oBAAS,EAGd,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,QAAQ,mBACX,IAAI,EACJ,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EACvB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAC3B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAC3B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EACvB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EACvB,UAAU,IACN,GACH,EACN,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAQ,EAGjH,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACtB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,QAAQ,gDAAiC,GAC3C,CACP,CAAC,CAAC,CAAC,CACF,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC1B,MAAM,SAAS,GAAG,WAAW,GAAG,CAAC,CAAC;gBAClC,MAAM,QAAQ,GAAG,SAAS,KAAK,MAAM,CAAC;gBACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC;gBACxD,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAQ,EAClD,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAQ,EAC7C,KAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,YAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAQ,EACrF,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,YAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAQ,EACvF,KAAC,IAAI,cAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAQ,EACrE,KAAC,IAAI,IAAC,QAAQ,kBAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAQ,EAC9E,KAAC,IAAI,IAAC,QAAQ,kBAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,GAAQ,KAPpD,CAAC,CAAC,EAAE,CAQR,CACP,CAAC;YACJ,CAAC,CAAC,CACH,EAGA,OAAO,CAAC,MAAM,GAAG,WAAW,IAAI,CAC/B,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,mBACX,IAAI,EACJ,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EACrC,IAAI,EACJ,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAChE,IAAI,OACH,MAAM,GAAG,CAAC,OAAG,OAAO,CAAC,MAAM,SACxB,GACH,CACP,EAGD,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,KAAC,IAAI,IAAC,QAAQ,yFAAgE,EAC7E,UAAU,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,gCAAuB,IACnF,IACF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAqB,EAAE,MAA+B,EAAE,gBAAgB,GAAG,KAAK;IACzH,MAAM,CAAC,KAAC,OAAO,IAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,GAAI,CAAC,CAAC;AAC9G,CAAC"}
|
package/dist/server/api.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import type { Database } from '../storage/db.js';
|
|
3
3
|
import type { EventManager } from './events.js';
|
|
4
|
+
import type { CertificateAuthority } from './ssl.js';
|
|
4
5
|
export interface ProxyControl {
|
|
5
6
|
getProxyRunning: () => boolean;
|
|
6
7
|
getProxyPort: () => number;
|
|
7
8
|
startProxy: () => Promise<void>;
|
|
8
9
|
stopProxy: () => Promise<void>;
|
|
9
10
|
}
|
|
10
|
-
export declare function createApiRouter(db: Database, events: EventManager, proxy: ProxyControl): Router;
|
|
11
|
+
export declare function createApiRouter(db: Database, events: EventManager, proxy: ProxyControl, ca?: CertificateAuthority): Router;
|
package/dist/server/api.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
|
+
import fs from 'node:fs';
|
|
2
3
|
function serializeRecord(r) {
|
|
3
4
|
return {
|
|
4
5
|
...r,
|
|
@@ -6,7 +7,7 @@ function serializeRecord(r) {
|
|
|
6
7
|
response_body: r.response_body ? Buffer.from(r.response_body).toString('base64') : null,
|
|
7
8
|
};
|
|
8
9
|
}
|
|
9
|
-
export function createApiRouter(db, events, proxy) {
|
|
10
|
+
export function createApiRouter(db, events, proxy, ca) {
|
|
10
11
|
const router = Router();
|
|
11
12
|
const emitStatusEvent = () => {
|
|
12
13
|
events.emitStatus({
|
|
@@ -60,6 +61,20 @@ export function createApiRouter(db, events, proxy) {
|
|
|
60
61
|
dbSizeBytes: db.getDbSize(),
|
|
61
62
|
});
|
|
62
63
|
});
|
|
64
|
+
router.get('/ca.crt', (_req, res) => {
|
|
65
|
+
if (!ca) {
|
|
66
|
+
res.status(404).json({ error: 'CA not available' });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const certPath = ca.getCaCertPath();
|
|
70
|
+
if (!fs.existsSync(certPath)) {
|
|
71
|
+
res.status(404).json({ error: 'CA certificate not found. Start the proxy first to generate it.' });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
res.setHeader('Content-Type', 'application/x-x509-ca-cert');
|
|
75
|
+
res.setHeader('Content-Disposition', 'attachment; filename="roxyproxy-ca.crt"');
|
|
76
|
+
res.sendFile(certPath);
|
|
77
|
+
});
|
|
63
78
|
router.post('/proxy/start', async (_req, res) => {
|
|
64
79
|
try {
|
|
65
80
|
await proxy.startProxy();
|
|
@@ -91,6 +106,7 @@ export function createApiRouter(db, events, proxy) {
|
|
|
91
106
|
'Cache-Control': 'no-cache',
|
|
92
107
|
Connection: 'keep-alive',
|
|
93
108
|
});
|
|
109
|
+
res.flushHeaders();
|
|
94
110
|
const unsubRequest = events.subscribe((records) => {
|
|
95
111
|
for (const record of records) {
|
|
96
112
|
res.write(`event: request\nid: ${record.id}\ndata: ${JSON.stringify(serializeRecord(record))}\n\n`);
|
package/dist/server/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,MAAM,SAAS,CAAC;AAMzB,SAAS,eAAe,CAAC,CAAgB;IACvC,OAAO;QACL,GAAG,CAAC;QACJ,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QACpF,aAAa,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;KACxF,CAAC;AACJ,CAAC;AASD,MAAM,UAAU,eAAe,CAC7B,EAAY,EACZ,MAAoB,EACpB,KAAmB,EACnB,EAAyB;IAEzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC;YAChB,OAAO,EAAE,KAAK,CAAC,eAAe,EAAE;YAChC,SAAS,EAAE,KAAK,CAAC,YAAY,EAAE;SAChC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QACtD,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC;QAC3D,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAgB,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAgB,CAAC;QACjE,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY;YAAE,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,YAAsB,CAAC;QACnF,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAgB,CAAC;QACjE,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAgB,EAAE,EAAE,CAAC,CAAC;QAE/E,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC;YACP,GAAG,MAAM;YACT,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;SACvC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAC1D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAY,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAC1D,EAAE,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACrD,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,KAAK,CAAC,eAAe,EAAE;YAChC,SAAS,EAAE,KAAK,CAAC,YAAY,EAAE;YAC/B,YAAY,EAAE,EAAE,CAAC,eAAe,EAAE;YAClC,WAAW,EAAE,EAAE,CAAC,SAAS,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACrD,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iEAAiE,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,4BAA4B,CAAC,CAAC;QAC5D,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,yCAAyC,CAAC,CAAC;QAChF,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;QACjE,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;YACzB,eAAe,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;QAChE,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;YACxB,eAAe,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACxD,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACvB,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QACpD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,UAAU;YAC3B,UAAU,EAAE,YAAY;SACzB,CAAC,CAAC;QACH,GAAG,CAAC,YAAY,EAAE,CAAC;QAEnB,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YAChD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,GAAG,CAAC,KAAK,CAAC,uBAAuB,MAAM,CAAC,EAAE,WAAW,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;YACtG,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE;YACpD,GAAG,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/server/index.js
CHANGED
|
@@ -51,7 +51,7 @@ export class RoxyProxyServer {
|
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
53
|
};
|
|
54
|
-
app.use('/api', createApiRouter(this.db, this.events, proxyControl));
|
|
54
|
+
app.use('/api', createApiRouter(this.db, this.events, proxyControl, this.ca));
|
|
55
55
|
const uiDistPath = path.join(import.meta.dirname, '..', '..', 'dist', 'ui');
|
|
56
56
|
app.use(express.static(uiDistPath));
|
|
57
57
|
app.get('/{*path}', (_req, res) => {
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|