@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 CHANGED
@@ -1,4 +1,4 @@
1
- # @vibetechnologies/browser-sync
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
- npm install -g @vibetechnologies/browser-sync
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-sync login --token <your-api-token>
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 Google cookies
27
- browser-sync push --domains google.com,gmail.com
36
+ # Sync all cookies
37
+ chrome-sync push
28
38
 
29
- # Sync multiple services
30
- browser-sync push --domains google.com,github.com,linkedin.com
39
+ # Sync specific domains
40
+ chrome-sync push --domains google.com,gmail.com
31
41
 
32
42
  # Use a specific Chrome profile
33
- browser-sync push --domains google.com --profile "Profile 1"
43
+ chrome-sync push --domains google.com --profile "Profile 1"
34
44
 
35
45
  # Dry run — see what would be synced
36
- browser-sync push --domains google.com --dry-run
46
+ chrome-sync push --dry-run
37
47
  ```
38
48
 
39
49
  ### 3. List Chrome profiles
40
50
 
41
51
  ```bash
42
- browser-sync profiles
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/browser-sync/auth.json`
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, login } from "@vibetechnologies/browser-sync";
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 login("https://console.openclaw.vibebrowser.app", "your-token");
86
+ await loginWithToken("https://console.openclaw.vibebrowser.app", "your-token");
77
87
  await pushCookies(state);
78
88
  ```
package/dist/api.d.ts CHANGED
@@ -11,6 +11,7 @@ import type { StorageState } from "./extract.js";
11
11
  interface AuthConfig {
12
12
  apiUrl: string;
13
13
  token: string;
14
+ refreshToken?: string;
14
15
  username: string;
15
16
  subdomain: string;
16
17
  }
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":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -39,6 +39,7 @@ program
39
39
  console.log(` Tenant: ${config.subdomain}`);
40
40
  }
41
41
  console.log(` API: ${config.apiUrl}`);
42
+ process.exit(0);
42
43
  }
43
44
  catch (err) {
44
45
  console.error(`✗ Login failed: ${err.message}`);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
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
- // Chrome stores expires as microseconds since 1601-01-01; convert to Unix seconds
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: row.is_secure === 1,
212
- sameSite: mapSameSite(row.samesite),
222
+ secure,
223
+ sameSite,
213
224
  });
214
225
  }
215
226
  catch {
@@ -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 WebSocket URL (e.g., ws://localhost:3000)
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
- // Connect to Chrome via CDP WebSocket
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 injected = 0;
62
+ let totalInjected = 0;
20
63
  try {
21
- // Convert to CDP Network.CookieParam format
22
- const cdpCookies = cookies.map((c) => ({
23
- name: c.name,
24
- value: c.value,
25
- domain: c.domain,
26
- path: c.path,
27
- expires: c.expires > 0 ? c.expires : undefined,
28
- httpOnly: c.httpOnly,
29
- secure: c.secure,
30
- sameSite: c.sameSite,
31
- }));
32
- // Inject via Network.setCookies (batch)
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
- const versionRes = await fetch(`${httpUrl}/json/version`);
53
- const version = (await versionRes.json());
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(version.webSocketDebuggerUrl);
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 = Math.floor(Math.random() * 1e9);
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
- return injectCookiesViaCDP(cdpUrl, storageState.cookies);
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
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
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.4.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": ["browser", "cookies", "sync", "chrome", "cdp", "openclaw"],
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
@@ -48,6 +48,7 @@ program
48
48
  console.log(` Tenant: ${config.subdomain}`);
49
49
  }
50
50
  console.log(` API: ${config.apiUrl}`);
51
+ process.exit(0);
51
52
  } catch (err: any) {
52
53
  console.error(`✗ Login failed: ${err.message}`);
53
54
  process.exit(1);
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
- // Chrome stores expires as microseconds since 1601-01-01; convert to Unix seconds
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: row.is_secure === 1,
302
- sameSite: mapSameSite(row.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 WebSocket URL (e.g., ws://localhost:3000)
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
- // Connect to Chrome via CDP WebSocket
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 injected = 0;
85
+ let totalInjected = 0;
32
86
 
33
87
  try {
34
- // Convert to CDP Network.CookieParam format
35
- const cdpCookies = cookies.map((c) => ({
36
- name: c.name,
37
- value: c.value,
38
- domain: c.domain,
39
- path: c.path,
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
- if (result.error) {
52
- errors.push(result.error.message);
53
- } else {
54
- injected = cdpCookies.length;
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
- const versionRes = await fetch(`${httpUrl}/json/version`);
68
- const version = (await versionRes.json()) as { webSocketDebuggerUrl: string };
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(version.webSocketDebuggerUrl);
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 = Math.floor(Math.random() * 1e9);
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
- return injectCookiesViaCDP(cdpUrl, storageState.cookies);
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 };