cdp-tunnel 1.0.0

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 (46) hide show
  1. package/.github/workflows/publish.yml +92 -0
  2. package/.github/workflows/release-assets.yml +50 -0
  3. package/LICENSE +81 -0
  4. package/PUBLISH.md +65 -0
  5. package/README.md +228 -0
  6. package/cli/guide.html +753 -0
  7. package/cli/icon.svg +13 -0
  8. package/cli/icon128.png +0 -0
  9. package/cli/index.js +357 -0
  10. package/docs/README_CN.md +204 -0
  11. package/docs/config-page-screenshot.png +0 -0
  12. package/extension-new/background.js +294 -0
  13. package/extension-new/cdp/handler/forward.js +44 -0
  14. package/extension-new/cdp/handler/local.js +233 -0
  15. package/extension-new/cdp/handler/special.js +442 -0
  16. package/extension-new/cdp/index.js +104 -0
  17. package/extension-new/cdp/response.js +49 -0
  18. package/extension-new/config-page-preview.html +769 -0
  19. package/extension-new/config-page.js +318 -0
  20. package/extension-new/core/debugger.js +310 -0
  21. package/extension-new/core/state.js +384 -0
  22. package/extension-new/core/websocket.js +326 -0
  23. package/extension-new/features/automation-badge.js +113 -0
  24. package/extension-new/features/screencast.js +221 -0
  25. package/extension-new/icons/icon128.png +0 -0
  26. package/extension-new/icons/icon16.png +0 -0
  27. package/extension-new/icons/icon48.png +0 -0
  28. package/extension-new/manifest.json +39 -0
  29. package/extension-new/popup.html +72 -0
  30. package/extension-new/popup.js +34 -0
  31. package/extension-new/utils/config.js +20 -0
  32. package/extension-new/utils/diagnostics.js +560 -0
  33. package/extension-new/utils/helpers.js +25 -0
  34. package/extension-new/utils/logger.js +64 -0
  35. package/package.json +42 -0
  36. package/server/modules/config.js +28 -0
  37. package/server/modules/logger.js +197 -0
  38. package/server/proxy-server.js +1431 -0
  39. package/tests/playwright-demo.js +45 -0
  40. package/tests/playwright-interactive.js +261 -0
  41. package/tests/playwright-multi-demo.js +60 -0
  42. package/tests/playwright-multi.js +85 -0
  43. package/tests/playwright-single.js +41 -0
  44. package/tests/screenshot-config.js +35 -0
  45. package/tests/test-client.js +89 -0
  46. package/tests/test-multi-client.js +129 -0
