refactor(realtime): centralize refresh policy

This commit is contained in:
2026-08-09 21:13:48 +07:00 Unverified
parent 078216f36d
commit e17a615c07
3 changed files with 81 additions and 79 deletions
+34 -47
View File
@@ -5,27 +5,39 @@ export type RealtimeRefreshFilter =
| { kind: "xp" }
| { kind: "vc"; channelId?: string };
export type RealtimeRefreshHandlers = {
onOpen: () => void;
onForm: (event: { formId: string }) => void;
onUpload: () => void;
onXp: () => void;
onVc: (event: { channelId: string }) => void;
};
export type RealtimeRefreshEvent =
| { kind: "open" }
| { kind: "form"; formId: string }
| { kind: "upload" }
| { kind: "xp" }
| { kind: "vc"; channelId: string };
type StartRealtimeRefreshOptions = {
filter: RealtimeRefreshFilter;
debounceMs: number;
refresh: () => void;
subscribe: (handlers: RealtimeRefreshHandlers) => { clean: () => void };
};
export type RealtimeRefreshSubscription = { clean: () => void };
export function matchesRealtimeRefresh(
filter: RealtimeRefreshFilter,
event: Exclude<RealtimeRefreshEvent, { kind: "open" }>,
) {
if (filter.kind === "form") {
return event.kind === "form" && (!filter.formId || event.formId === filter.formId);
}
if (filter.kind === "uploads") return event.kind === "upload";
if (filter.kind === "xp") return event.kind === "xp";
if (filter.kind === "profile") return event.kind === "xp" || event.kind === "vc";
return event.kind === "vc" && (!filter.channelId || event.channelId === filter.channelId);
}
export function startRealtimeRefresh({
filter,
debounceMs,
refresh,
subscribe,
}: StartRealtimeRefreshOptions) {
}: {
filter: RealtimeRefreshFilter;
debounceMs: number;
refresh: () => void;
subscribe: (emit: (event: RealtimeRefreshEvent) => void) => RealtimeRefreshSubscription;
}) {
let connectedOnce = false;
let refreshTimer: ReturnType<typeof setTimeout> | undefined;
@@ -34,39 +46,14 @@ export function startRealtimeRefresh({
refreshTimer = setTimeout(refresh, debounceMs);
};
const subscription = subscribe({
onOpen() {
if (connectedOnce) {
scheduleRefresh();
} else {
connectedOnce = true;
}
},
onForm(event) {
if (
filter.kind === "form"
&& (!filter.formId || event.formId === filter.formId)
) {
scheduleRefresh();
}
},
onXp() {
if (filter.kind === "xp" || filter.kind === "profile") scheduleRefresh();
},
onUpload() {
if (filter.kind === "uploads") scheduleRefresh();
},
onVc(event) {
if (
filter.kind === "profile"
|| (
filter.kind === "vc"
&& (!filter.channelId || event.channelId === filter.channelId)
)
) {
scheduleRefresh();
}
},
const subscription = subscribe((event) => {
if (event.kind === "open") {
if (connectedOnce) scheduleRefresh();
connectedOnce = true;
return;
}
if (matchesRealtimeRefresh(filter, event)) scheduleRefresh();
});
return () => {