File
Blob: src/client/lib/doc-sync-provider.ts
| 1 | import type YProvider from "y-partyserver/provider"; |
| 2 | |
| 3 | export type SyncStatus = "connected" | "connecting" | "disconnected"; |
| 4 | |
| 5 | export type SyncProviderLike = Pick< |
| 6 | YProvider, |
| 7 | "connect" | "disconnect" | "shouldConnect" | "wsconnected" | "wsconnecting" | "synced" |
| 8 | >; |
| 9 | |
| 10 | interface DocSyncConnectionInput { |
| 11 | online: boolean; |
| 12 | shareToken?: string; |
| 13 | accessToken?: string | null; |
| 14 | } |
| 15 | |
| 16 | export function shouldConnectDocSyncProvider({ online, shareToken, accessToken }: DocSyncConnectionInput): boolean { |
| 17 | return online && (!!shareToken || !!accessToken); |
| 18 | } |
| 19 | |
| 20 | export 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 | |
| 27 | export 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 | } |