import { createUpstashClient } from './upstash'; import { createWebDavClient } from './webdav'; export enum ProviderType { WebDAV = 'webdav', UpStash = 'upstash', } export const SyncClients = { [ProviderType.UpStash]: createUpstashClient, [ProviderType.WebDAV]: createWebDavClient, } as const; type SyncClientConfig = { [K in keyof typeof SyncClients]: (typeof SyncClients)[K] extends ( _: infer C, ) => any ? C : never; }; export interface SyncClient { get: (key: string) => Promise; set: (key: string, value: string) => Promise; check: () => Promise; } export function createSyncClient( provider: T, config: SyncClientConfig[T], ): SyncClient { return SyncClients[provider](config as any) as any; }