@buoy-gg/network 1.7.2

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.
Files changed (67) hide show
  1. package/README.md +381 -0
  2. package/lib/commonjs/index.js +34 -0
  3. package/lib/commonjs/network/components/NetworkCopySettingsView.js +867 -0
  4. package/lib/commonjs/network/components/NetworkEventDetailView.js +837 -0
  5. package/lib/commonjs/network/components/NetworkEventItemCompact.js +323 -0
  6. package/lib/commonjs/network/components/NetworkFilterViewV3.js +297 -0
  7. package/lib/commonjs/network/components/NetworkModal.js +937 -0
  8. package/lib/commonjs/network/hooks/useNetworkEvents.js +320 -0
  9. package/lib/commonjs/network/hooks/useTickEveryMinute.js +34 -0
  10. package/lib/commonjs/network/index.js +102 -0
  11. package/lib/commonjs/network/types/index.js +1 -0
  12. package/lib/commonjs/network/utils/extractOperationName.js +80 -0
  13. package/lib/commonjs/network/utils/formatGraphQLVariables.js +219 -0
  14. package/lib/commonjs/network/utils/formatting.js +30 -0
  15. package/lib/commonjs/network/utils/networkEventStore.js +269 -0
  16. package/lib/commonjs/network/utils/networkListener.js +801 -0
  17. package/lib/commonjs/package.json +1 -0
  18. package/lib/commonjs/preset.js +83 -0
  19. package/lib/module/index.js +7 -0
  20. package/lib/module/network/components/NetworkCopySettingsView.js +862 -0
  21. package/lib/module/network/components/NetworkEventDetailView.js +834 -0
  22. package/lib/module/network/components/NetworkEventItemCompact.js +320 -0
  23. package/lib/module/network/components/NetworkFilterViewV3.js +293 -0
  24. package/lib/module/network/components/NetworkModal.js +933 -0
  25. package/lib/module/network/hooks/useNetworkEvents.js +316 -0
  26. package/lib/module/network/hooks/useTickEveryMinute.js +29 -0
  27. package/lib/module/network/index.js +20 -0
  28. package/lib/module/network/types/index.js +1 -0
  29. package/lib/module/network/utils/extractOperationName.js +76 -0
  30. package/lib/module/network/utils/formatGraphQLVariables.js +213 -0
  31. package/lib/module/network/utils/formatting.js +9 -0
  32. package/lib/module/network/utils/networkEventStore.js +265 -0
  33. package/lib/module/network/utils/networkListener.js +791 -0
  34. package/lib/module/preset.js +79 -0
  35. package/lib/typescript/index.d.ts +3 -0
  36. package/lib/typescript/index.d.ts.map +1 -0
  37. package/lib/typescript/network/components/NetworkCopySettingsView.d.ts +26 -0
  38. package/lib/typescript/network/components/NetworkCopySettingsView.d.ts.map +1 -0
  39. package/lib/typescript/network/components/NetworkEventDetailView.d.ts +13 -0
  40. package/lib/typescript/network/components/NetworkEventDetailView.d.ts.map +1 -0
  41. package/lib/typescript/network/components/NetworkEventItemCompact.d.ts +12 -0
  42. package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +1 -0
  43. package/lib/typescript/network/components/NetworkFilterViewV3.d.ts +22 -0
  44. package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +1 -0
  45. package/lib/typescript/network/components/NetworkModal.d.ts +14 -0
  46. package/lib/typescript/network/components/NetworkModal.d.ts.map +1 -0
  47. package/lib/typescript/network/hooks/useNetworkEvents.d.ts +72 -0
  48. package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +1 -0
  49. package/lib/typescript/network/hooks/useTickEveryMinute.d.ts +9 -0
  50. package/lib/typescript/network/hooks/useTickEveryMinute.d.ts.map +1 -0
  51. package/lib/typescript/network/index.d.ts +12 -0
  52. package/lib/typescript/network/index.d.ts.map +1 -0
  53. package/lib/typescript/network/types/index.d.ts +88 -0
  54. package/lib/typescript/network/types/index.d.ts.map +1 -0
  55. package/lib/typescript/network/utils/extractOperationName.d.ts +41 -0
  56. package/lib/typescript/network/utils/extractOperationName.d.ts.map +1 -0
  57. package/lib/typescript/network/utils/formatGraphQLVariables.d.ts +79 -0
  58. package/lib/typescript/network/utils/formatGraphQLVariables.d.ts.map +1 -0
  59. package/lib/typescript/network/utils/formatting.d.ts +6 -0
  60. package/lib/typescript/network/utils/formatting.d.ts.map +1 -0
  61. package/lib/typescript/network/utils/networkEventStore.d.ts +81 -0
  62. package/lib/typescript/network/utils/networkEventStore.d.ts.map +1 -0
  63. package/lib/typescript/network/utils/networkListener.d.ts +191 -0
  64. package/lib/typescript/network/utils/networkListener.d.ts.map +1 -0
  65. package/lib/typescript/preset.d.ts +76 -0
  66. package/lib/typescript/preset.d.ts.map +1 -0
  67. package/package.json +69 -0
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Network listener using Reactotron-style event pattern
3
+ * Simple and reliable network interception for React Native
4
+ */
5
+ export interface NetworkingEvent {
6
+ type: "request" | "response" | "error";
7
+ timestamp: Date;
8
+ duration?: number;
9
+ request: {
10
+ id: string;
11
+ url: string;
12
+ method: string;
13
+ headers?: Record<string, string>;
14
+ data?: unknown;
15
+ params?: Record<string, string>;
16
+ client?: "fetch" | "axios" | "graphql" | "grpc-web";
17
+ };
18
+ response?: {
19
+ status: number;
20
+ statusText?: string;
21
+ headers?: Record<string, string>;
22
+ body?: unknown;
23
+ size?: number;
24
+ };
25
+ error?: {
26
+ message: string;
27
+ stack?: string;
28
+ };
29
+ }
30
+ export type NetworkingEventListener = (event: NetworkingEvent) => void;
31
+ /**
32
+ * Network traffic interceptor for React Native applications
33
+ *
34
+ * This class intercepts both fetch and XMLHttpRequest operations to provide
35
+ * comprehensive network monitoring capabilities. It uses method swizzling to
36
+ * wrap native networking APIs while preserving their original functionality.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * // Start monitoring network traffic
41
+ * startNetworkListener();
42
+ *
43
+ * // Add a listener for network events
44
+ * const unsubscribe = addNetworkListener((event) => {
45
+ * if (event.type === 'response') {
46
+ * console.log(`${event.request.method} ${event.request.url}: ${event.response?.status}`);
47
+ * }
48
+ * });
49
+ *
50
+ * // Stop monitoring and cleanup
51
+ * unsubscribe();
52
+ * stopNetworkListener();
53
+ * ```
54
+ *
55
+ * @performance Uses lazy singleton pattern to minimize memory footprint
56
+ * @performance Includes URL filtering to ignore development traffic
57
+ */
58
+ declare class NetworkListener {
59
+ private listeners;
60
+ private isListening;
61
+ private requestCounter;
62
+ private ignoredUrls;
63
+ private originalFetch;
64
+ private originalXHROpen;
65
+ private originalXHRSend;
66
+ private originalXHRSetRequestHeader;
67
+ constructor();
68
+ /**
69
+ * Check if URL should be ignored from network monitoring
70
+ *
71
+ * Filters out development-related URLs like Metro bundler, debugger proxy,
72
+ * and symbolication requests to reduce noise in the network logs.
73
+ *
74
+ * @param url - The URL to check
75
+ * @returns True if the URL should be ignored
76
+ */
77
+ private shouldIgnoreUrl;
78
+ private emit;
79
+ /**
80
+ * Parse URL to extract query parameters and clean URL
81
+ *
82
+ * @param url - The URL to parse
83
+ * @returns Object containing cleaned URL and parsed query parameters
84
+ *
85
+ * @performance Uses manual parsing instead of URL constructor for better performance
86
+ */
87
+ private parseUrl;
88
+ /**
89
+ * Process response body with size limits to prevent memory issues
90
+ * @param response - The Response object to process
91
+ * @param maxSize - Maximum body size in bytes (default: 1MB)
92
+ * @returns Object containing body, size, and truncation status
93
+ */
94
+ private processResponseBody;
95
+ /**
96
+ * Format bytes into human-readable format
97
+ * @param bytes - Number of bytes
98
+ * @returns Formatted string (e.g., "1.5 MB")
99
+ */
100
+ private formatBytes;
101
+ private getResponseSize;
102
+ /**
103
+ * Handle XMLHttpRequest response processing
104
+ * This method processes the response and emits appropriate events
105
+ */
106
+ private handleXHRResponse;
107
+ /**
108
+ * Start intercepting network operations by swizzling fetch and XMLHttpRequest
109
+ *
110
+ * This method replaces the global fetch function and XMLHttpRequest methods
111
+ * with instrumented versions that emit events while preserving original functionality.
112
+ *
113
+ * @throws Will log warnings if already listening
114
+ *
115
+ * @performance Uses method swizzling for minimal runtime overhead
116
+ * @performance Includes request deduplication through ignored URL patterns
117
+ */
118
+ startListening(): void;
119
+ /**
120
+ * Stop listening and restore original networking methods
121
+ *
122
+ * This method restores the original fetch and XMLHttpRequest implementations,
123
+ * effectively disabling network monitoring.
124
+ */
125
+ stopListening(): void;
126
+ /**
127
+ * Add a listener for network events
128
+ *
129
+ * @param listener - Callback function to handle network events
130
+ * @returns Unsubscribe function to remove the listener
131
+ */
132
+ addListener(listener: NetworkingEventListener): () => void;
133
+ removeAllListeners(): void;
134
+ get isActive(): boolean;
135
+ get listenerCount(): number;
136
+ }
137
+ /**
138
+ * Access function for the singleton NetworkListener instance
139
+ *
140
+ * @returns Function that returns the NetworkListener instance
141
+ */
142
+ export declare const networkListener: () => NetworkListener;
143
+ /**
144
+ * Start network traffic monitoring
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * startNetworkListener();
149
+ * console.log('Network monitoring started');
150
+ * ```
151
+ */
152
+ export declare const startNetworkListener: () => void;
153
+ /**
154
+ * Stop network traffic monitoring
155
+ */
156
+ export declare const stopNetworkListener: () => void;
157
+ /**
158
+ * Add a listener for network events
159
+ *
160
+ * @param listener - Callback function to handle network events
161
+ * @returns Unsubscribe function to remove the listener
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * const unsubscribe = addNetworkListener((event) => {
166
+ * console.log(`Network ${event.type}:`, event.request.url);
167
+ * });
168
+ *
169
+ * // Later...
170
+ * unsubscribe();
171
+ * ```
172
+ */
173
+ export declare const addNetworkListener: (listener: NetworkingEventListener) => () => void;
174
+ /**
175
+ * Remove all registered network event listeners
176
+ */
177
+ export declare const removeAllNetworkListeners: () => void;
178
+ /**
179
+ * Check if network monitoring is currently active
180
+ *
181
+ * @returns True if currently intercepting network traffic
182
+ */
183
+ export declare const isNetworkListening: () => boolean;
184
+ /**
185
+ * Get the number of registered network event listeners
186
+ *
187
+ * @returns Number of active listeners
188
+ */
189
+ export declare const getNetworkListenerCount: () => number;
190
+ export {};
191
+ //# sourceMappingURL=networkListener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkListener.d.ts","sourceRoot":"","sources":["../../../../src/network/utils/networkListener.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACvC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;KACrD,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAQ;IAG9B,OAAO,CAAC,WAAW,CASjB;IAGF,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,eAAe,CAAuC;IAC9D,OAAO,CAAC,2BAA2B,CAAmD;;IAWtF;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,IAAI;IAUZ;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;IA0BhB;;;;;OAKG;YACW,mBAAmB;IA2DjC;;;;OAIG;IACH,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,eAAe;IAavB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA6MzB;;;;;;;;;;OAUG;IACH,cAAc;IAkTd;;;;;OAKG;IACH,aAAa;IAkBb;;;;;OAKG;IACH,WAAW,CAAC,QAAQ,EAAE,uBAAuB;IAa7C,kBAAkB;IAKlB,IAAI,QAAQ,YAEX;IAGD,IAAI,aAAa,WAEhB;CACF;AAsBD;;;;GAIG;AACH,eAAO,MAAM,eAAe,uBAAqB,CAAC;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,YAA8C,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,mBAAmB,YAA6C,CAAC;AAE9E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,uBAAuB,eACxB,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,yBAAyB,YACK,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,eAAsC,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,cAA2C,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Pre-configured network monitoring tool for FloatingDevTools
3
+ *
4
+ * This preset provides a zero-config way to add network request monitoring to your dev tools.
5
+ * Just import and add it to your apps array!
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * import { networkToolPreset } from '@buoy-gg/network';
10
+ *
11
+ * const installedApps = [
12
+ * networkToolPreset, // That's it!
13
+ * // ...other tools
14
+ * ];
15
+ * ```
16
+ */
17
+ import { NetworkModal } from "./network/components/NetworkModal";
18
+ /**
19
+ * Pre-configured network monitoring tool for FloatingDevTools.
20
+ * Includes:
21
+ * - Live network request monitoring
22
+ * - Request/response inspection
23
+ * - Filter by status, method, URL
24
+ * - Timing information
25
+ */
26
+ export declare const networkToolPreset: {
27
+ id: string;
28
+ name: string;
29
+ description: string;
30
+ slot: "both";
31
+ icon: ({ size }: {
32
+ size: number;
33
+ }) => import("react").JSX.Element;
34
+ component: typeof NetworkModal;
35
+ props: {
36
+ enableSharedModalDimensions: boolean;
37
+ };
38
+ };
39
+ /**
40
+ * Create a custom network monitoring tool configuration.
41
+ * Use this if you want to override default settings.
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * import { createNetworkTool } from '@buoy-gg/network';
46
+ *
47
+ * const myNetworkTool = createNetworkTool({
48
+ * name: "REQUESTS",
49
+ * iconColor: "#9945FF", // Purple color
50
+ * enableSharedModalDimensions: true,
51
+ * });
52
+ * ```
53
+ */
54
+ export declare function createNetworkTool(options?: {
55
+ /** Tool name (default: "NET") */
56
+ name?: string;
57
+ /** Tool description */
58
+ description?: string;
59
+ /** Custom tool ID (default: "network") */
60
+ id?: string;
61
+ /** Enable shared modal dimensions */
62
+ enableSharedModalDimensions?: boolean;
63
+ }): {
64
+ id: string;
65
+ name: string;
66
+ description: string;
67
+ slot: "both";
68
+ icon: ({ size }: {
69
+ size: number;
70
+ }) => import("react").JSX.Element;
71
+ component: typeof NetworkModal;
72
+ props: {
73
+ enableSharedModalDimensions: boolean;
74
+ };
75
+ };
76
+ //# sourceMappingURL=preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../src/preset.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;;;;;qBAKX;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;;;;;CAKlC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAC1C,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;;;;;qBAMoB;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;;;;;EASpC"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@buoy-gg/network",
3
+ "version": "1.7.2",
4
+ "description": "network package",
5
+ "main": "lib/commonjs/index.js",
6
+ "module": "lib/module/index.js",
7
+ "types": "lib/typescript/index.d.ts",
8
+ "react-native": "src/index.tsx",
9
+ "source": "src/index.tsx",
10
+ "files": [
11
+ "lib"
12
+ ],
13
+ "sideEffects": false,
14
+ "scripts": {
15
+ "build": "bob build",
16
+ "typecheck": "tsc --noEmit",
17
+ "prepublishOnly": "bob build",
18
+ "clean": "rimraf lib",
19
+ "test": "pnpm run typecheck",
20
+ "test:interceptor": "node test-network-interceptor.js",
21
+ "test:comprehensive": "node test-comprehensive.js"
22
+ },
23
+ "dependencies": {
24
+ "@buoy-gg/react-query": "workspace:*",
25
+ "@buoy-gg/shared-ui": "workspace:*"
26
+ },
27
+ "peerDependencies": {
28
+ "react": "*",
29
+ "react-native": "*"
30
+ },
31
+ "devDependencies": {
32
+ "@types/react": "^19.1.0",
33
+ "@types/react-native": "^0.73.0",
34
+ "node-fetch": "^2.7.0",
35
+ "typescript": "~5.8.3"
36
+ },
37
+ "react-native-builder-bob": {
38
+ "source": "src",
39
+ "output": "lib",
40
+ "targets": [
41
+ [
42
+ "commonjs",
43
+ {
44
+ "sourceMaps": false
45
+ }
46
+ ],
47
+ [
48
+ "module",
49
+ {
50
+ "sourceMaps": false
51
+ }
52
+ ],
53
+ "typescript"
54
+ ]
55
+ },
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "https://github.com/LovesWorking/react-native-buoy.git",
59
+ "directory": "packages/network"
60
+ },
61
+ "bugs": {
62
+ "url": "https://github.com/LovesWorking/react-native-buoy/issues"
63
+ },
64
+ "homepage": "https://github.com/LovesWorking/react-native-buoy/tree/main/packages/network#readme",
65
+ "publishConfig": {
66
+ "access": "public",
67
+ "tag": "latest"
68
+ }
69
+ }