Skip to content
File

Blob: src/client/lib/doc-sync-provider.ts

typescript39 lines
1import type YProvider from "y-partyserver/provider";
2 
3export type SyncStatus = "connected" | "connecting" | "disconnected";
4 
5export type SyncProviderLike = Pick<
6 YProvider,
7 "connect" | "disconnect" | "shouldConnect" | "wsconnected" | "wsconnecting" | "synced"
8>;
9 
10interface DocSyncConnectionInput {
11 online: boolean;
12 shareToken?: string;
13 accessToken?: string | null;
14}
15 
16export function shouldConnectDocSyncProvider({ online, shareToken, accessToken }: DocSyncConnectionInput): boolean {
17 return online && (!!shareToken || !!accessToken);
18}
19 
20export function getDocSyncStatus(provider: SyncProviderLike | null, online: boolean): SyncStatus {
21 if (!provider || !online) return "disconnected";
22 if (provider.wsconnected) return "connected";
23 if (provider.shouldConnect || provider.wsconnecting) return "connecting";
24 return "disconnected";
25}
26 
27export function reconcileDocSyncProvider(provider: SyncProviderLike | null, shouldConnect: boolean): void {
28 if (!provider) return;
29 
30 if (shouldConnect) {
31 if (provider.shouldConnect) return;
32 void provider.connect().catch(() => {});
33 return;
34 }
35 
36 if (!provider.shouldConnect && !provider.wsconnecting && !provider.wsconnected) return;
37 provider.disconnect();
38}