cdp-tunnel 1.6.1 → 2.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.
@@ -13,17 +13,6 @@ importScripts('cdp/index.js');
13
13
  importScripts('features/screencast.js');
14
14
  importScripts('features/automation-badge.js');
15
15
 
16
- // 为字符串添加hashCode方法(用于生成颜色索引)
17
- String.prototype.hashCode = function() {
18
- var hash = 0;
19
- for (var i = 0; i < this.length; i++) {
20
- var char = this.charCodeAt(i);
21
- hash = ((hash << 5) - hash) + char;
22
- hash = hash & hash; // Convert to 32bit integer
23
- }
24
- return hash;
25
- };
26
-
27
16
  (function() {
28
17
  'use strict';
29
18
 
@@ -271,7 +260,7 @@ String.prototype.hashCode = function() {
271
260
  if (groupId) {
272
261
  // 为不同的组使用不同的颜色
273
262
  var colors = ['blue', 'red', 'yellow', 'green', 'pink', 'purple', 'cyan', 'orange'];
274
- var colorIndex = Math.abs(groupName.hashCode ? groupName.hashCode() : 0) % colors.length;
263
+ var colorIndex = Math.abs(CDPUtils.hashCode(groupName)) % colors.length;
275
264
  var groupColor = colors[colorIndex];
276
265
 
277
266
  chrome.tabGroups.update(groupId, {
@@ -171,7 +171,7 @@ var SpecialHandler = (function() {
171
171
  }
172
172
  if (groupId) {
173
173
  var colors = ['blue', 'red', 'yellow', 'green', 'pink', 'purple', 'cyan', 'orange'];
174
- var colorIndex = Math.abs(groupName.hashCode ? groupName.hashCode() : 0) % colors.length;
174
+ var colorIndex = Math.abs(CDPUtils.hashCode(groupName)) % colors.length;
175
175
 
176
176
  chrome.tabGroups.update(groupId, {
177
177
  title: groupName,
@@ -217,17 +217,6 @@ var SpecialHandler = (function() {
217
217
  });
218
218
  }
219
219
 
220
- // 为字符串添加hashCode方法(用于生成颜色索引)
221
- String.prototype.hashCode = function() {
222
- var hash = 0;
223
- for (var i = 0; i < this.length; i++) {
224
- var char = this.charCodeAt(i);
225
- hash = ((hash << 5) - hash) + char;
226
- hash = hash & hash; // Convert to 32bit integer
227
- }
228
- return hash;
229
- };
230
-
231
220
  function targetActivateTarget(context) {
232
221
  var params = context.params;
233
222
  var targetId = params && params.targetId;
@@ -17,9 +17,20 @@ var CDPUtils = (function() {
17
17
  });
18
18
  }
19
19
 
20
+ function hashCode(str) {
21
+ var hash = 0;
22
+ for (var i = 0; i < str.length; i++) {
23
+ var char = str.charCodeAt(i);
24
+ hash = ((hash << 5) - hash) + char;
25
+ hash = hash & hash;
26
+ }
27
+ return hash;
28
+ }
29
+
20
30
  return {
21
31
  generateSessionId: generateSessionId,
22
32
  getChromeVersion: getChromeVersion,
23
- sleep: sleep
33
+ sleep: sleep,
34
+ hashCode: hashCode
24
35
  };
25
36
  })();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cdp-tunnel",
3
- "version": "1.6.1",
4
- "description": "Chrome Extension CDP Proxy - 通过 Chrome 扩展将 chrome.debugger API 暴露为 WebSocket 端点",
3
+ "version": "2.0.0",
4
+ "description": "Bridge Chrome's debugger API to WebSocket control your existing browser with Playwright/Puppeteer via CDP",
5
5
  "main": "server/proxy-server.js",
6
6
  "bin": "./cli/index.js",
7
7
  "scripts": {
@@ -19,12 +19,30 @@
19
19
  "keywords": [
20
20
  "cdp",
21
21
  "chrome-devtools-protocol",
22
+ "cdp-proxy",
22
23
  "playwright",
23
24
  "puppeteer",
24
- "chrome-extension"
25
+ "chrome-extension",
26
+ "browser-automation",
27
+ "web-scraping",
28
+ "remote-debugging",
29
+ "websocket",
30
+ "testing",
31
+ "browser-control"
25
32
  ],
26
33
  "author": "dyyz1993",
27
34
  "license": "Apache-2.0",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/dyyz1993/cdp-tunnel.git"
38
+ },
39
+ "homepage": "https://github.com/dyyz1993/cdp-tunnel#readme",
40
+ "bugs": {
41
+ "url": "https://github.com/dyyz1993/cdp-tunnel/issues"
42
+ },
43
+ "engines": {
44
+ "node": ">=16.0.0"
45
+ },
28
46
  "files": [
29
47
  "server/",
30
48
  "cli/",
@@ -226,10 +226,11 @@ async function handleHttpRequest(req, res) {
226
226
 
227
227
  if (url.pathname === '/json/version' || url.pathname === '/json/version/') {
228
228
  const payload = {
229
- Browser: 'CDP Bridge',
229
+ Browser: `Chrome/131.0.6778.86`,
230
230
  'Protocol-Version': '1.3',
231
- 'User-Agent': 'Chrome',
232
- 'V8-Version': '',
231
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.86 Safari/537.36',
232
+ 'V8-Version': '13.1.201.8',
233
+ 'WebKit-Version': '537.36',
233
234
  webSocketDebuggerUrl: buildWebSocketDebuggerUrl(req)
234
235
  };
235
236
  res.writeHead(200, { 'Content-Type': 'application/json' });
@@ -255,7 +256,9 @@ async function handleHttpRequest(req, res) {
255
256
  })
256
257
  .map(t => ({
257
258
  description: '',
258
- devtoolsFrontendUrl: '',
259
+ devtoolsFrontendUrl: `devtools://devtools/bundled/inspector.html?ws=${getHost(req)}/devtools/page/${t.targetId}`,
260
+ devtoolsFrontendUrlCompat: `devtools://devtools/bundled/inspector.html?ws=${getHost(req)}/devtools/page/${t.targetId}`,
261
+ faviconUrl: '',
259
262
  id: t.targetId,
260
263
  title: t.title || '',
261
264
  type: t.type,
@@ -1,72 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="UTF-8">
5
- <style>
6
- body {
7
- width: 300px;
8
- padding: 15px;
9
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
10
- font-size: 14px;
11
- }
12
- .status {
13
- display: flex;
14
- align-items: center;
15
- margin-bottom: 15px;
16
- }
17
- .status-dot {
18
- width: 10px;
19
- height: 10px;
20
- border-radius: 50%;
21
- margin-right: 8px;
22
- }
23
- .status-dot.active {
24
- background-color: #4CAF50;
25
- }
26
- .status-dot.inactive {
27
- background-color: #9E9E9E;
28
- }
29
- .config-section {
30
- margin-top: 15px;
31
- }
32
- .config-section label {
33
- display: block;
34
- margin-bottom: 5px;
35
- font-weight: 500;
36
- }
37
- .config-section input {
38
- width: 100%;
39
- padding: 8px;
40
- border: 1px solid #ddd;
41
- border-radius: 4px;
42
- box-sizing: border-box;
43
- }
44
- .config-section button {
45
- margin-top: 10px;
46
- padding: 8px 16px;
47
- background-color: #2196F3;
48
- color: white;
49
- border: none;
50
- border-radius: 4px;
51
- cursor: pointer;
52
- }
53
- .config-section button:hover {
54
- background-color: #1976D2;
55
- }
56
- </style>
57
- </head>
58
- <body>
59
- <div class="status">
60
- <div class="status-dot active" id="statusDot"></div>
61
- <span id="statusText">已激活</span>
62
- </div>
63
-
64
- <div class="config-section">
65
- <label>WebSocket 地址</label>
66
- <input type="text" id="wsAddress" placeholder="ws://localhost:9221/client">
67
- <button id="saveBtn">保存</button>
68
- </div>
69
-
70
- <script src="popup.js"></script>
71
- </body>
72
- </html>
@@ -1,34 +0,0 @@
1
- document.addEventListener('DOMContentLoaded', function() {
2
- var statusDot = document.getElementById('statusDot');
3
- var statusText = document.getElementById('statusText');
4
- var wsAddressInput = document.getElementById('wsAddress');
5
- var saveBtn = document.getElementById('saveBtn');
6
-
7
- chrome.storage.local.get(['wsAddress'], function(result) {
8
- if (result.wsAddress) {
9
- wsAddressInput.value = result.wsAddress;
10
- } else {
11
- wsAddressInput.value = 'ws://localhost:9221/plugin';
12
- }
13
- });
14
-
15
- saveBtn.addEventListener('click', function() {
16
- var newAddress = wsAddressInput.value.trim();
17
- if (newAddress) {
18
- chrome.storage.local.set({ wsAddress: newAddress }, function() {
19
- statusText.textContent = '已保存,正在重连...';
20
-
21
- chrome.runtime.sendMessage({ type: 'reconnect' }, function(response) {
22
- if (response && response.success) {
23
- statusText.textContent = '已激活';
24
- } else {
25
- statusText.textContent = '重连失败';
26
- }
27
- });
28
- });
29
- }
30
- });
31
-
32
- statusDot.classList.add('active');
33
- statusText.textContent = '已激活';
34
- });