@vibetechnologies/chrome-sync 0.4.0 → 0.5.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.
- package/README.md +23 -13
- package/dist/api.d.ts +1 -0
- package/dist/api.js +53 -1
- package/dist/api.js.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/extract.js +18 -7
- package/dist/extract.js.map +1 -1
- package/dist/server.d.ts +9 -0
- package/dist/server.js +93 -32
- package/dist/server.js.map +1 -1
- package/package.json +9 -2
- package/src/api.ts +60 -1
- package/src/cli.ts +1 -0
- package/src/extract.ts +21 -8
- package/src/server.ts +105 -33
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# @vibetechnologies/
|
|
1
|
+
# @vibetechnologies/chrome-sync
|
|
2
2
|
|
|
3
3
|
Sync browser cookies and sessions from your local Chrome to your OpenClaw cloud browser.
|
|
4
4
|
|
|
@@ -9,7 +9,13 @@ Cloud browsers can't log into Google, GitHub, or other sites that detect automat
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
|
|
12
|
+
npx @vibetechnologies/chrome-sync login
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Or install globally:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g @vibetechnologies/chrome-sync
|
|
13
19
|
```
|
|
14
20
|
|
|
15
21
|
## Usage
|
|
@@ -17,29 +23,33 @@ npm install -g @vibetechnologies/browser-sync
|
|
|
17
23
|
### 1. Authenticate
|
|
18
24
|
|
|
19
25
|
```bash
|
|
20
|
-
browser
|
|
26
|
+
# Opens browser for authentication
|
|
27
|
+
chrome-sync login
|
|
28
|
+
|
|
29
|
+
# Or use a direct token (CI/automation)
|
|
30
|
+
chrome-sync login --token <your-api-token>
|
|
21
31
|
```
|
|
22
32
|
|
|
23
33
|
### 2. Push cookies to cloud browser
|
|
24
34
|
|
|
25
35
|
```bash
|
|
26
|
-
# Sync
|
|
27
|
-
|
|
36
|
+
# Sync all cookies
|
|
37
|
+
chrome-sync push
|
|
28
38
|
|
|
29
|
-
# Sync
|
|
30
|
-
|
|
39
|
+
# Sync specific domains
|
|
40
|
+
chrome-sync push --domains google.com,gmail.com
|
|
31
41
|
|
|
32
42
|
# Use a specific Chrome profile
|
|
33
|
-
|
|
43
|
+
chrome-sync push --domains google.com --profile "Profile 1"
|
|
34
44
|
|
|
35
45
|
# Dry run — see what would be synced
|
|
36
|
-
|
|
46
|
+
chrome-sync push --dry-run
|
|
37
47
|
```
|
|
38
48
|
|
|
39
49
|
### 3. List Chrome profiles
|
|
40
50
|
|
|
41
51
|
```bash
|
|
42
|
-
|
|
52
|
+
chrome-sync profiles
|
|
43
53
|
```
|
|
44
54
|
|
|
45
55
|
## How it works
|
|
@@ -61,18 +71,18 @@ browser-sync profiles
|
|
|
61
71
|
|
|
62
72
|
- Cookies are only sent to your authenticated tenant
|
|
63
73
|
- Transport uses HTTPS
|
|
64
|
-
- Local auth token stored with 0600 permissions at `~/.config/
|
|
74
|
+
- Local auth token stored with 0600 permissions at `~/.config/chrome-sync/auth.json`
|
|
65
75
|
- No cookies are stored server-side — they're injected directly into the browser process
|
|
66
76
|
|
|
67
77
|
## Programmatic API
|
|
68
78
|
|
|
69
79
|
```typescript
|
|
70
|
-
import { extractStorageState, pushCookies,
|
|
80
|
+
import { extractStorageState, pushCookies, loginWithToken } from "@vibetechnologies/chrome-sync";
|
|
71
81
|
|
|
72
82
|
// Extract Google cookies from local Chrome
|
|
73
83
|
const state = await extractStorageState([".google.com", ".gmail.com"]);
|
|
74
84
|
|
|
75
85
|
// Push to cloud
|
|
76
|
-
await
|
|
86
|
+
await loginWithToken("https://console.openclaw.vibebrowser.app", "your-token");
|
|
77
87
|
await pushCookies(state);
|
|
78
88
|
```
|
package/dist/api.d.ts
CHANGED
package/dist/api.js
CHANGED
|
@@ -50,11 +50,13 @@ export async function loginViaBrowser(apiUrl = "https://console.openclaw.vibebro
|
|
|
50
50
|
const url = new URL(req.url ?? "/", `http://localhost`);
|
|
51
51
|
if (url.pathname === "/callback") {
|
|
52
52
|
const token = url.searchParams.get("token");
|
|
53
|
+
const refreshToken = url.searchParams.get("refresh_token");
|
|
53
54
|
const username = url.searchParams.get("username");
|
|
54
55
|
const subdomain = url.searchParams.get("subdomain");
|
|
55
56
|
if (!token) {
|
|
56
57
|
res.writeHead(400, { "Content-Type": "text/html" });
|
|
57
58
|
res.end("<html><body><h2>Authentication failed</h2><p>No token received. Close this window and try again.</p></body></html>");
|
|
59
|
+
server.closeAllConnections();
|
|
58
60
|
server.close();
|
|
59
61
|
reject(new Error("No token received from server"));
|
|
60
62
|
return;
|
|
@@ -62,12 +64,15 @@ export async function loginViaBrowser(apiUrl = "https://console.openclaw.vibebro
|
|
|
62
64
|
const config = {
|
|
63
65
|
apiUrl,
|
|
64
66
|
token,
|
|
67
|
+
refreshToken: refreshToken || undefined,
|
|
65
68
|
username: username || "user",
|
|
66
69
|
subdomain: subdomain || "",
|
|
67
70
|
};
|
|
68
71
|
saveAuth(config);
|
|
69
72
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
70
73
|
res.end(`<html><body><h2>✓ Authenticated as ${config.username}</h2><p>You can close this window and return to the terminal.</p></body></html>`);
|
|
74
|
+
clearTimeout(timeout);
|
|
75
|
+
server.closeAllConnections();
|
|
71
76
|
server.close();
|
|
72
77
|
resolve(config);
|
|
73
78
|
}
|
|
@@ -98,7 +103,8 @@ export async function loginViaBrowser(apiUrl = "https://console.openclaw.vibebro
|
|
|
98
103
|
console.log(` If it doesn't open, visit: ${authUrl}`);
|
|
99
104
|
});
|
|
100
105
|
// Timeout after 2 minutes
|
|
101
|
-
setTimeout(() => {
|
|
106
|
+
const timeout = setTimeout(() => {
|
|
107
|
+
server.closeAllConnections();
|
|
102
108
|
server.close();
|
|
103
109
|
reject(new Error("Authentication timed out (2 minutes). Try again."));
|
|
104
110
|
}, 120_000);
|
|
@@ -123,6 +129,27 @@ export async function loginWithToken(apiUrl, token) {
|
|
|
123
129
|
saveAuth(config);
|
|
124
130
|
return config;
|
|
125
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Refresh the access token using the stored refresh token.
|
|
134
|
+
* Updates the saved auth config with the new access token.
|
|
135
|
+
*/
|
|
136
|
+
async function refreshAccessToken(auth) {
|
|
137
|
+
if (!auth.refreshToken)
|
|
138
|
+
return null;
|
|
139
|
+
const res = await fetch(`${auth.apiUrl}/api/v1/auth/refresh`, {
|
|
140
|
+
method: "POST",
|
|
141
|
+
headers: { "Content-Type": "application/json" },
|
|
142
|
+
body: JSON.stringify({ refreshToken: auth.refreshToken }),
|
|
143
|
+
});
|
|
144
|
+
if (!res.ok)
|
|
145
|
+
return null;
|
|
146
|
+
const data = (await res.json());
|
|
147
|
+
if (!data.accessToken)
|
|
148
|
+
return null;
|
|
149
|
+
const updated = { ...auth, token: data.accessToken };
|
|
150
|
+
saveAuth(updated);
|
|
151
|
+
return updated;
|
|
152
|
+
}
|
|
126
153
|
/**
|
|
127
154
|
* Push cookies to the tenant's cloud browser.
|
|
128
155
|
*/
|
|
@@ -143,8 +170,33 @@ export async function pushCookies(storageState, options) {
|
|
|
143
170
|
subdomain: subdomain || undefined,
|
|
144
171
|
}),
|
|
145
172
|
});
|
|
173
|
+
// Auto-refresh on 401 and retry once
|
|
174
|
+
if (res.status === 401) {
|
|
175
|
+
const refreshed = await refreshAccessToken(auth);
|
|
176
|
+
if (refreshed) {
|
|
177
|
+
const retry = await fetch(`${refreshed.apiUrl}/admin/api/browser-sync/cookies`, {
|
|
178
|
+
method: "POST",
|
|
179
|
+
headers: {
|
|
180
|
+
Authorization: `Bearer ${refreshed.token}`,
|
|
181
|
+
"Content-Type": "application/json",
|
|
182
|
+
},
|
|
183
|
+
body: JSON.stringify({
|
|
184
|
+
storageState,
|
|
185
|
+
subdomain: subdomain || undefined,
|
|
186
|
+
}),
|
|
187
|
+
});
|
|
188
|
+
if (!retry.ok) {
|
|
189
|
+
const body = await retry.text();
|
|
190
|
+
throw new Error(`Failed to push cookies: ${retry.status} — ${body}`);
|
|
191
|
+
}
|
|
192
|
+
return retry.json();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
146
195
|
if (!res.ok) {
|
|
147
196
|
const body = await res.text();
|
|
197
|
+
if (res.status === 401) {
|
|
198
|
+
throw new Error(`Session expired. Run \`chrome-sync login\` to re-authenticate.`);
|
|
199
|
+
}
|
|
148
200
|
throw new Error(`Failed to push cookies: ${res.status} — ${body}`);
|
|
149
201
|
}
|
|
150
202
|
return res.json();
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE7F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CACV,+EAA+E,CAChF;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CACL,iBAAiB,EACjB,kBAAkB,EAClB,0CAA0C,CAC3C;KACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,IAAI,MAAM,CAAC;QACX,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE7F,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CACV,+EAA+E,CAChF;KACA,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,gDAAgD,CAAC;KAC3E,MAAM,CACL,iBAAiB,EACjB,kBAAkB,EAClB,0CAA0C,CAC3C;KACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,IAAI,MAAM,CAAC;QACX,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CACL,qBAAqB,EACrB,wDAAwD,CACzD;KACA,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,SAAS,CAAC;KAC/D,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC;KAC5D,MAAM,CAAC,WAAW,EAAE,gCAAgC,EAAE,KAAK,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,mBAAmB;QACnB,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;YAC1B,CAAC,CAAC,IAAI,CAAC,OAAO;iBACT,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC5B,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1D,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9D,OAAO,CAAC,GAAG,CACT,2BAA2B,KAAK,cAAc,IAAI,CAAC,OAAO,GAAG,CAC9D,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QAE9D,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;YACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACrE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBACxE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE;YAC7C,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,6BAA6B,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,cAAc,CAAkC,CAAC;IACzF,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC7D,MAAM,CACL,CAAC,CAAM,EAAE,EAAE,CACT,CAAC,CAAC,WAAW,EAAE;QACf,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAC1D;SACA,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,GAAG,EAAE;IACX,SAAS,EAAE,CAAC;IACZ,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/extract.js
CHANGED
|
@@ -198,18 +198,29 @@ export async function extractCookies(domains, profile = "Default") {
|
|
|
198
198
|
const value = decryptCookieValue(row.encrypted_value, key);
|
|
199
199
|
if (!value)
|
|
200
200
|
continue;
|
|
201
|
+
// Skip cookies with empty name or domain — CDP will reject them
|
|
202
|
+
if (!row.name || !row.host_key)
|
|
203
|
+
continue;
|
|
204
|
+
const sameSite = mapSameSite(row.samesite);
|
|
205
|
+
let secure = row.is_secure === 1;
|
|
206
|
+
// sameSite=None requires secure=true per spec; Chrome CDP rejects otherwise
|
|
207
|
+
if (sameSite === "None" && !secure) {
|
|
208
|
+
secure = true;
|
|
209
|
+
}
|
|
210
|
+
// Chrome stores expires as microseconds since 1601-01-01; convert to Unix seconds
|
|
211
|
+
// -1 = session cookie (no expiry)
|
|
212
|
+
const expires = row.expires_utc === 0
|
|
213
|
+
? -1
|
|
214
|
+
: Math.floor((row.expires_utc / 1000000) - 11644473600);
|
|
201
215
|
cookies.push({
|
|
202
216
|
name: row.name,
|
|
203
217
|
value,
|
|
204
218
|
domain: row.host_key,
|
|
205
|
-
path: row.path,
|
|
206
|
-
|
|
207
|
-
expires: row.expires_utc === 0
|
|
208
|
-
? -1
|
|
209
|
-
: Math.floor((row.expires_utc / 1000000) - 11644473600),
|
|
219
|
+
path: row.path || "/",
|
|
220
|
+
expires,
|
|
210
221
|
httpOnly: row.is_httponly === 1,
|
|
211
|
-
secure
|
|
212
|
-
sameSite
|
|
222
|
+
secure,
|
|
223
|
+
sameSite,
|
|
213
224
|
});
|
|
214
225
|
}
|
|
215
226
|
catch {
|
package/dist/extract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -11,6 +11,14 @@ interface BrowserSyncRequest {
|
|
|
11
11
|
storageState: StorageState;
|
|
12
12
|
subdomain?: string;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Sanitize cookies for CDP Network.setCookies compatibility.
|
|
16
|
+
* Filters out invalid entries and fixes common issues (sameSite/secure mismatch).
|
|
17
|
+
*/
|
|
18
|
+
declare function sanitizeCookiesForCDP(cookies: StorageState["cookies"]): {
|
|
19
|
+
valid: Array<Record<string, unknown>>;
|
|
20
|
+
skipped: string[];
|
|
21
|
+
};
|
|
14
22
|
/**
|
|
15
23
|
* Express/Hono-style handler for the browser-sync cookie push endpoint.
|
|
16
24
|
* Integrate with the bot's admin API router.
|
|
@@ -19,4 +27,5 @@ export declare function handleBrowserSyncPush(body: BrowserSyncRequest, resolveC
|
|
|
19
27
|
injected: number;
|
|
20
28
|
errors: string[];
|
|
21
29
|
}>;
|
|
30
|
+
export { sanitizeCookiesForCDP };
|
|
22
31
|
export type { BrowserSyncRequest };
|
package/dist/server.js
CHANGED
|
@@ -6,64 +6,122 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Mount at: POST /admin/api/browser-sync/cookies
|
|
8
8
|
*/
|
|
9
|
+
/** Batch size for CDP cookie injection — avoids one bad cookie killing entire push */
|
|
10
|
+
const BATCH_SIZE = 100;
|
|
11
|
+
/**
|
|
12
|
+
* Sanitize cookies for CDP Network.setCookies compatibility.
|
|
13
|
+
* Filters out invalid entries and fixes common issues (sameSite/secure mismatch).
|
|
14
|
+
*/
|
|
15
|
+
function sanitizeCookiesForCDP(cookies) {
|
|
16
|
+
const valid = [];
|
|
17
|
+
const skipped = [];
|
|
18
|
+
for (const c of cookies) {
|
|
19
|
+
// CDP requires non-empty name and domain
|
|
20
|
+
if (!c.name || !c.domain) {
|
|
21
|
+
skipped.push(`empty name/domain: ${c.name || "(empty)"}@${c.domain || "(empty)"}`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
let sameSite = c.sameSite;
|
|
25
|
+
let secure = c.secure ?? false;
|
|
26
|
+
// Chrome rejects sameSite=None without secure=true
|
|
27
|
+
if (sameSite === "None" && !secure) {
|
|
28
|
+
secure = true;
|
|
29
|
+
}
|
|
30
|
+
// CDP only accepts "Strict", "Lax", "None" — strip anything else
|
|
31
|
+
if (sameSite && !["Strict", "Lax", "None"].includes(sameSite)) {
|
|
32
|
+
sameSite = undefined;
|
|
33
|
+
}
|
|
34
|
+
valid.push({
|
|
35
|
+
name: c.name,
|
|
36
|
+
value: c.value,
|
|
37
|
+
domain: c.domain,
|
|
38
|
+
path: c.path || "/",
|
|
39
|
+
// CDP expects -1 for session cookies or a positive Unix timestamp
|
|
40
|
+
expires: c.expires != null && c.expires > 0 ? c.expires : -1,
|
|
41
|
+
httpOnly: c.httpOnly ?? false,
|
|
42
|
+
secure,
|
|
43
|
+
sameSite: sameSite || undefined,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return { valid, skipped };
|
|
47
|
+
}
|
|
9
48
|
/**
|
|
10
49
|
* Inject cookies into a tenant's cloud Chrome via CDP.
|
|
11
50
|
*
|
|
12
|
-
* @param cdpUrl - The Chrome DevTools Protocol
|
|
51
|
+
* @param cdpUrl - The Chrome DevTools Protocol base URL (e.g., http://localhost:9222)
|
|
13
52
|
* @param cookies - Playwright-format cookies to inject
|
|
14
53
|
*/
|
|
15
54
|
async function injectCookiesViaCDP(cdpUrl, cookies) {
|
|
16
|
-
|
|
55
|
+
const { valid: cdpCookies, skipped } = sanitizeCookiesForCDP(cookies);
|
|
56
|
+
if (!cdpCookies.length) {
|
|
57
|
+
return { injected: 0, errors: ["All cookies were invalid and filtered out"], skipped };
|
|
58
|
+
}
|
|
59
|
+
// Connect to a page-level target (Network.setCookies requires a page target)
|
|
17
60
|
const ws = await connectCDP(cdpUrl);
|
|
18
61
|
const errors = [];
|
|
19
|
-
let
|
|
62
|
+
let totalInjected = 0;
|
|
20
63
|
try {
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const result = await sendCDPCommand(ws, "Network.setCookies", {
|
|
34
|
-
cookies: cdpCookies,
|
|
35
|
-
});
|
|
36
|
-
if (result.error) {
|
|
37
|
-
errors.push(result.error.message);
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
injected = cdpCookies.length;
|
|
64
|
+
// Inject in batches to avoid a single bad cookie failing the entire push
|
|
65
|
+
for (let i = 0; i < cdpCookies.length; i += BATCH_SIZE) {
|
|
66
|
+
const batch = cdpCookies.slice(i, i + BATCH_SIZE);
|
|
67
|
+
const result = await sendCDPCommand(ws, "Network.setCookies", {
|
|
68
|
+
cookies: batch,
|
|
69
|
+
});
|
|
70
|
+
if (result.error) {
|
|
71
|
+
errors.push(`batch ${Math.floor(i / BATCH_SIZE) + 1}: ${result.error.message}`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
totalInjected += batch.length;
|
|
75
|
+
}
|
|
41
76
|
}
|
|
42
77
|
}
|
|
43
78
|
finally {
|
|
44
79
|
ws.close();
|
|
45
80
|
}
|
|
46
|
-
return { injected, errors };
|
|
81
|
+
return { injected: totalInjected, errors, skipped };
|
|
47
82
|
}
|
|
48
|
-
/** Connect to Chrome CDP endpoint */
|
|
83
|
+
/** Connect to Chrome CDP endpoint — prefers page targets over browser-level */
|
|
49
84
|
async function connectCDP(cdpUrl) {
|
|
50
|
-
// Get the debugger WebSocket URL from /json/version
|
|
51
85
|
const httpUrl = cdpUrl.replace("ws://", "http://").replace("wss://", "https://");
|
|
52
|
-
|
|
53
|
-
|
|
86
|
+
// Try /json/list first for a page-level target (required for Network.setCookies)
|
|
87
|
+
let wsUrl;
|
|
88
|
+
try {
|
|
89
|
+
const listRes = await fetch(`${httpUrl}/json/list`);
|
|
90
|
+
if (listRes.ok) {
|
|
91
|
+
const targets = (await listRes.json());
|
|
92
|
+
const pageTarget = targets.find((t) => t.type === "page") || targets[0];
|
|
93
|
+
if (pageTarget?.webSocketDebuggerUrl) {
|
|
94
|
+
wsUrl = pageTarget.webSocketDebuggerUrl;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Fall through to /json/version
|
|
100
|
+
}
|
|
101
|
+
// Fallback to browser-level target
|
|
102
|
+
if (!wsUrl) {
|
|
103
|
+
const versionRes = await fetch(`${httpUrl}/json/version`);
|
|
104
|
+
const version = (await versionRes.json());
|
|
105
|
+
wsUrl = version.webSocketDebuggerUrl;
|
|
106
|
+
}
|
|
54
107
|
return new Promise((resolve, reject) => {
|
|
55
|
-
const ws = new WebSocket(
|
|
108
|
+
const ws = new WebSocket(wsUrl);
|
|
56
109
|
ws.onopen = () => resolve(ws);
|
|
57
110
|
ws.onerror = (err) => reject(new Error(`CDP connection failed: ${err}`));
|
|
58
111
|
});
|
|
59
112
|
}
|
|
60
|
-
/** Send a CDP command and wait for response */
|
|
113
|
+
/** Send a CDP command and wait for response (15s timeout) */
|
|
61
114
|
function sendCDPCommand(ws, method, params) {
|
|
62
|
-
const id =
|
|
115
|
+
const id = sendCDPCommand._nextId = (sendCDPCommand._nextId || 0) + 1;
|
|
63
116
|
return new Promise((resolve) => {
|
|
117
|
+
const timeout = setTimeout(() => {
|
|
118
|
+
ws.removeEventListener("message", handler);
|
|
119
|
+
resolve({ error: { message: "CDP timeout (15s)" } });
|
|
120
|
+
}, 15_000);
|
|
64
121
|
const handler = (event) => {
|
|
65
122
|
const data = JSON.parse(String(event.data));
|
|
66
123
|
if (data.id === id) {
|
|
124
|
+
clearTimeout(timeout);
|
|
67
125
|
ws.removeEventListener("message", handler);
|
|
68
126
|
resolve(data);
|
|
69
127
|
}
|
|
@@ -72,6 +130,7 @@ function sendCDPCommand(ws, method, params) {
|
|
|
72
130
|
ws.send(JSON.stringify({ id, method, params }));
|
|
73
131
|
});
|
|
74
132
|
}
|
|
133
|
+
sendCDPCommand._nextId = 0;
|
|
75
134
|
/**
|
|
76
135
|
* Express/Hono-style handler for the browser-sync cookie push endpoint.
|
|
77
136
|
* Integrate with the bot's admin API router.
|
|
@@ -82,6 +141,8 @@ export async function handleBrowserSyncPush(body, resolveCdpUrl) {
|
|
|
82
141
|
return { injected: 0, errors: ["No cookies provided"] };
|
|
83
142
|
}
|
|
84
143
|
const cdpUrl = await resolveCdpUrl(subdomain);
|
|
85
|
-
|
|
144
|
+
const result = await injectCookiesViaCDP(cdpUrl, storageState.cookies);
|
|
145
|
+
return { injected: result.injected, errors: result.errors };
|
|
86
146
|
}
|
|
147
|
+
export { sanitizeCookiesForCDP };
|
|
87
148
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibetechnologies/chrome-sync",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Sync browser cookies and sessions from your local Chrome to OpenClaw cloud browser",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,7 +19,14 @@
|
|
|
19
19
|
"dev": "tsc --watch",
|
|
20
20
|
"start": "node dist/cli.js"
|
|
21
21
|
},
|
|
22
|
-
"keywords": [
|
|
22
|
+
"keywords": [
|
|
23
|
+
"browser",
|
|
24
|
+
"cookies",
|
|
25
|
+
"sync",
|
|
26
|
+
"chrome",
|
|
27
|
+
"cdp",
|
|
28
|
+
"openclaw"
|
|
29
|
+
],
|
|
23
30
|
"author": "VibeTechnologies",
|
|
24
31
|
"license": "MIT",
|
|
25
32
|
"repository": {
|
package/src/api.ts
CHANGED
|
@@ -20,6 +20,7 @@ const TOKEN_FILE = join(CONFIG_DIR, "auth.json");
|
|
|
20
20
|
interface AuthConfig {
|
|
21
21
|
apiUrl: string;
|
|
22
22
|
token: string;
|
|
23
|
+
refreshToken?: string;
|
|
23
24
|
username: string;
|
|
24
25
|
subdomain: string;
|
|
25
26
|
}
|
|
@@ -65,12 +66,14 @@ export async function loginViaBrowser(
|
|
|
65
66
|
|
|
66
67
|
if (url.pathname === "/callback") {
|
|
67
68
|
const token = url.searchParams.get("token");
|
|
69
|
+
const refreshToken = url.searchParams.get("refresh_token");
|
|
68
70
|
const username = url.searchParams.get("username");
|
|
69
71
|
const subdomain = url.searchParams.get("subdomain");
|
|
70
72
|
|
|
71
73
|
if (!token) {
|
|
72
74
|
res.writeHead(400, { "Content-Type": "text/html" });
|
|
73
75
|
res.end("<html><body><h2>Authentication failed</h2><p>No token received. Close this window and try again.</p></body></html>");
|
|
76
|
+
server.closeAllConnections();
|
|
74
77
|
server.close();
|
|
75
78
|
reject(new Error("No token received from server"));
|
|
76
79
|
return;
|
|
@@ -79,6 +82,7 @@ export async function loginViaBrowser(
|
|
|
79
82
|
const config: AuthConfig = {
|
|
80
83
|
apiUrl,
|
|
81
84
|
token,
|
|
85
|
+
refreshToken: refreshToken || undefined,
|
|
82
86
|
username: username || "user",
|
|
83
87
|
subdomain: subdomain || "",
|
|
84
88
|
};
|
|
@@ -86,6 +90,8 @@ export async function loginViaBrowser(
|
|
|
86
90
|
|
|
87
91
|
res.writeHead(200, { "Content-Type": "text/html" });
|
|
88
92
|
res.end(`<html><body><h2>✓ Authenticated as ${config.username}</h2><p>You can close this window and return to the terminal.</p></body></html>`);
|
|
93
|
+
clearTimeout(timeout);
|
|
94
|
+
server.closeAllConnections();
|
|
89
95
|
server.close();
|
|
90
96
|
resolve(config);
|
|
91
97
|
} else {
|
|
@@ -121,7 +127,8 @@ export async function loginViaBrowser(
|
|
|
121
127
|
});
|
|
122
128
|
|
|
123
129
|
// Timeout after 2 minutes
|
|
124
|
-
setTimeout(() => {
|
|
130
|
+
const timeout = setTimeout(() => {
|
|
131
|
+
server.closeAllConnections();
|
|
125
132
|
server.close();
|
|
126
133
|
reject(new Error("Authentication timed out (2 minutes). Try again."));
|
|
127
134
|
}, 120_000);
|
|
@@ -151,6 +158,29 @@ export async function loginWithToken(apiUrl: string, token: string): Promise<Aut
|
|
|
151
158
|
return config;
|
|
152
159
|
}
|
|
153
160
|
|
|
161
|
+
/**
|
|
162
|
+
* Refresh the access token using the stored refresh token.
|
|
163
|
+
* Updates the saved auth config with the new access token.
|
|
164
|
+
*/
|
|
165
|
+
async function refreshAccessToken(auth: AuthConfig): Promise<AuthConfig | null> {
|
|
166
|
+
if (!auth.refreshToken) return null;
|
|
167
|
+
|
|
168
|
+
const res = await fetch(`${auth.apiUrl}/api/v1/auth/refresh`, {
|
|
169
|
+
method: "POST",
|
|
170
|
+
headers: { "Content-Type": "application/json" },
|
|
171
|
+
body: JSON.stringify({ refreshToken: auth.refreshToken }),
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
if (!res.ok) return null;
|
|
175
|
+
|
|
176
|
+
const data = (await res.json()) as { accessToken?: string };
|
|
177
|
+
if (!data.accessToken) return null;
|
|
178
|
+
|
|
179
|
+
const updated: AuthConfig = { ...auth, token: data.accessToken };
|
|
180
|
+
saveAuth(updated);
|
|
181
|
+
return updated;
|
|
182
|
+
}
|
|
183
|
+
|
|
154
184
|
/**
|
|
155
185
|
* Push cookies to the tenant's cloud browser.
|
|
156
186
|
*/
|
|
@@ -180,8 +210,37 @@ export async function pushCookies(
|
|
|
180
210
|
}
|
|
181
211
|
);
|
|
182
212
|
|
|
213
|
+
// Auto-refresh on 401 and retry once
|
|
214
|
+
if (res.status === 401) {
|
|
215
|
+
const refreshed = await refreshAccessToken(auth);
|
|
216
|
+
if (refreshed) {
|
|
217
|
+
const retry = await fetch(
|
|
218
|
+
`${refreshed.apiUrl}/admin/api/browser-sync/cookies`,
|
|
219
|
+
{
|
|
220
|
+
method: "POST",
|
|
221
|
+
headers: {
|
|
222
|
+
Authorization: `Bearer ${refreshed.token}`,
|
|
223
|
+
"Content-Type": "application/json",
|
|
224
|
+
},
|
|
225
|
+
body: JSON.stringify({
|
|
226
|
+
storageState,
|
|
227
|
+
subdomain: subdomain || undefined,
|
|
228
|
+
}),
|
|
229
|
+
}
|
|
230
|
+
);
|
|
231
|
+
if (!retry.ok) {
|
|
232
|
+
const body = await retry.text();
|
|
233
|
+
throw new Error(`Failed to push cookies: ${retry.status} — ${body}`);
|
|
234
|
+
}
|
|
235
|
+
return retry.json() as Promise<{ injected: number; errors: string[] }>;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
183
239
|
if (!res.ok) {
|
|
184
240
|
const body = await res.text();
|
|
241
|
+
if (res.status === 401) {
|
|
242
|
+
throw new Error(`Session expired. Run \`chrome-sync login\` to re-authenticate.`);
|
|
243
|
+
}
|
|
185
244
|
throw new Error(`Failed to push cookies: ${res.status} — ${body}`);
|
|
186
245
|
}
|
|
187
246
|
|
package/src/cli.ts
CHANGED
package/src/extract.ts
CHANGED
|
@@ -287,19 +287,32 @@ export async function extractCookies(
|
|
|
287
287
|
const value = decryptCookieValue(row.encrypted_value, key);
|
|
288
288
|
if (!value) continue;
|
|
289
289
|
|
|
290
|
+
// Skip cookies with empty name or domain — CDP will reject them
|
|
291
|
+
if (!row.name || !row.host_key) continue;
|
|
292
|
+
|
|
293
|
+
const sameSite = mapSameSite(row.samesite);
|
|
294
|
+
let secure = row.is_secure === 1;
|
|
295
|
+
// sameSite=None requires secure=true per spec; Chrome CDP rejects otherwise
|
|
296
|
+
if (sameSite === "None" && !secure) {
|
|
297
|
+
secure = true;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Chrome stores expires as microseconds since 1601-01-01; convert to Unix seconds
|
|
301
|
+
// -1 = session cookie (no expiry)
|
|
302
|
+
const expires =
|
|
303
|
+
row.expires_utc === 0
|
|
304
|
+
? -1
|
|
305
|
+
: Math.floor((row.expires_utc / 1000000) - 11644473600);
|
|
306
|
+
|
|
290
307
|
cookies.push({
|
|
291
308
|
name: row.name,
|
|
292
309
|
value,
|
|
293
310
|
domain: row.host_key,
|
|
294
|
-
path: row.path,
|
|
295
|
-
|
|
296
|
-
expires:
|
|
297
|
-
row.expires_utc === 0
|
|
298
|
-
? -1
|
|
299
|
-
: Math.floor((row.expires_utc / 1000000) - 11644473600),
|
|
311
|
+
path: row.path || "/",
|
|
312
|
+
expires,
|
|
300
313
|
httpOnly: row.is_httponly === 1,
|
|
301
|
-
secure
|
|
302
|
-
sameSite
|
|
314
|
+
secure,
|
|
315
|
+
sameSite,
|
|
303
316
|
});
|
|
304
317
|
} catch {
|
|
305
318
|
// Skip cookies that fail to decrypt (stale entries, etc.)
|
package/src/server.ts
CHANGED
|
@@ -15,77 +15,146 @@ interface BrowserSyncRequest {
|
|
|
15
15
|
subdomain?: string;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
/** Batch size for CDP cookie injection — avoids one bad cookie killing entire push */
|
|
19
|
+
const BATCH_SIZE = 100;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Sanitize cookies for CDP Network.setCookies compatibility.
|
|
23
|
+
* Filters out invalid entries and fixes common issues (sameSite/secure mismatch).
|
|
24
|
+
*/
|
|
25
|
+
function sanitizeCookiesForCDP(
|
|
26
|
+
cookies: StorageState["cookies"]
|
|
27
|
+
): { valid: Array<Record<string, unknown>>; skipped: string[] } {
|
|
28
|
+
const valid: Array<Record<string, unknown>> = [];
|
|
29
|
+
const skipped: string[] = [];
|
|
30
|
+
|
|
31
|
+
for (const c of cookies) {
|
|
32
|
+
// CDP requires non-empty name and domain
|
|
33
|
+
if (!c.name || !c.domain) {
|
|
34
|
+
skipped.push(`empty name/domain: ${c.name || "(empty)"}@${c.domain || "(empty)"}`);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let sameSite: string | undefined = c.sameSite;
|
|
39
|
+
let secure = c.secure ?? false;
|
|
40
|
+
|
|
41
|
+
// Chrome rejects sameSite=None without secure=true
|
|
42
|
+
if (sameSite === "None" && !secure) {
|
|
43
|
+
secure = true;
|
|
44
|
+
}
|
|
45
|
+
// CDP only accepts "Strict", "Lax", "None" — strip anything else
|
|
46
|
+
if (sameSite && !["Strict", "Lax", "None"].includes(sameSite)) {
|
|
47
|
+
sameSite = undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
valid.push({
|
|
51
|
+
name: c.name,
|
|
52
|
+
value: c.value,
|
|
53
|
+
domain: c.domain,
|
|
54
|
+
path: c.path || "/",
|
|
55
|
+
// CDP expects -1 for session cookies or a positive Unix timestamp
|
|
56
|
+
expires: c.expires != null && c.expires > 0 ? c.expires : -1,
|
|
57
|
+
httpOnly: c.httpOnly ?? false,
|
|
58
|
+
secure,
|
|
59
|
+
sameSite: sameSite || undefined,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return { valid, skipped };
|
|
64
|
+
}
|
|
65
|
+
|
|
18
66
|
/**
|
|
19
67
|
* Inject cookies into a tenant's cloud Chrome via CDP.
|
|
20
68
|
*
|
|
21
|
-
* @param cdpUrl - The Chrome DevTools Protocol
|
|
69
|
+
* @param cdpUrl - The Chrome DevTools Protocol base URL (e.g., http://localhost:9222)
|
|
22
70
|
* @param cookies - Playwright-format cookies to inject
|
|
23
71
|
*/
|
|
24
72
|
async function injectCookiesViaCDP(
|
|
25
73
|
cdpUrl: string,
|
|
26
74
|
cookies: StorageState["cookies"]
|
|
27
|
-
): Promise<{ injected: number; errors: string[] }> {
|
|
28
|
-
|
|
75
|
+
): Promise<{ injected: number; errors: string[]; skipped: string[] }> {
|
|
76
|
+
const { valid: cdpCookies, skipped } = sanitizeCookiesForCDP(cookies);
|
|
77
|
+
|
|
78
|
+
if (!cdpCookies.length) {
|
|
79
|
+
return { injected: 0, errors: ["All cookies were invalid and filtered out"], skipped };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Connect to a page-level target (Network.setCookies requires a page target)
|
|
29
83
|
const ws = await connectCDP(cdpUrl);
|
|
30
84
|
const errors: string[] = [];
|
|
31
|
-
let
|
|
85
|
+
let totalInjected = 0;
|
|
32
86
|
|
|
33
87
|
try {
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
expires: c.expires > 0 ? c.expires : undefined,
|
|
41
|
-
httpOnly: c.httpOnly,
|
|
42
|
-
secure: c.secure,
|
|
43
|
-
sameSite: c.sameSite,
|
|
44
|
-
}));
|
|
45
|
-
|
|
46
|
-
// Inject via Network.setCookies (batch)
|
|
47
|
-
const result = await sendCDPCommand(ws, "Network.setCookies", {
|
|
48
|
-
cookies: cdpCookies,
|
|
49
|
-
});
|
|
88
|
+
// Inject in batches to avoid a single bad cookie failing the entire push
|
|
89
|
+
for (let i = 0; i < cdpCookies.length; i += BATCH_SIZE) {
|
|
90
|
+
const batch = cdpCookies.slice(i, i + BATCH_SIZE);
|
|
91
|
+
const result = await sendCDPCommand(ws, "Network.setCookies", {
|
|
92
|
+
cookies: batch,
|
|
93
|
+
});
|
|
50
94
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
95
|
+
if (result.error) {
|
|
96
|
+
errors.push(`batch ${Math.floor(i / BATCH_SIZE) + 1}: ${result.error.message}`);
|
|
97
|
+
} else {
|
|
98
|
+
totalInjected += batch.length;
|
|
99
|
+
}
|
|
55
100
|
}
|
|
56
101
|
} finally {
|
|
57
102
|
ws.close();
|
|
58
103
|
}
|
|
59
104
|
|
|
60
|
-
return { injected, errors };
|
|
105
|
+
return { injected: totalInjected, errors, skipped };
|
|
61
106
|
}
|
|
62
107
|
|
|
63
|
-
/** Connect to Chrome CDP endpoint */
|
|
108
|
+
/** Connect to Chrome CDP endpoint — prefers page targets over browser-level */
|
|
64
109
|
async function connectCDP(cdpUrl: string): Promise<WebSocket> {
|
|
65
|
-
// Get the debugger WebSocket URL from /json/version
|
|
66
110
|
const httpUrl = cdpUrl.replace("ws://", "http://").replace("wss://", "https://");
|
|
67
|
-
|
|
68
|
-
|
|
111
|
+
|
|
112
|
+
// Try /json/list first for a page-level target (required for Network.setCookies)
|
|
113
|
+
let wsUrl: string | undefined;
|
|
114
|
+
try {
|
|
115
|
+
const listRes = await fetch(`${httpUrl}/json/list`);
|
|
116
|
+
if (listRes.ok) {
|
|
117
|
+
const targets = (await listRes.json()) as Array<{ webSocketDebuggerUrl: string; type: string }>;
|
|
118
|
+
const pageTarget = targets.find((t) => t.type === "page") || targets[0];
|
|
119
|
+
if (pageTarget?.webSocketDebuggerUrl) {
|
|
120
|
+
wsUrl = pageTarget.webSocketDebuggerUrl;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} catch {
|
|
124
|
+
// Fall through to /json/version
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Fallback to browser-level target
|
|
128
|
+
if (!wsUrl) {
|
|
129
|
+
const versionRes = await fetch(`${httpUrl}/json/version`);
|
|
130
|
+
const version = (await versionRes.json()) as { webSocketDebuggerUrl: string };
|
|
131
|
+
wsUrl = version.webSocketDebuggerUrl;
|
|
132
|
+
}
|
|
69
133
|
|
|
70
134
|
return new Promise((resolve, reject) => {
|
|
71
|
-
const ws = new WebSocket(
|
|
135
|
+
const ws = new WebSocket(wsUrl!);
|
|
72
136
|
ws.onopen = () => resolve(ws);
|
|
73
137
|
ws.onerror = (err) => reject(new Error(`CDP connection failed: ${err}`));
|
|
74
138
|
});
|
|
75
139
|
}
|
|
76
140
|
|
|
77
|
-
/** Send a CDP command and wait for response */
|
|
141
|
+
/** Send a CDP command and wait for response (15s timeout) */
|
|
78
142
|
function sendCDPCommand(
|
|
79
143
|
ws: WebSocket,
|
|
80
144
|
method: string,
|
|
81
145
|
params: Record<string, unknown>
|
|
82
146
|
): Promise<{ error?: { message: string }; result?: unknown }> {
|
|
83
|
-
const id =
|
|
147
|
+
const id = sendCDPCommand._nextId = (sendCDPCommand._nextId || 0) + 1;
|
|
84
148
|
|
|
85
149
|
return new Promise((resolve) => {
|
|
150
|
+
const timeout = setTimeout(() => {
|
|
151
|
+
ws.removeEventListener("message", handler);
|
|
152
|
+
resolve({ error: { message: "CDP timeout (15s)" } });
|
|
153
|
+
}, 15_000);
|
|
86
154
|
const handler = (event: MessageEvent) => {
|
|
87
155
|
const data = JSON.parse(String(event.data));
|
|
88
156
|
if (data.id === id) {
|
|
157
|
+
clearTimeout(timeout);
|
|
89
158
|
ws.removeEventListener("message", handler);
|
|
90
159
|
resolve(data);
|
|
91
160
|
}
|
|
@@ -94,6 +163,7 @@ function sendCDPCommand(
|
|
|
94
163
|
ws.send(JSON.stringify({ id, method, params }));
|
|
95
164
|
});
|
|
96
165
|
}
|
|
166
|
+
sendCDPCommand._nextId = 0;
|
|
97
167
|
|
|
98
168
|
/**
|
|
99
169
|
* Express/Hono-style handler for the browser-sync cookie push endpoint.
|
|
@@ -110,7 +180,9 @@ export async function handleBrowserSyncPush(
|
|
|
110
180
|
}
|
|
111
181
|
|
|
112
182
|
const cdpUrl = await resolveCdpUrl(subdomain);
|
|
113
|
-
|
|
183
|
+
const result = await injectCookiesViaCDP(cdpUrl, storageState.cookies);
|
|
184
|
+
return { injected: result.injected, errors: result.errors };
|
|
114
185
|
}
|
|
115
186
|
|
|
187
|
+
export { sanitizeCookiesForCDP };
|
|
116
188
|
export type { BrowserSyncRequest };
|