its for when you want to get like notifications for your reposts

fix: make reconnect backoff work properly

ptr.pet 7c0c486f e3fea54b

verified
Changed files
+22 -9
extension
entrypoints
utils
webapp
+12 -2
extension/entrypoints/background.ts
···
import { onMessage, sendMessage } from "webext-bridge/background";
let websocket: WebSocket | null = null;
+
let reconnectBackoff = 1000 * 1;
+
let connectionStatus: ConnectionStatus = "disconnected";
let error: string | null = null;
let items: Notification[] = [];
···
},
setConnectionStatus,
setError,
-
backoff: 1000 * 1,
+
doRetry: () => {
+
console.log("ws", websocket, " status ", connectionStatus);
+
if (websocket !== null && connectionStatus === "error") {
+
const b = reconnectBackoff;
+
reconnectBackoff *= 2;
+
return b;
+
} else return null;
+
},
}).then((ws) => {
websocket = ws ?? null;
});
};
const disconnect = () => {
-
setConnectionStatus("disconnecting...");
+
setConnectionStatus("disconnected");
+
setError(null);
websocket?.close();
websocket = null;
};
+3
extension/utils/store.ts
···
+
import { ConnectionStatus } from "bsky-repost-likes-monitor";
+
const store = {
actorId: storage.defineItem<string>("sync:actorId", { fallback: "" }),
serviceDomain: storage.defineItem<string>("sync:serviceDomain", {
fallback: "likes.gaze.systems",
}),
+
backoff: storage.defineItem<number>("local:backoff", { fallback: 1000 * 1 }),
};
export default store;
-1
webapp/src/App.tsx
···
};
const disconnect = (): void => {
-
setConnectionStatus("disconnecting...");
ws()?.close();
setWs(null);
};
-1
webapp/src/types.ts
···
export type ConnectionStatus =
| "disconnected"
-
| "disconnecting..."
| "connecting..."
| "connected"
| "error";
+7 -5
webapp/src/ws.ts
···
pushNotification: (item: Notification) => void;
actorId: string;
serviceDomain: string;
-
backoff?: number;
+
doRetry?: () => number | null;
}
const handleResolver = new XrpcHandleResolver({
···
cb.setConnectionStatus("disconnected");
console.log("WebSocket disconnected");
// abnormal closure
-
if (ev.code === 1006 && cb.backoff) {
+
if (ev.code === 1006) {
cb.setConnectionStatus("error");
-
cb.setError(`websocket closed abnormally: (${ev.code}) ${ev.reason}`);
-
const newData = { backoff: cb.backoff * 2, ...cb };
-
setTimeout(() => connect(newData), cb.backoff);
+
const backoff = (cb.doRetry ?? (() => null))();
+
if (backoff) {
+
cb.setError(`websocket closed abnormally: (${ev.code}) ${ev.reason}`);
+
setTimeout(() => connect(cb), backoff);
+
}
} else if (ev.code === 1000 || ev.code === 1001 || ev.code === 1005) {
cb.setError(null);
} else {