···33// we don't need to re-fetch.
4455export function subscribe({ dids, collections, onCommit }) {
66- const url = new URL("wss://jetstream1.us-east.bsky.network/subscribe");
77- for (const d of dids) url.searchParams.append("wantedDids", d);
88- for (const c of collections) url.searchParams.append("wantedCollections", c);
99-106 let ws;
117 let closed = false;
128 let retry = 0;
99+ let cursor = null;
13101411 const open = () => {
1512 if (closed) return;
1313+ const url = new URL("wss://jetstream1.us-east.bsky.network/subscribe");
1414+ for (const d of dids) url.searchParams.append("wantedDids", d);
1515+ for (const c of collections) url.searchParams.append("wantedCollections", c);
1616+ // Resume from the last seen event on reconnect, otherwise Jetstream starts
1717+ // a fresh live tail and commits during the downtime are lost for good.
1818+ if (cursor) url.searchParams.set("cursor", String(cursor));
1919+1620 ws = new WebSocket(url);
1721 ws.onopen = () => (retry = 0);
1822 ws.onmessage = (e) => {
···2226 } catch {
2327 return;
2428 }
2929+ if (msg.time_us) cursor = msg.time_us;
2530 if (msg.kind !== "commit" || !msg.commit) return;
2631 onCommit({
2732 did: msg.did,