@syncular/client 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +227 -709
- package/dist/apply.d.ts +80 -0
- package/dist/apply.js +301 -0
- package/dist/blob.d.ts +127 -0
- package/dist/blob.js +201 -0
- package/dist/bun-database.d.ts +22 -0
- package/dist/bun-database.js +61 -0
- package/dist/client.d.ts +320 -69
- package/dist/client.js +1627 -163
- package/dist/content-type.d.ts +2 -0
- package/dist/content-type.js +2 -0
- package/dist/database.d.ts +35 -80
- package/dist/database.js +32 -947
- package/dist/encryption.d.ts +47 -0
- package/dist/encryption.js +75 -0
- package/dist/errors.d.ts +8 -22
- package/dist/errors.js +10 -207
- package/dist/http.d.ts +32 -0
- package/dist/http.js +196 -0
- package/dist/index.d.ts +28 -16
- package/dist/index.js +25 -12
- package/dist/invalidation.d.ts +69 -0
- package/dist/invalidation.js +84 -0
- package/dist/leader-lock.d.ts +28 -0
- package/dist/leader-lock.js +38 -0
- package/dist/multi-tab.d.ts +134 -0
- package/dist/multi-tab.js +399 -0
- package/dist/node-database.d.ts +41 -0
- package/dist/node-database.js +133 -0
- package/dist/outbox.d.ts +56 -0
- package/dist/outbox.js +140 -0
- package/dist/schema.d.ts +107 -0
- package/dist/schema.js +267 -0
- package/dist/state.d.ts +40 -0
- package/dist/state.js +77 -0
- package/dist/transport.d.ts +44 -0
- package/dist/transport.js +7 -0
- package/dist/wasm-database.d.ts +30 -0
- package/dist/wasm-database.js +170 -0
- package/dist/window.d.ts +64 -0
- package/dist/window.js +0 -0
- package/dist/worker-entry.d.ts +16 -2
- package/dist/worker-entry.js +300 -456
- package/dist/worker-host.d.ts +174 -0
- package/dist/worker-host.js +536 -0
- package/dist/worker-protocol.d.ts +173 -61
- package/dist/worker-protocol.js +7 -16
- package/package.json +45 -112
- package/src/apply.ts +435 -0
- package/src/blob.ts +333 -0
- package/src/bun-database.ts +75 -0
- package/src/client.ts +2247 -277
- package/src/content-type.ts +2 -0
- package/src/database.ts +63 -1389
- package/src/encryption.ts +123 -0
- package/src/errors.ts +11 -265
- package/src/http.ts +254 -0
- package/src/index.ts +25 -20
- package/src/invalidation.ts +128 -0
- package/src/leader-lock.ts +68 -0
- package/src/multi-tab.ts +550 -0
- package/src/node-database.ts +180 -0
- package/src/outbox.ts +206 -0
- package/src/schema.ts +397 -0
- package/src/state.ts +126 -0
- package/src/transport.ts +52 -0
- package/src/wasm-database.ts +279 -0
- package/src/window.ts +0 -0
- package/src/worker-entry.ts +391 -545
- package/src/worker-host.ts +800 -0
- package/src/worker-protocol.ts +204 -99
- package/dist/auth-leases.d.ts +0 -11
- package/dist/auth-leases.d.ts.map +0 -1
- package/dist/auth-leases.js +0 -140
- package/dist/auth-leases.js.map +0 -1
- package/dist/blob-limits.d.ts +0 -15
- package/dist/blob-limits.d.ts.map +0 -1
- package/dist/blob-limits.js +0 -66
- package/dist/blob-limits.js.map +0 -1
- package/dist/bridge-client.d.ts +0 -69
- package/dist/bridge-client.d.ts.map +0 -1
- package/dist/bridge-client.js +0 -282
- package/dist/bridge-client.js.map +0 -1
- package/dist/client-config.d.ts +0 -6
- package/dist/client-config.d.ts.map +0 -1
- package/dist/client-config.js +0 -18
- package/dist/client-config.js.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/command-history.d.ts +0 -35
- package/dist/command-history.d.ts.map +0 -1
- package/dist/command-history.js +0 -378
- package/dist/command-history.js.map +0 -1
- package/dist/console-diagnostics.d.ts +0 -33
- package/dist/console-diagnostics.d.ts.map +0 -1
- package/dist/console-diagnostics.js +0 -496
- package/dist/console-diagnostics.js.map +0 -1
- package/dist/crdt-yjs/index.d.ts +0 -4
- package/dist/crdt-yjs/index.d.ts.map +0 -1
- package/dist/crdt-yjs/index.js +0 -4
- package/dist/crdt-yjs/index.js.map +0 -1
- package/dist/crdt-yjs/webview-host-facade.d.ts +0 -126
- package/dist/crdt-yjs/webview-host-facade.d.ts.map +0 -1
- package/dist/crdt-yjs/webview-host-facade.js +0 -284
- package/dist/crdt-yjs/webview-host-facade.js.map +0 -1
- package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +0 -153
- package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +0 -1
- package/dist/crdt-yjs/yjs-document-field-adapter.js +0 -406
- package/dist/crdt-yjs/yjs-document-field-adapter.js.map +0 -1
- package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +0 -73
- package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +0 -1
- package/dist/crdt-yjs/yjs-prosemirror-bridge.js +0 -169
- package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +0 -1
- package/dist/database.d.ts.map +0 -1
- package/dist/database.js.map +0 -1
- package/dist/diagnostics.d.ts +0 -10
- package/dist/diagnostics.d.ts.map +0 -1
- package/dist/diagnostics.js +0 -83
- package/dist/diagnostics.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/generated-bridge.d.ts +0 -365
- package/dist/generated-bridge.d.ts.map +0 -1
- package/dist/generated-bridge.js +0 -250
- package/dist/generated-bridge.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mutations.d.ts +0 -72
- package/dist/mutations.d.ts.map +0 -1
- package/dist/mutations.js +0 -63
- package/dist/mutations.js.map +0 -1
- package/dist/network.d.ts +0 -3
- package/dist/network.d.ts.map +0 -1
- package/dist/network.js +0 -17
- package/dist/network.js.map +0 -1
- package/dist/react/index.d.ts +0 -169
- package/dist/react/index.d.ts.map +0 -1
- package/dist/react/index.js +0 -628
- package/dist/react/index.js.map +0 -1
- package/dist/react-native/index.d.ts +0 -35
- package/dist/react-native/index.d.ts.map +0 -1
- package/dist/react-native/index.js +0 -49
- package/dist/react-native/index.js.map +0 -1
- package/dist/runtime-contract.d.ts +0 -13
- package/dist/runtime-contract.d.ts.map +0 -1
- package/dist/runtime-contract.js +0 -24
- package/dist/runtime-contract.js.map +0 -1
- package/dist/rust-client.d.ts +0 -106
- package/dist/rust-client.d.ts.map +0 -1
- package/dist/rust-client.js +0 -938
- package/dist/rust-client.js.map +0 -1
- package/dist/sentry.d.ts +0 -35
- package/dist/sentry.d.ts.map +0 -1
- package/dist/sentry.js +0 -155
- package/dist/sentry.js.map +0 -1
- package/dist/sql-safety.d.ts +0 -3
- package/dist/sql-safety.d.ts.map +0 -1
- package/dist/sql-safety.js +0 -62
- package/dist/sql-safety.js.map +0 -1
- package/dist/syncular-runtime-artifacts.json +0 -61
- package/dist/tauri/index.d.ts +0 -35
- package/dist/tauri/index.d.ts.map +0 -1
- package/dist/tauri/index.js +0 -114
- package/dist/tauri/index.js.map +0 -1
- package/dist/types.d.ts +0 -1096
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/wasm/.syncular-wasm-profile +0 -1
- package/dist/wasm/syncular-runtime-artifact.json +0 -21
- package/dist/wasm/syncular.d.ts +0 -207
- package/dist/wasm/syncular.js +0 -2341
- package/dist/wasm/syncular_bg.wasm +0 -0
- package/dist/wasm/syncular_bg.wasm.d.ts +0 -97
- package/dist/wasm-bindings/runtime-contract.d.ts +0 -22
- package/dist/wasm-bindings/runtime-contract.d.ts.map +0 -1
- package/dist/wasm-bindings/runtime-contract.js +0 -112
- package/dist/wasm-bindings/runtime-contract.js.map +0 -1
- package/dist/wasm-core/.syncular-wasm-profile +0 -1
- package/dist/wasm-core/syncular-runtime-artifact.json +0 -17
- package/dist/wasm-core/syncular.d.ts +0 -162
- package/dist/wasm-core/syncular.js +0 -1847
- package/dist/wasm-core/syncular_bg.wasm +0 -0
- package/dist/wasm-core/syncular_bg.wasm.d.ts +0 -77
- package/dist/wasm-perf/.syncular-wasm-profile +0 -1
- package/dist/wasm-perf/syncular-runtime-artifact.json +0 -21
- package/dist/wasm-perf/syncular.d.ts +0 -207
- package/dist/wasm-perf/syncular.js +0 -2341
- package/dist/wasm-perf/syncular_bg.wasm +0 -0
- package/dist/wasm-perf/syncular_bg.wasm.d.ts +0 -97
- package/dist/wasm-runtime.d.ts +0 -23
- package/dist/wasm-runtime.d.ts.map +0 -1
- package/dist/wasm-runtime.js +0 -69
- package/dist/wasm-runtime.js.map +0 -1
- package/dist/worker-client.d.ts +0 -123
- package/dist/worker-client.d.ts.map +0 -1
- package/dist/worker-client.js +0 -1735
- package/dist/worker-client.js.map +0 -1
- package/dist/worker-entry.d.ts.map +0 -1
- package/dist/worker-entry.js.map +0 -1
- package/dist/worker-protocol.d.ts.map +0 -1
- package/dist/worker-protocol.js.map +0 -1
- package/dist/worker-realtime.d.ts +0 -39
- package/dist/worker-realtime.d.ts.map +0 -1
- package/dist/worker-realtime.js +0 -677
- package/dist/worker-realtime.js.map +0 -1
- package/src/auth-leases.ts +0 -251
- package/src/blob-limits.ts +0 -98
- package/src/bridge-client.ts +0 -512
- package/src/client-config.ts +0 -29
- package/src/command-history.ts +0 -623
- package/src/console-diagnostics.ts +0 -617
- package/src/crdt-yjs/index.ts +0 -3
- package/src/crdt-yjs/webview-host-facade.ts +0 -477
- package/src/crdt-yjs/yjs-document-field-adapter.ts +0 -733
- package/src/crdt-yjs/yjs-prosemirror-bridge.ts +0 -272
- package/src/diagnostics.ts +0 -116
- package/src/generated-bridge.ts +0 -741
- package/src/mutations.ts +0 -168
- package/src/network.ts +0 -32
- package/src/react/index.ts +0 -1036
- package/src/react-native/index.ts +0 -152
- package/src/runtime-contract.ts +0 -48
- package/src/rust-client.ts +0 -1491
- package/src/sentry.ts +0 -215
- package/src/sql-safety.ts +0 -61
- package/src/tauri/index.ts +0 -211
- package/src/types.ts +0 -1397
- package/src/wasm-bindings/generated-wasm-bindings.d.ts +0 -70
- package/src/wasm-bindings/runtime-contract.ts +0 -158
- package/src/wasm-runtime.ts +0 -145
- package/src/worker-client.ts +0 -2289
- package/src/worker-realtime.ts +0 -843
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main-thread side of the worker mode (Direction decision 2) and the
|
|
3
|
+
* multi-tab topology (TODO 3.2, REVISE B3).
|
|
4
|
+
*
|
|
5
|
+
* `createSyncClientHandle` acquires the Web Locks leader lock and, when it
|
|
6
|
+
* wins, spawns the worker running the WHOLE core — so exactly one core runs
|
|
7
|
+
* per origin (the lock IS the invariant: a worker is NEVER spawned without
|
|
8
|
+
* holding the lock). The returned {@link SyncClientHandle} is a thin, fully
|
|
9
|
+
* async proxy over the `worker-protocol` RPC.
|
|
10
|
+
*
|
|
11
|
+
* With `multiTab: true`, a tab that LOSES the election does not resolve to a
|
|
12
|
+
* dead not-leader handle: it becomes a FOLLOWER (`role === 'follower'`) that
|
|
13
|
+
* proxies every call to the leader tab over a BroadcastChannel (see
|
|
14
|
+
* `multi-tab.ts`). When the leader tab closes, its lock releases; the
|
|
15
|
+
* followers contest, the winner PROMOTES in place — spawns the worker over
|
|
16
|
+
* the persisted OPFS database and re-announces — and the handle's `role`
|
|
17
|
+
* flips to `'leader'` with `onRoleChange` firing. The same handle object is
|
|
18
|
+
* kept across the transition so React bindings hold a stable reference.
|
|
19
|
+
*
|
|
20
|
+
* With `multiTab` off (default), behavior is unchanged: the loser is an
|
|
21
|
+
* `isLeader === false` handle whose calls reject with `client.not_leader`.
|
|
22
|
+
*/
|
|
23
|
+
import type { WakeReason } from '@syncular/core';
|
|
24
|
+
import type { BlobRef, CachedBlob } from './blob.js';
|
|
25
|
+
import type { ConflictRecord, LeaseState, MutationInput, PresencePeer, RejectionRecord, SchemaFloor, SubscribeInput, SyncClientLimits, SyncSummary, WindowState } from './client.js';
|
|
26
|
+
import type { SqlRow, SqlValue } from './database.js';
|
|
27
|
+
import { InvalidationEmitter, type InvalidationListener } from './invalidation.js';
|
|
28
|
+
import { type LeaderLease, type LeaderLock } from './leader-lock.js';
|
|
29
|
+
import { type CrossTabChannel, FollowerLink, LeaderBridge } from './multi-tab.js';
|
|
30
|
+
import type { OutboxCommit } from './outbox.js';
|
|
31
|
+
import type { ClientSchema } from './schema.js';
|
|
32
|
+
import type { SubscriptionRecord } from './state.js';
|
|
33
|
+
import type { WindowBase } from './window.js';
|
|
34
|
+
import { type SyncWorkerEvent, type WorkerDatabaseInit, type WorkerEndpoints, type WorkerErrorShape } from './worker-protocol.js';
|
|
35
|
+
export type HandleRole = 'leader' | 'follower';
|
|
36
|
+
export interface SyncClientHandleConfig {
|
|
37
|
+
/**
|
|
38
|
+
* Spawns the worker running `startSyncWorker()` (a factory so bundlers
|
|
39
|
+
* see `new Worker(new URL(...))` at the call site, and so no worker is
|
|
40
|
+
* spawned when this tab loses the leader election). Called again on a
|
|
41
|
+
* follower's promotion.
|
|
42
|
+
*/
|
|
43
|
+
readonly worker: () => Worker;
|
|
44
|
+
readonly schema: ClientSchema;
|
|
45
|
+
readonly database: WorkerDatabaseInit;
|
|
46
|
+
readonly endpoints: WorkerEndpoints;
|
|
47
|
+
readonly clientId?: string;
|
|
48
|
+
readonly limits?: SyncClientLimits;
|
|
49
|
+
/** Worker-side host loop (§8.4); default true. */
|
|
50
|
+
readonly autoSync?: boolean;
|
|
51
|
+
readonly wakeJitterMs?: number;
|
|
52
|
+
/** Default: Web Locks when available, else single-owner. */
|
|
53
|
+
readonly leaderLock?: LeaderLock;
|
|
54
|
+
readonly lockName?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Multi-tab followers (TODO 3.2). When true, a tab that loses the leader
|
|
57
|
+
* election becomes a FOLLOWER that proxies to the leader over a
|
|
58
|
+
* BroadcastChannel, and contests + promotes when the leader closes. When
|
|
59
|
+
* false (default), the loser is a dead `isLeader === false` handle.
|
|
60
|
+
*/
|
|
61
|
+
readonly multiTab?: boolean;
|
|
62
|
+
/** Cross-tab channel factory (default `BroadcastChannel`); injectable for tests. */
|
|
63
|
+
readonly channelFactory?: (name: string) => CrossTabChannel;
|
|
64
|
+
/** Deadline for a follower call (covers the leader-handover gap). */
|
|
65
|
+
readonly followerCallTimeoutMs?: number;
|
|
66
|
+
/** Fires when this handle's role changes (follower → leader on promotion). */
|
|
67
|
+
readonly onRoleChange?: (role: HandleRole) => void;
|
|
68
|
+
readonly onSyncNeeded?: (reason: 'hello' | WakeReason) => void;
|
|
69
|
+
readonly onConflict?: (conflict: ConflictRecord) => void;
|
|
70
|
+
/** A worker-side autoSync round finished (or failed). */
|
|
71
|
+
readonly onSynced?: (result: {
|
|
72
|
+
readonly summary?: SyncSummary;
|
|
73
|
+
readonly error?: WorkerErrorShape;
|
|
74
|
+
}) => void;
|
|
75
|
+
/** §7.4.5: schema-bump `upgrading` state changed (reset began/completed). */
|
|
76
|
+
readonly onUpgrading?: (upgrading: boolean) => void;
|
|
77
|
+
/** §8.6: presence on a scope key changed. */
|
|
78
|
+
readonly onPresence?: (scopeKey: string) => void;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* A running worker core owned by THIS tab (the leader). Wraps the worker,
|
|
82
|
+
* the RPC pending map, and (in multi-tab mode) the `LeaderBridge` relaying
|
|
83
|
+
* follower requests. Torn down on `close()` or on a graceful demotion.
|
|
84
|
+
*/
|
|
85
|
+
interface LeaderCore {
|
|
86
|
+
readonly clientId: string;
|
|
87
|
+
readonly invoke: (method: string, args: readonly unknown[]) => Promise<unknown>;
|
|
88
|
+
readonly bridge: LeaderBridge | undefined;
|
|
89
|
+
readonly lease: LeaderLease;
|
|
90
|
+
close(terminate: boolean): Promise<void>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The main-thread proxy: the same logical API as `SyncClient`, every method a
|
|
94
|
+
* promise. `role` is `'leader'` (owns the worker) or `'follower'` (proxies to
|
|
95
|
+
* the leader over the channel). Constructed via {@link createSyncClientHandle}.
|
|
96
|
+
*/
|
|
97
|
+
export declare class SyncClientHandle {
|
|
98
|
+
#private;
|
|
99
|
+
/** True only for a leader handle. Kept for the pre-multiTab contract. */
|
|
100
|
+
get isLeader(): boolean;
|
|
101
|
+
get role(): HandleRole;
|
|
102
|
+
/** Resolved client id — the leader's; shared by all tabs on this origin. */
|
|
103
|
+
get clientId(): string;
|
|
104
|
+
/** @internal — use {@link createSyncClientHandle}. */
|
|
105
|
+
constructor(internals: {
|
|
106
|
+
role: HandleRole;
|
|
107
|
+
clientId: string;
|
|
108
|
+
core?: LeaderCore;
|
|
109
|
+
follower?: FollowerLink;
|
|
110
|
+
invalidation: InvalidationEmitter;
|
|
111
|
+
presence: Set<(scopeKey: string) => void>;
|
|
112
|
+
roleListeners?: Set<(role: HandleRole) => void>;
|
|
113
|
+
});
|
|
114
|
+
/** @internal — swap this handle from follower to leader (promotion). */
|
|
115
|
+
__becomeLeader(core: LeaderCore): void;
|
|
116
|
+
/** @internal — dispatch a worker/relayed event to handle-local listeners. */
|
|
117
|
+
__dispatchEvent(event: SyncWorkerEvent): void;
|
|
118
|
+
/**
|
|
119
|
+
* TODO 3.1 / I1: subscribe to fine-grained invalidation — the identical
|
|
120
|
+
* surface as `SyncClient.onInvalidate`, so React bindings target one
|
|
121
|
+
* interface across direct, worker-leader, and follower modes. Returns an
|
|
122
|
+
* unsubscribe function.
|
|
123
|
+
*/
|
|
124
|
+
onInvalidate(listener: InvalidationListener): () => void;
|
|
125
|
+
/**
|
|
126
|
+
* §8.6: subscribe to presence changes — the identical surface as
|
|
127
|
+
* `SyncClient.onPresence`. Returns an unsubscribe function.
|
|
128
|
+
*/
|
|
129
|
+
onPresence(listener: (scopeKey: string) => void): () => void;
|
|
130
|
+
/** Subscribe to role transitions (follower → leader on promotion). */
|
|
131
|
+
onRoleChange(listener: (role: HandleRole) => void): () => void;
|
|
132
|
+
subscribe(input: SubscribeInput): Promise<void>;
|
|
133
|
+
unsubscribe(id: string): Promise<void>;
|
|
134
|
+
setWindow(base: WindowBase, units: readonly string[]): Promise<void>;
|
|
135
|
+
windowState(base: WindowBase): Promise<WindowState>;
|
|
136
|
+
mutate(mutations: readonly MutationInput[]): Promise<string>;
|
|
137
|
+
sync(): Promise<SyncSummary>;
|
|
138
|
+
syncUntilIdle(maxRounds?: number): Promise<SyncSummary>;
|
|
139
|
+
query(sql: string, params?: readonly SqlValue[]): Promise<SqlRow[]>;
|
|
140
|
+
conflicts(): Promise<readonly ConflictRecord[]>;
|
|
141
|
+
rejections(): Promise<readonly RejectionRecord[]>;
|
|
142
|
+
schemaFloor(): Promise<SchemaFloor | undefined>;
|
|
143
|
+
leaseState(): Promise<LeaseState | undefined>;
|
|
144
|
+
/** §7.4.5: true while a schema-bump reset + first re-bootstrap runs. */
|
|
145
|
+
upgrading(): Promise<boolean>;
|
|
146
|
+
syncNeeded(): Promise<boolean>;
|
|
147
|
+
pendingCommits(): Promise<OutboxCommit[]>;
|
|
148
|
+
subscriptions(): Promise<SubscriptionRecord[]>;
|
|
149
|
+
subscription(id: string): Promise<SubscriptionRecord | undefined>;
|
|
150
|
+
connectRealtime(): Promise<void>;
|
|
151
|
+
disconnectRealtime(): Promise<void>;
|
|
152
|
+
/** §8.6: publish/clear a scope-keyed presence document. */
|
|
153
|
+
setPresence(scopeKey: string, doc: Record<string, unknown> | null): Promise<void>;
|
|
154
|
+
/** §8.6: the peers currently present on a scope key. */
|
|
155
|
+
presence(scopeKey: string): Promise<readonly PresencePeer[]>;
|
|
156
|
+
uploadBlob(bytes: Uint8Array, options?: {
|
|
157
|
+
readonly mediaType?: string;
|
|
158
|
+
readonly name?: string;
|
|
159
|
+
}): Promise<BlobRef>;
|
|
160
|
+
fetchBlob(blobIdOrRef: string): Promise<CachedBlob>;
|
|
161
|
+
/** Sever/restore transport + realtime inside the worker (demos). */
|
|
162
|
+
setOffline(offline: boolean): Promise<void>;
|
|
163
|
+
/** Close the core (leader) or unbind the link (follower), release leadership. */
|
|
164
|
+
close(): Promise<void>;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Acquire leadership, spawn the worker, initialize the core inside it.
|
|
168
|
+
*
|
|
169
|
+
* With `multiTab` off: a losing tab resolves to a dead not-leader handle.
|
|
170
|
+
* With `multiTab` on: a losing tab becomes a FOLLOWER proxying to the leader,
|
|
171
|
+
* and promotes itself if the leader later closes.
|
|
172
|
+
*/
|
|
173
|
+
export declare function createSyncClientHandle(config: SyncClientHandleConfig): Promise<SyncClientHandle>;
|
|
174
|
+
export {};
|