@vibetechnologies/chrome-sync 0.4.1 → 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/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 +1 -1
- package/src/api.ts +58 -0
- package/src/extract.ts +21 -8
- package/src/server.ts +105 -33
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":"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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
|
-
|
|
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
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
|
};
|
|
@@ -87,6 +91,7 @@ export async function loginViaBrowser(
|
|
|
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>`);
|
|
89
93
|
clearTimeout(timeout);
|
|
94
|
+
server.closeAllConnections();
|
|
90
95
|
server.close();
|
|
91
96
|
resolve(config);
|
|
92
97
|
} else {
|
|
@@ -123,6 +128,7 @@ export async function loginViaBrowser(
|
|
|
123
128
|
|
|
124
129
|
// Timeout after 2 minutes
|
|
125
130
|
const timeout = setTimeout(() => {
|
|
131
|
+
server.closeAllConnections();
|
|
126
132
|
server.close();
|
|
127
133
|
reject(new Error("Authentication timed out (2 minutes). Try again."));
|
|
128
134
|
}, 120_000);
|
|
@@ -152,6 +158,29 @@ export async function loginWithToken(apiUrl: string, token: string): Promise<Aut
|
|
|
152
158
|
return config;
|
|
153
159
|
}
|
|
154
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
|
+
|
|
155
184
|
/**
|
|
156
185
|
* Push cookies to the tenant's cloud browser.
|
|
157
186
|
*/
|
|
@@ -181,8 +210,37 @@ export async function pushCookies(
|
|
|
181
210
|
}
|
|
182
211
|
);
|
|
183
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
|
+
|
|
184
239
|
if (!res.ok) {
|
|
185
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
|
+
}
|
|
186
244
|
throw new Error(`Failed to push cookies: ${res.status} — ${body}`);
|
|
187
245
|
}
|
|
188
246
|
|
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 };
|