@netique/overleaf-mcp 0.1.0 → 0.2.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
@@ -60,22 +60,40 @@ Things to ask Claude once `overleaf-mcp` is connected:
60
60
 
61
61
  No local install needed — `npx` fetches and runs the latest version. Add this to your Claude Desktop / Claude Code MCP config:
62
62
 
63
+ ```json
64
+ {
65
+ "mcpServers": {
66
+ "overleaf": {
67
+ "command": "npx",
68
+ "args": ["-y", "@netique/overleaf-mcp"]
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
74
+ The first MCP tool call (or `npx @netique/overleaf-mcp login` run ahead of time) opens a Chrome window pointed at Overleaf — log in normally and the session cookie is captured and saved to a file under your config dir. No DevTools paste, no cookie in your MCP config. When the cookie expires (~5 days), the next tool call re-opens the window and refreshes it.
75
+
76
+ For self-hosted Community Edition: set `OL_BASE_URL`:
77
+
63
78
  ```json
64
79
  {
65
80
  "mcpServers": {
66
81
  "overleaf": {
67
82
  "command": "npx",
68
83
  "args": ["-y", "@netique/overleaf-mcp"],
69
- "env": {
70
- "OL_BASE_URL": "https://www.overleaf.com",
71
- "OL_COOKIE": "overleaf_session2=s%3A...."
72
- }
84
+ "env": { "OL_BASE_URL": "https://overleaf.mylab.edu" }
73
85
  }
74
86
  }
75
87
  }
76
88
  ```
77
89
 
78
- For self-hosted Community Edition: set `OL_BASE_URL` to your server (e.g. `https://overleaf.mylab.edu`). Same cookie capture, same tools.
90
+ Useful one-shot commands:
91
+
92
+ ```sh
93
+ npx @netique/overleaf-mcp login # opens Chrome, captures cookie
94
+ npx @netique/overleaf-mcp status # who am I logged in as
95
+ npx @netique/overleaf-mcp logout --confirm # clear the saved cookie
96
+ ```
79
97
 
80
98
  <details>
81
99
  <summary>From source (for development)</summary>
@@ -94,8 +112,7 @@ Then point your MCP config at the built file:
94
112
  "mcpServers": {
95
113
  "overleaf": {
96
114
  "command": "node",
97
- "args": ["/absolute/path/to/overleaf-mcp/dist/index.js"],
98
- "env": { "OL_COOKIE": "overleaf_session2=s%3A...." }
115
+ "args": ["/absolute/path/to/overleaf-mcp/dist/index.js"]
99
116
  }
100
117
  }
101
118
  }
@@ -104,30 +121,39 @@ Then point your MCP config at the built file:
104
121
 
105
122
  ## Authentication
106
123
 
107
- overleaf-mcp authenticates with a session cookie pasted from your browser. The CSRF token is auto-discovered from the `/project` page after login, so you don't need to copy it separately. (Set `OL_CSRF` only if your Overleaf instance doesn't expose the `ol-csrfToken` meta tag.)
124
+ The session cookie lives in a plaintext file at `<configDir>/overleaf-mcp/cookie.json` (mode 0600), where `<configDir>` is `~/Library/Application Support` on macOS, `$XDG_CONFIG_HOME` (or `~/.config`) on Linux, `%APPDATA%` on Windows. The CSRF token is auto-discovered from the `/project` page on each session no separate copy needed.
108
125
 
109
- ### Capturing the cookie
126
+ ### How the cookie gets there
110
127
 
111
- 1. Log into Overleaf in your browser.
112
- 2. Open DevTools → **Application** (Chrome/Edge) or **Storage** (Firefox) → **Cookies** → `https://www.overleaf.com`.
113
- 3. Copy the **value** of `overleaf_session2` — it starts with `s%3A` and is long. That's your `OL_COOKIE` (format: `overleaf_session2=s%3A...`).
128
+ `npx @netique/overleaf-mcp login` or an MCP tool call that finds no stored cookie — spawns Chrome with a **dedicated browser profile** at `<configDir>/overleaf-mcp/chrome-profile/`, points it at `${OL_BASE_URL}/project`, and reads the session cookie via the Chrome DevTools Protocol once the dashboard loads. Why a dedicated profile:
114
129
 