@@ -0,0 +1,129 @@
1
+ const WebSocket = require('ws');
2
+
3
+ const SERVER_URL = process.argv[2] || 'ws://localhost:9221';
4
+ const NUM_CLIENTS = parseInt(process.argv[3]) || 2;
5
+
6
+ console.log(`Starting ${NUM_CLIENTS} test clients connecting to ${SERVER_URL}...\n`);
7
+
8
+ const clients = [];
9
+
10
+ for (let i = 0; i < NUM_CLIENTS; i++) {
11
+ const clientId = `test-client-${i + 1}`;
12
+ const client = createClient(clientId);
13
+ clients.push(client);
14
+ }
15
+
16
+ function createClient(clientId) {
17
+ console.log(`[${clientId}] Connecting...`);
18
+
19
+ const ws = new WebSocket(SERVER_URL);
20
+ let commandId = 1;
21
+
22
+ ws.on('open', () => {
23
+ console.log(`[${clientId}] Connected!`);
24
+
25
+ ws.send(JSON.stringify({
26
+ type: 'identify',
27
+ clientId: clientId
28
+ }));
29
+
30
+ ws.send(JSON.stringify({
31
+ id: commandId++,
32
+ method: 'Target.setDiscoverTargets',
33
+ params: { discover: true }
34
+ }));
35
+ });
36
+
37
+ ws.on('message', (data) => {
38
+ try {
39
+ const msg = JSON.parse(data.toString());
40
+
41
+ if (msg.method === 'Target.targetCreated') {
42
+ console.log(`[${clientId}] Target created: ${msg.params.targetInfo?.url || msg.params.targetInfo?.type}`);
43
+ } else if (msg.method === 'Target.attachedToTarget') {
44
+ console.log(`[${clientId}] Attached to target: sessionId=${msg.params.sessionId?.substring(0, 8)}...`);
45
+ } else if (msg.method === 'Target.targetDestroyed') {
46
+ console.log(`[${clientId}] Target destroyed`);
47
+ } else if (msg.id) {
48
+ if (msg.result?.targetInfos) {
49
+ console.log(`[${clientId}] Got ${msg.result.targetInfos.length} targets`);
50
+ }
51
+ }
52
+ } catch (e) {}
53
+ });
54
+
55
+ ws.on('close', () => {
56
+ console.log(`[${clientId}] Disconnected`);
57
+ });
58
+
59
+ ws.on('error', (err) => {
60
+ console.error(`[${clientId}] Error:`, err.message);
61
+ });
62
+
63
+ return {
64
+ ws,
65
+ clientId,
66
+ send: (method, params) => {
67
+ ws.send(JSON.stringify({ id: commandId++, method, params }));
68
+ },
69
+ close: () => ws.close()
70
+ };
71
+ }
72
+
73
+ function interactiveTest() {
74
+ const readline = require('readline');
75
+ const rl = readline.createInterface({
76
+ input: process.stdin,
77
+ output: process.stdout
78
+ });
79
+
80
+ console.log('\n=== Interactive Test Commands ===');
81
+ console.log(' n <client_idx> <url> - Client #n creates new page');
82
+ console.log(' c <client_idx> - Client #n closes current page');
83
+ console.log(' s <client_idx> - Client #n scrolls page');
84
+ console.log(' l - List all clients');
85
+ console.log(' q - Quit');
86
+ console.log('================================\n');
87
+
88
+ rl.on('line', (input) => {
89
+ const parts = input.trim().split(' ');
90
+ const cmd = parts[0];
91
+
92
+ if (cmd === 'q') {
93
+ console.log('Closing all clients...');
94
+ clients.forEach(c => c.close());
95
+ setTimeout(() => process.exit(0), 500);
96
+ } else if (cmd === 'l') {
97
+ console.log(`Active clients: ${clients.length}`);
98
+ clients.forEach((c, i) => {
99
+ console.log(` #${i + 1}: ${c.clientId} - ${c.ws.readyState === WebSocket.OPEN ? 'connected' : 'disconnected'}`);
100
+ });
101
+ } else if (cmd === 'n' && parts.length >= 3) {
102
+ const idx = parseInt(parts[1]) - 1;
103
+ const url = parts[2] || 'https://www.baidu.com';
104
+ if (clients[idx]) {
105
+ console.log(`Client #${idx + 1} creating page: ${url}`);
106
+ clients[idx].send('Target.createTarget', { url });
107
+ }
108
+ } else if (cmd === 's' && parts.length >= 2) {
109
+ const idx = parseInt(parts[1]) - 1;
110
+ if (clients[idx]) {
111
+ console.log(`Client #${idx + 1} scrolling...`);
112
+ clients[idx].send('Runtime.evaluate', {
113
+ expression: 'window.scrollBy(0, 100)'
114
+ });
115
+ }
116
+ }
117
+ });
118
+ }
119
+
120
+ setTimeout(interactiveTest, 1000);
121
+
122
+ process.on('SIGINT', () => {
123
+ console.log('\nClosing all clients...');
124
+ clients.forEach(c => c.close());
125
+ process.exit(0);
126
+ });
127
+
128
+ console.log('Usage: node test-multi-client.js [server_url] [num_clients]');
129
+ console.log('Example: node test-multi-client.js ws://localhost:9221 2\n');