Skip to content

Commit 279caed

Browse files
authored
Merge pull request #3 from cmcWebCode40/feat/websocket-debugger-support
Feat/websocket debugger support
2 parents 5d701f4 + 56d36a1 commit 279caed

30 files changed

Lines changed: 3569 additions & 1154 deletions

README.md

Lines changed: 190 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# React Native API Debugger
22

3-
A network request debugging tool for React Native applications. Monitor, inspect, and debug HTTP requests with a draggable overlay interface.
3+
A comprehensive network debugging tool for React Native applications. Monitor, inspect, and debug HTTP requests and WebSocket connections with a unified tabbed overlay interface.
44

55
[![npm version](https://img.shields.io/npm/v/react-native-api-debugger)](https://www.npmjs.com/package/react-native-api-debugger)
66
[![downloads](https://img.shields.io/npm/dm/react-native-api-debugger)](https://www.npmjs.com/package/react-native-api-debugger)
@@ -10,16 +10,29 @@ A network request debugging tool for React Native applications. Monitor, inspect
1010

1111
## Features
1212

13+
### HTTP Debugging
1314
- **Network Interception** - Automatically captures all `fetch()` and `XMLHttpRequest` calls
14-
- **Draggable Overlay** - Floating button that can be positioned anywhere on screen
1515
- **Request Details** - View headers, body, response, timing, and status codes
1616
- **cURL Export** - Copy requests as cURL commands
1717
- **Advanced Filtering** - Filter by status code (2xx, 3xx, 4xx, 5xx), search by URL/method/body
1818
- **Export Logs** - Export to HAR, Postman Collection, or JSON formats
1919
- **Request Replay** - Re-execute captured requests with optional modifications
20-
- **Dark/Light Theme** - Toggle between themes
2120
- **Slow Request Detection** - Visual indicator for requests exceeding threshold
2221
- **Sensitive Data Redaction** - Detect and mask sensitive headers and body fields
22+
23+
### WebSocket Debugging
24+
- **WebSocket Interception** - Automatically captures all WebSocket connections
25+
- **Connection Monitoring** - Track connection state (connecting, open, closing, closed)
26+
- **Message Logging** - View sent and received messages with timestamps
27+
- **Message Filtering** - Filter by direction (sent/received) or search by content
28+
- **Binary Support** - Handles text and binary message types
29+
- **Connection Metrics** - Track message counts, bytes transferred, and connection duration
30+
- **Live Indicators** - Visual indicators for active connections
31+
32+
### General
33+
- **Unified Interface** - Tabbed modal with HTTP and WebSocket views
34+
- **Draggable Overlay** - Floating button that can be positioned anywhere on screen
35+
- **Dark/Light Theme** - Toggle between themes
2336
- **Individual Log Deletion** - Remove specific entries without clearing all logs
2437
- **Device Shake Support** - Shake to show/hide the debugger
2538
- **TypeScript Support** - Full type definitions included
@@ -67,7 +80,7 @@ npm install react-native-svg
6780

6881
## Quick Setup
6982

70-
### 1. Basic Usage (No Dependencies)
83+
### 1. Basic Usage (HTTP Only)
7184

7285
```tsx
7386
import React, { useEffect } from 'react';
@@ -94,17 +107,59 @@ export default function App() {
94107
}
95108
```
96109

97-
### 2. With Draggable Button
110+
### 2. Full Setup (HTTP + WebSocket)
111+
112+
Use `NetworkLoggerOverlay` with `enableWebSocket={true}` for the unified tabbed interface.
113+
114+
```tsx
115+
import React, { useEffect } from 'react';
116+
import { View } from 'react-native';
117+
import {
118+
networkLogger,
119+
webSocketLogger,
120+
NetworkLoggerOverlay
121+
} from 'react-native-api-debugger';
122+
123+
export default function App() {
124+
useEffect(() => {
125+
// Setup HTTP interceptor
126+
networkLogger.setupInterceptor();
127+
128+
// Setup WebSocket interceptor
129+
webSocketLogger.setupInterceptor();
130+
}, []);
131+
132+
return (
133+
<View style={{ flex: 1 }}>
134+
{/* Your app content */}
135+
136+
<NetworkLoggerOverlay
137+
networkLogger={networkLogger}
138+
webSocketLogger={webSocketLogger}
139+
enableWebSocket={true}
140+
draggable={false}
141+
/>
142+
</View>
143+
);
144+
}
145+
```
146+
147+
### 3. With Draggable Button
98148

99149
Requires `react-native-gesture-handler` and `react-native-reanimated`.
100150

101151
```tsx
102152
import { GestureHandlerRootView } from 'react-native-gesture-handler';
103-
import { networkLogger, NetworkLoggerOverlay } from 'react-native-api-debugger';
153+
import {
154+
networkLogger,
155+
webSocketLogger,
156+
NetworkLoggerOverlay
157+
} from 'react-native-api-debugger';
104158

105159
export default function App() {
106160
useEffect(() => {
107161
networkLogger.setupInterceptor();
162+
webSocketLogger.setupInterceptor();
108163
}, []);
109164

110165
return (
@@ -113,24 +168,28 @@ export default function App() {
113168

114169
<NetworkLoggerOverlay
115170
networkLogger={networkLogger}
171+
webSocketLogger={webSocketLogger}
172+
enableWebSocket={true}
116173
draggable={true}
117174
/>
118175
</GestureHandlerRootView>
119176
);
120177
}
121178
```
122179

123-
### 3. Full Featured Setup
180+
### 4. Full Featured Setup
124181

125182
```tsx
126183
<NetworkLoggerOverlay
127184
networkLogger={networkLogger}
185+
webSocketLogger={webSocketLogger}
186+
enableWebSocket={true}
128187
draggable={true}
129188
enableDeviceShake={true}
130189
useCopyToClipboard={true}
131190
showRequestHeader={true}
132191
showResponseHeader={true}
133-
theme="light"
192+
theme="dark"
134193
onThemeChange={(theme) => console.log('Theme:', theme)}
135194
/>
136195
```
@@ -197,11 +256,18 @@ const config = networkLogger.getConfig();
197256

198257
```tsx
199258
useEffect(() => {
200-
const unsubscribe = networkLogger.subscribe((logs) => {
201-
console.log('Logs updated:', logs.length);
259+
const unsubscribeHttp = networkLogger.subscribe((logs) => {
260+
console.log('HTTP logs updated:', logs.length);
261+
});
262+
263+
const unsubscribeWs = webSocketLogger.subscribe((logs) => {
264+
console.log('WebSocket logs updated:', logs.length);
202265
});
203266

204-
return () => unsubscribe();
267+
return () => {
268+
unsubscribeHttp();
269+
unsubscribeWs();
270+
};
205271
}, []);
206272
```
207273

@@ -273,16 +339,62 @@ const curlCommand = generateCurl(log);
273339
// curl -X POST 'https://api.example.com/users' -H 'Content-Type: application/json' -d '{"name":"John"}'
274340
```
275341

342+
### WebSocket Logger Methods
343+
344+
```tsx
345+
import { webSocketLogger } from 'react-native-api-debugger';
346+
347+
// Initialize interception
348+
webSocketLogger.setupInterceptor();
349+
350+
// Configure options
351+
webSocketLogger.configure({
352+
maxConnections: 50, // Maximum connections to store
353+
captureMessages: true, // Log individual messages
354+
maxMessagesPerConnection: 100, // Max messages per connection
355+
ignoredUrls: ['*/health'], // URL patterns to ignore
356+
});
357+
358+
// Get all logs
359+
const logs = webSocketLogger.getLogs();
360+
361+
// Get log count
362+
const count = webSocketLogger.getLogCount();
363+
364+
// Clear all logs
365+
webSocketLogger.clearLogs();
366+
367+
// Delete a specific log
368+
webSocketLogger.deleteLog(logId);
369+
370+
// Close an active connection
371+
webSocketLogger.closeConnection(logId);
372+
373+
// Enable/disable logging
374+
webSocketLogger.enable();
375+
webSocketLogger.disable();
376+
377+
// Get active connections count
378+
const activeCount = webSocketLogger.getActiveConnectionsCount();
379+
380+
// Restore original WebSocket (remove interception)
381+
webSocketLogger.restoreInterceptor();
382+
```
383+
276384
---
277385

278386
## API Reference
279387

280388
### NetworkLoggerOverlay Props
281389

390+
The unified overlay component with HTTP and optional WebSocket tabs.
391+
282392
| Prop | Type | Default | Description |
283393
|------|------|---------|-------------|
284-
| `networkLogger` | `NetworkLogger` | Required | The logger instance |
394+
| `networkLogger` | `NetworkLogger` | Required | HTTP logger instance |
395+
| `webSocketLogger` | `WebSocketLogger` | - | WebSocket logger instance (required if `enableWebSocket` is true) |
285396
| `enabled` | `boolean` | `__DEV__` | Enable/disable the overlay |
397+
| `enableWebSocket` | `boolean` | `false` | Enable WebSocket debugging tab |
286398
| `draggable` | `boolean` | `false` | Enable draggable button |
287399
| `enableDeviceShake` | `boolean` | `false` | Show on device shake |
288400
| `useCopyToClipboard` | `boolean` | `false` | Enable clipboard copy |
@@ -328,6 +440,46 @@ interface NetworkLog {
328440
}
329441
```
330442

443+
### WebSocketLog Type
444+
445+
```typescript
446+
interface WebSocketLog {
447+
id: number;
448+
url: string;
449+
state: 'connecting' | 'open' | 'closing' | 'closed';
450+
protocols?: string[];
451+
connectTime: string;
452+
openTime?: string;
453+
closeTime?: string;
454+
closeCode?: number;
455+
closeReason?: string;
456+
error?: string;
457+
handshakeDuration?: number;
458+
messages: WebSocketMessage[];
459+
messageCount: { sent: number; received: number };
460+
bytesReceived: number;
461+
bytesSent: number;
462+
}
463+
464+
interface WebSocketMessage {
465+
id: number;
466+
direction: 'sent' | 'received';
467+
data: string;
468+
dataType: 'text' | 'binary';
469+
timestamp: string;
470+
size: number;
471+
}
472+
```
473+
474+
### WebSocketLoggerConfig
475+
476+
| Option | Type | Default | Description |
477+
|--------|------|---------|-------------|
478+
| `maxConnections` | `number` | `100` | Maximum connections to store |
479+
| `captureMessages` | `boolean` | `true` | Log individual messages |
480+
| `maxMessagesPerConnection` | `number` | `100` | Max messages per connection |
481+
| `ignoredUrls` | `string[]` | `[]` | URL patterns to ignore |
482+
331483
---
332484

333485
## Production Safety
@@ -383,9 +535,35 @@ Make sure `setupInterceptor()` is called before any network requests:
383535
```tsx
384536
useEffect(() => {
385537
networkLogger.setupInterceptor();
538+
webSocketLogger.setupInterceptor();
386539
}, []); // Empty dependency array - runs once on mount
387540
```
388541

542+
### WebSocket connections not appearing
543+
544+
Ensure you have:
545+
1. Called `webSocketLogger.setupInterceptor()` before any WebSocket connections
546+
2. Set `enableWebSocket={true}` on the NetworkLoggerOverlay
547+
3. Passed the `webSocketLogger` prop
548+
549+
```tsx
550+
<NetworkLoggerOverlay
551+
networkLogger={networkLogger}
552+
webSocketLogger={webSocketLogger}
553+
enableWebSocket={true} // Required to show WebSocket tab
554+
draggable={true}
555+
/>
556+
```
557+
558+
### Setup error messages
559+
560+
The debugger will throw helpful error messages if interceptors aren't initialized:
561+
562+
- **HTTP**: If `networkLogger.setupInterceptor()` wasn't called before rendering
563+
- **WebSocket**: If `enableWebSocket={true}` but `webSocketLogger.setupInterceptor()` wasn't called
564+
565+
These errors include code examples to help you fix the issue quickly.
566+
389567
---
390568

391569
## Contributing

0 commit comments

Comments
 (0)