115
- > ⚠️ The pasted session cookie grants full account access. Treat it like a password — do not commit it, share it, or paste it into shared configs. Cookies expire periodically; if you see auth errors, re-copy.
130
+ - We don't touch your real Chrome profile, so there's no macOS Keychain prompt for your everyday browser.
131
+ - It's a real interactive Chrome window, so captcha, Google OAuth, ORCID, institutional SSO and 2FA all work out of the box.
132
+ - The profile persists. Re-logins are usually a flash: window opens → /project loads → cookie captured → window closes.
133
+
134
+ When the cookie expires (Overleaf cookies last ~5 days), the next request hits a 302 to `/login`, overleaf-mcp evicts the stale entry, re-launches Chrome and captures a fresh one. If your browser session also expired, the Chrome window waits for you to log in (up to 5 minutes).
135
+
136
+ Any Chromium-family browser works — Chrome, Brave, Edge, Arc, Chromium. If `findChrome` can't locate one automatically, set `OL_BROWSER` to a binary path.
137
+
138
+ > ⚠️ The session cookie grants full account access. The cookie file is mode 0600 but plaintext on disk. Treat it like a password. Remove it with `overleaf-mcp logout --confirm`.
116
139
 
117
140
  ### Environment variables
118
141
 
119
- | Var | Required | Default | Notes |
120
- |---|---|---|---|
121
- | `OL_COOKIE` | yes | | Session cookie, see above. |
122
- | `OL_BASE_URL` | no | `https://www.overleaf.com` | Override for self-hosted Overleaf. |
123
- | `OL_CSRF` | no | auto-discovered | Force a specific CSRF token. Only needed if your server doesn't ship the `ol-csrfToken` meta tag. |
124
- | `OL_MCP_LOG_LEVEL` | no | `info` | `debug`, `info`, `warn`, `error`. Goes to stderr; stdout is reserved for MCP JSON-RPC. |
142
+ | Var | Default | Notes |
143
+ |---|---|---|
144
+ | `OL_BASE_URL` | `https://www.overleaf.com` | Override for self-hosted Overleaf. |
145
+ | `OL_BROWSER` | auto-detected | Path to a Chromium-family browser if auto-detection fails (Chrome / Brave / Edge / Arc / Chromium). |
146
+ | `OL_INSECURE` | | Set to `1` to pass `--ignore-certificate-errors` to the captured Chrome instance for self-hosted CE with a self-signed cert. |
147
+ | `OL_CSRF` | auto-discovered | Force a specific CSRF token. Only needed if your server doesn't ship the `ol-csrfToken` meta tag. |
148
+ | `OL_MCP_LOG_LEVEL` | `info` | `debug`, `info`, `warn`, `error`. Goes to stderr; stdout is reserved for MCP JSON-RPC. |
125
149
 
126
150
  ## Troubleshooting
127
151
 
128
- **`OverleafAuthError: Session cookie rejected (redirected to /login)`** — your `OL_COOKIE` has expired. Re-copy `overleaf_session2` from DevTools.
152
+ **`OverleafAuthError: Session cookie rejected (redirected to /login)`** — your stored cookie has expired. overleaf-mcp relaunches Chrome automatically on the next tool call to refresh; you should only see this surface as a user-facing error if Chrome itself failed to start.
153
+
154
+ **`No Chromium-family browser found`** — install Chrome (or Brave/Edge/Arc/Chromium), or set `OL_BROWSER` to a binary path.
129
155
 
130
- **`Socket.IO handshake returned 502`** — Overleaf's load balancer rejected the WebSocket upgrade. Almost always means the cookie was rejected. Same fix as above.
156
+ **`Socket.IO handshake returned 502`** — Overleaf's load balancer rejected the WebSocket upgrade. Usually means the cookie was rejected `overleaf-mcp` should auto-recover on the next tool call.
131
157
 
132
158
  **`Could not find ol-csrfToken meta tag`** — your Overleaf server doesn't expose the CSRF meta tag (rare; mostly very old Community Edition). Set `OL_CSRF` explicitly.
133
159
 
package/dist/api/http.js CHANGED
@@ -1,47 +1,75 @@
1
1
  import { getIdentity } from "../session/identity.js";
2
- import { OverleafApiError } from "./errors.js";
2
+ import { withAuthRetry } from "../session/recovery.js";
3
+ import { OverleafApiError, OverleafAuthError } from "./errors.js";
3
4
  function joinUrl(base, path) {
4
5
  return `${base}/${path.replace(/^\/+/, "")}`;
5
6
  }
7
+ function throwIfAuthBad(res) {
8
+ if (res.status === 401 || res.status === 403) {
9
+ throw new OverleafAuthError(`HTTP ${res.status} on ${res.url || "request"}`);
10
+ }
11
+ if (res.status >= 300 && res.status < 400) {
12
+ const loc = res.headers.get("location") ?? "";
13
+ if (/\/login(\?|$|\/)/i.test(loc)) {
14
+ throw new OverleafAuthError(`redirected to ${loc} — session expired`);
15
+ }
16
+ }
17
+ }
6
18
  export async function olGet(path, extraHeaders = {}) {
7
- const id = await getIdentity();
8
- return fetch(joinUrl(id.baseUrl, path), {
9
- method: "GET",
10
- redirect: "manual",
11
- headers: { Cookie: id.cookie, Connection: "keep-alive", ...extraHeaders },
19
+ return withAuthRetry(async () => {
20
+ const id = await getIdentity();
21
+ const res = await fetch(joinUrl(id.baseUrl, path), {
22
+ method: "GET",
23
+ redirect: "manual",
24
+ headers: { Cookie: id.cookie, Connection: "keep-alive", ...extraHeaders },
25
+ });
26
+ throwIfAuthBad(res);
27
+ return res;
12
28
  });
13
29
  }
14
30
  export async function olPostJson(path, body = {}, extraHeaders = {}) {
15
- const id = await getIdentity();
16
- return fetch(joinUrl(id.baseUrl, path), {
17
- method: "POST",
18
- redirect: "manual",
19
- headers: {
20
- Cookie: id.cookie,
21
- Connection: "keep-alive",
22
- "Content-Type": "application/json",
23
- "X-Csrf-Token": id.csrf,
24
- ...extraHeaders,
25
- },
26
- body: JSON.stringify({ _csrf: id.csrf, ...body }),
31
+ return withAuthRetry(async () => {
32
+ const id = await getIdentity();
33
+ const res = await fetch(joinUrl(id.baseUrl, path), {
34
+ method: "POST",
35
+ redirect: "manual",
36
+ headers: {
37
+ Cookie: id.cookie,
38
+ Connection: "keep-alive",
39
+ "Content-Type": "application/json",
40
+ "X-Csrf-Token": id.csrf,
41
+ ...extraHeaders,
42
+ },
43
+ body: JSON.stringify({ _csrf: id.csrf, ...body }),
44
+ });
45
+ throwIfAuthBad(res);
46
+ return res;
27
47
  });
28
48
  }
29
49
  export async function olDelete(path, extraHeaders = {}) {
30
- const id = await getIdentity();
31
- return fetch(joinUrl(id.baseUrl, path), {
32
- method: "DELETE",
33
- redirect: "manual",
34
- headers: {
35
- Cookie: id.cookie,
36
- Connection: "keep-alive",
37
- "X-Csrf-Token": id.csrf,
38
- ...extraHeaders,
39
- },
50
+ return withAuthRetry(async () => {
51
+ const id = await getIdentity();
52
+ const res = await fetch(joinUrl(id.baseUrl, path), {
53
+ method: "DELETE",
54
+ redirect: "manual",
55
+ headers: {
56
+ Cookie: id.cookie,
57
+ Connection: "keep-alive",
58
+ "X-Csrf-Token": id.csrf,
59
+ ...extraHeaders,
60
+ },
61
+ });
62
+ throwIfAuthBad(res);
63
+ return res;
40
64
  });
41
65
  }
42
66
  export async function expectOk(res, hint) {
43
67
  if (res.ok)
44
68
  return res;
69
+ // Defensive: primitives above already throw on auth-bad responses, but a
70
+ // caller that constructed its own fetch (or bypassed throwIfAuthBad) still
71
+ // benefits from the same classification here.
72
+ throwIfAuthBad(res);
45
73
  const body = await res.text().catch(() => "");
46
74
  throw new OverleafApiError(res.status, body, hint);
47
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/api/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,SAAS,OAAO,CAAC,IAAY,EAAE,IAAY;IACzC,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,eAAuC,EAAE;IACjF,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;QACtC,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE;KAC1E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,OAAgC,EAAE,EAClC,eAAuC,EAAE;IAEzC,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;QACtC,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE;YACP,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,UAAU,EAAE,YAAY;YACxB,cAAc,EAAE,kBAAkB;YAClC,cAAc,EAAE,EAAE,CAAC,IAAI;YACvB,GAAG,YAAY;SAChB;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;KAClD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,eAAuC,EAAE;IACpF,MAAM,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;QACtC,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE;YACP,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,UAAU,EAAE,YAAY;YACxB,cAAc,EAAE,EAAE,CAAC,IAAI;YACvB,GAAG,YAAY;SAChB;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAa,EAAE,IAAa;IACzD,IAAI,GAAG,CAAC,EAAE;QAAE,OAAO,GAAG,CAAC;IACvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAc,GAAa,EAAE,IAAa;IACpE,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/api/http.ts"],"names":[],"mappings":"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"}
@@ -17,10 +17,35 @@
17
17
  import WebSocket from "ws";
18
18
  import { OverleafApiError, OverleafAuthError } from "./errors.js";
19
19
  import { getIdentity } from "../session/identity.js";
20
+ import { withAuthRetry } from "../session/recovery.js";
20
21
  import { logger } from "../util/logger.js";
21
22
  function decodePackedUtf8(line) {
22
23
  return Buffer.from(line, "latin1").toString("utf8");
23
24
  }
25
+ function mergeSetCookies(existing, responseHeaders) {
26
+ // Use undici's getSetCookie when available (Node 22+); fall back to parsing
27
+ // the raw header for Node 20.
28
+ const headersAny = responseHeaders;
29
+ const raw = headersAny.getSetCookie?.() ?? [];
30
+ if (!raw.length) {
31
+ const single = responseHeaders.get("set-cookie");
32
+ if (single)
33
+ raw.push(single);
34
+ }
35
+ const existingNames = new Set(existing.split(";").map((p) => p.split("=")[0].trim().toLowerCase()));
36
+ const adds = [];
37
+ for (const sc of raw) {
38
+ const first = sc.split(";")[0].trim();
39
+ const name = first.split("=")[0].trim().toLowerCase();
40
+ if (!name || existingNames.has(name))
41
+ continue;
42
+ adds.push(first);
43
+ existingNames.add(name);
44
+ }
45
+ if (!adds.length)
46
+ return existing;
47
+ return `${existing}; ${adds.join("; ")}`;
48
+ }
24
49
  class OverleafSocket {
25
50
  projectId;
26
51
  identity;
@@ -52,6 +77,13 @@ class OverleafSocket {
52
77
  Connection: "keep-alive",
53
78
  },
54
79
  });
80
+ if (hsRes.status >= 300 && hsRes.status < 400) {
81
+ const loc = hsRes.headers.get("location") ?? "";
82
+ if (/\/login(\?|$|\/)/i.test(loc)) {
83
+ throw new OverleafAuthError(`Socket.IO handshake redirected to ${loc} — session expired`);
84
+ }
85
+ throw new OverleafAuthError(`Socket.IO handshake returned ${hsRes.status} -> ${loc}`);
86
+ }
55
87
  if (hsRes.status !== 200) {
56
88
  const body = await hsRes.text().catch(() => "");
57
89
  throw new OverleafAuthError(`Socket.IO handshake returned ${hsRes.status}: ${body.slice(0, 200)}`);
@@ -62,9 +94,16 @@ class OverleafSocket {
62
94
  throw new OverleafApiError(0, hsBody, "handshake response did not include a sid or websocket transport");
63
95
  }
64
96
  this.heartbeatInterval = Math.max(15_000, (Number(hbStr) || 60) * 1000 - 5_000);
97
+ // The Overleaf SaaS sits behind a GCP load balancer that pins requests to
98
+ // a backend via a `GCLB` cookie set on the handshake response. The WS
99
+ // upgrade MUST land on the same backend (it carries the in-memory sid),
100
+ // so we extract any Set-Cookie from the handshake and merge it into the
101
+ // Cookie header we send on the upgrade. Without this the upgrade routes
102
+ // randomly and intermittently returns 502.
103
+ const upgradeCookie = mergeSetCookies(this.identity.cookie, hsRes.headers);
65
104
  const wsUrl = `${base.replace(/^http/, "ws")}/socket.io/1/websocket/${sid}`;
66
105
  const ws = new WebSocket(wsUrl, {
67
- headers: { Cookie: this.identity.cookie, Origin: new URL(base).origin },
106
+ headers: { Cookie: upgradeCookie, Origin: new URL(base).origin },
68
107
  handshakeTimeout: timeoutMs,
69
108
  });
70
109
  this.ws = ws;
@@ -226,13 +265,23 @@ class OverleafSocket {
226
265
  return;
227
266
  }
228
267
  case "7": {
229
- // Error
230
- logger.error("server error frame", data);
268
+ // Type-7 frames are rare and usually mean the server invalidated our
269
+ // session (cookie expired server-side, etc). Reject all pending acks
270
+ // with an OverleafAuthError so the reconnect/retry wrapper picks them
271
+ // up, and close the WS so the next ensureSocketForProject doesn't
272
+ // hand back this broken instance.
273
+ logger.error("server error frame, treating as auth-recoverable", data);
274
+ const authErr = new OverleafAuthError(`server error frame: ${data}`);
231
275
  for (const [, p] of this.pending) {
232
276
  clearTimeout(p.timer);
233
- p.reject(new Error(`server error: ${data}`));
277
+ p.reject(authErr);
234
278
  }
235
279
  this.pending.clear();
280
+ this.closed = true;
281
+ try {
282
+ this.ws?.close();
283
+ }
284
+ catch { /* ignore */ }
236
285
  return;
237
286
  }
238
287
  default:
@@ -302,42 +351,94 @@ class OverleafSocket {
302
351
  }
303
352
  let active = null;
304
353
  export async function ensureSocketForProject(projectId) {
305
- if (active && active.projectId === projectId && active.isOpen()) {
306
- return { socket: active, publicId: active.publicId ?? undefined, joinedProject: active.joinedProject ?? undefined };
307
- }
308
- if (active) {
309
- logger.info(`switching project: ${active.projectId} -> ${projectId}`);
310
- active.disconnect();
311
- active = null;
312
- }
313
- const identity = await getIdentity();
314
- const s = new OverleafSocket(projectId, identity);
315
- await s.connect();
316
- active = s;
317
- return { socket: s, publicId: s.publicId ?? undefined, joinedProject: s.joinedProject ?? undefined };
354
+ return withAuthRetry(async () => {
355
+ if (active && active.projectId === projectId && active.isOpen()) {
356
+ return { socket: active, publicId: active.publicId ?? undefined, joinedProject: active.joinedProject ?? undefined };
357
+ }
358
+ if (active) {
359
+ logger.info(`switching project: ${active.projectId} -> ${projectId}`);
360
+ active.disconnect();
361
+ active = null;
362
+ }
363
+ const identity = await getIdentity();
364
+ const s = new OverleafSocket(projectId, identity);
365
+ await s.connect();
366
+ active = s;
367
+ return { socket: s, publicId: s.publicId ?? undefined, joinedProject: s.joinedProject ?? undefined };
368
+ });
318
369
  }
319
370
  export function getActiveSocket() {
320
371
  return active;
321
372
  }
373
+ // Snapshot the active project, run an emit, and if it fails because the
374
+ // socket got torn down (auth-shaped error or "socket closed"), evict the
375
+ // cookie if needed, re-establish the socket on the same project, and retry
376
+ // the emit exactly once. Callers should pass a prep step (e.g. re-join the
377
+ // doc) if the operation requires per-doc state that the new socket lacks.
378
+ async function withReconnectingSocket(op, prep) {
379
+ const projectId = active?.projectId;
380
+ try {
381
+ return await op();
382
+ }
383
+ catch (err) {
384
+ if (!projectId)
385
+ throw err;
386
+ const isAuth = err instanceof OverleafAuthError;
387
+ const isClosed = err instanceof Error && /socket closed|socket not open/i.test(err.message);
388
+ if (!isAuth && !isClosed)
389
+ throw err;
390
+ logger.info(`socket op failed (${err.message}); reconnecting to project ${projectId}`);
391
+ if (active) {
392
+ try {
393
+ active.disconnect();
394
+ }
395
+ catch { /* ignore */ }
396
+ active = null;
397
+ }
398
+ if (isAuth) {
399
+ const { evictAndRediscover } = await import("../auth/discover.js");
400
+ const { loadConfig } = await import("../config.js");
401
+ const { clearIdentity } = await import("../session/identity.js");
402
+ clearIdentity();
403
+ await evictAndRediscover(loadConfig().baseUrl);
404
+ }
405
+ await ensureSocketForProject(projectId);
406
+ if (prep)
407
+ await prep();
408
+ return await op();
409
+ }
410
+ }
322
411
  export async function joinDoc(docId) {
323
- if (!active)
324
- throw new OverleafApiError(0, "", "no active project — call open_project first");
325
- // The ack returns `[docLinesAscii, version, updates, ranges]`.
326
- const ret = await active.emit("joinDoc", [docId, { encodeRanges: true }]);
327
- const tuple = Array.isArray(ret) ? ret : [ret];
328
- const [docLinesAscii, version, updates, ranges] = tuple;
329
- const docLines = (docLinesAscii ?? []).map(decodePackedUtf8);
330
- return { docLines, version: version ?? 0, updates: updates ?? [], ranges };
412
+ return withReconnectingSocket(async () => {
413
+ if (!active)
414
+ throw new OverleafApiError(0, "", "no active project — call open_project first");
415
+ // The ack returns `[docLinesAscii, version, updates, ranges]`.
416
+ const ret = await active.emit("joinDoc", [docId, { encodeRanges: true }]);
417
+ const tuple = Array.isArray(ret) ? ret : [ret];
418
+ const [docLinesAscii, version, updates, ranges] = tuple;
419
+ const docLines = (docLinesAscii ?? []).map(decodePackedUtf8);
420
+ return { docLines, version: version ?? 0, updates: updates ?? [], ranges };
421
+ });
331
422
  }
332
423
  export async function leaveDoc(docId) {
424
+ // Best-effort; if the socket is gone, the doc is already implicitly left.
333
425
  if (!active)
334
426
  return;
335
427
  await active.emit("leaveDoc", [docId]).catch(() => undefined);
336
428
  }
337
429
  export async function applyOtUpdate(docId, update) {
338
- if (!active)
339
- throw new OverleafApiError(0, "", "no active project — call open_project first");
340
- await active.emit("applyOtUpdate", [docId, update]);
430
+ await withReconnectingSocket(async () => {
431
+ if (!active)
432
+ throw new OverleafApiError(0, "", "no active project — call open_project first");
433
+ await active.emit("applyOtUpdate", [docId, update]);
434
+ },
435
+ // After a reconnect, the fresh socket has no docs joined. Re-join so the
436
+ // retried applyOtUpdate hits a socket that knows about this doc. Note:
437
+ // joinDoc returns the current version, but our `update.v` was computed
438
+ // against the pre-reconnect version. The server's OT layer either accepts
439
+ // (if the version matches) or rejects with a version-conflict, which we
440
+ // propagate to the caller — same as if the original emit had failed.
441
+ async () => { await joinDoc(docId); });
341
442
  }
342
443
  export function disconnectActive() {
343
444
  if (active) {
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/api/socket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../src/api/socket.ts"],"names":[],"mappings":"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"}