lakesync 0.1.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.
Files changed (69) hide show
  1. package/README.md +74 -0
  2. package/dist/adapter.d.ts +369 -0
  3. package/dist/adapter.js +39 -0
  4. package/dist/adapter.js.map +1 -0
  5. package/dist/analyst.d.ts +268 -0
  6. package/dist/analyst.js +495 -0
  7. package/dist/analyst.js.map +1 -0
  8. package/dist/auth-CAVutXzx.d.ts +30 -0
  9. package/dist/base-poller-Qo_SmCZs.d.ts +82 -0
  10. package/dist/catalogue.d.ts +65 -0
  11. package/dist/catalogue.js +17 -0
  12. package/dist/catalogue.js.map +1 -0
  13. package/dist/chunk-4ARO6KTJ.js +257 -0
  14. package/dist/chunk-4ARO6KTJ.js.map +1 -0
  15. package/dist/chunk-5YOFCJQ7.js +1115 -0
  16. package/dist/chunk-5YOFCJQ7.js.map +1 -0
  17. package/dist/chunk-7D4SUZUM.js +38 -0
  18. package/dist/chunk-7D4SUZUM.js.map +1 -0
  19. package/dist/chunk-BNJOGBYK.js +335 -0
  20. package/dist/chunk-BNJOGBYK.js.map +1 -0
  21. package/dist/chunk-ICNT7I3K.js +1180 -0
  22. package/dist/chunk-ICNT7I3K.js.map +1 -0
  23. package/dist/chunk-P5DRFKIT.js +413 -0
  24. package/dist/chunk-P5DRFKIT.js.map +1 -0
  25. package/dist/chunk-X3RO5SYJ.js +880 -0
  26. package/dist/chunk-X3RO5SYJ.js.map +1 -0
  27. package/dist/client.d.ts +428 -0
  28. package/dist/client.js +2048 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/compactor.d.ts +342 -0
  31. package/dist/compactor.js +793 -0
  32. package/dist/compactor.js.map +1 -0
  33. package/dist/coordinator-CxckTzYW.d.ts +396 -0
  34. package/dist/db-types-BR6Kt4uf.d.ts +29 -0
  35. package/dist/gateway-D5SaaMvT.d.ts +337 -0
  36. package/dist/gateway-server.d.ts +306 -0
  37. package/dist/gateway-server.js +4663 -0
  38. package/dist/gateway-server.js.map +1 -0
  39. package/dist/gateway.d.ts +196 -0
  40. package/dist/gateway.js +79 -0
  41. package/dist/gateway.js.map +1 -0
  42. package/dist/hlc-DiD8QNG3.d.ts +70 -0
  43. package/dist/index.d.ts +245 -0
  44. package/dist/index.js +102 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/json-dYtqiL0F.d.ts +18 -0
  47. package/dist/nessie-client-DrNikVXy.d.ts +160 -0
  48. package/dist/parquet.d.ts +78 -0
  49. package/dist/parquet.js +15 -0
  50. package/dist/parquet.js.map +1 -0
  51. package/dist/proto.d.ts +434 -0
  52. package/dist/proto.js +67 -0
  53. package/dist/proto.js.map +1 -0
  54. package/dist/react.d.ts +147 -0
  55. package/dist/react.js +224 -0
  56. package/dist/react.js.map +1 -0
  57. package/dist/resolver-C3Wphi6O.d.ts +10 -0
  58. package/dist/result-CojzlFE2.d.ts +64 -0
  59. package/dist/src-QU2YLPZY.js +383 -0
  60. package/dist/src-QU2YLPZY.js.map +1 -0
  61. package/dist/src-WYBF5LOI.js +102 -0
  62. package/dist/src-WYBF5LOI.js.map +1 -0
  63. package/dist/src-WZNPHANQ.js +426 -0
  64. package/dist/src-WZNPHANQ.js.map +1 -0
  65. package/dist/types-Bs-QyOe-.d.ts +143 -0
  66. package/dist/types-DAQL_vU_.d.ts +118 -0
  67. package/dist/types-DSC_EiwR.d.ts +45 -0
  68. package/dist/types-V_jVu2sA.d.ts +73 -0
  69. package/package.json +119 -0
package/dist/react.js ADDED
@@ -0,0 +1,224 @@
1
+ import "./chunk-7D4SUZUM.js";
2
+
3
+ // ../react/src/context.ts
4
+ import {
5
+ createContext,
6
+ createElement,
7
+ useCallback,
8
+ useContext,
9
+ useEffect,
10
+ useMemo,
11
+ useState
12
+ } from "react";
13
+ var LakeSyncContext = createContext(null);
14
+ function LakeSyncProvider(props) {
15
+ const { coordinator, children } = props;
16
+ const [dataVersion, setDataVersion] = useState(0);
17
+ const invalidate = useCallback(() => {
18
+ setDataVersion((v) => v + 1);
19
+ }, []);
20
+ useEffect(() => {
21
+ const handleChange = () => {
22
+ setDataVersion((v) => v + 1);
23
+ };
24
+ coordinator.on("onChange", handleChange);
25
+ return () => {
26
+ coordinator.off("onChange", handleChange);
27
+ };
28
+ }, [coordinator]);
29
+ const value = useMemo(
30
+ () => ({
31
+ coordinator,
32
+ tracker: coordinator.tracker,
33
+ dataVersion,
34
+ invalidate
35
+ }),
36
+ [coordinator, dataVersion, invalidate]
37
+ );
38
+ return createElement(LakeSyncContext.Provider, { value }, children);
39
+ }
40
+ function useLakeSync() {
41
+ const ctx = useContext(LakeSyncContext);
42
+ if (!ctx) {
43
+ throw new Error("useLakeSync must be used within a <LakeSyncProvider>");
44
+ }
45
+ return ctx;
46
+ }
47
+
48
+ // ../react/src/use-action.ts
49
+ import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
50
+ function useAction() {
51
+ const { coordinator } = useLakeSync();
52
+ const [lastResult, setLastResult] = useState2(null);
53
+ const [isPending, setIsPending] = useState2(false);
54
+ useEffect2(() => {
55
+ const handleComplete = (_actionId, result) => {
56
+ setLastResult(result);
57
+ setIsPending(false);
58
+ };
59
+ coordinator.on("onActionComplete", handleComplete);
60
+ return () => {
61
+ coordinator.off("onActionComplete", handleComplete);
62
+ };
63
+ }, [coordinator]);
64
+ const execute = useCallback2(
65
+ async (params) => {
66
+ setIsPending(true);
67
+ await coordinator.executeAction(params);
68
+ },
69
+ [coordinator]
70
+ );
71
+ return { execute, lastResult, isPending };
72
+ }
73
+ function useActionDiscovery() {
74
+ const { coordinator } = useLakeSync();
75
+ const [connectors, setConnectors] = useState2({});
76
+ const [isLoading, setIsLoading] = useState2(true);
77
+ const [error, setError] = useState2(null);
78
+ const [trigger, setTrigger] = useState2(0);
79
+ const refetch = useCallback2(() => {
80
+ setTrigger((v) => v + 1);
81
+ }, []);
82
+ useEffect2(() => {
83
+ void trigger;
84
+ let cancelled = false;
85
+ const run = async () => {
86
+ setIsLoading(true);
87
+ const result = await coordinator.describeActions();
88
+ if (cancelled) return;
89
+ if (result.ok) {
90
+ setConnectors(result.value.connectors);
91
+ setError(null);
92
+ } else {
93
+ setError(result.error);
94
+ }
95
+ setIsLoading(false);
96
+ };
97
+ run();
98
+ return () => {
99
+ cancelled = true;
100
+ };
101
+ }, [coordinator, trigger]);
102
+ return { connectors, isLoading, error, refetch };
103
+ }
104
+
105
+ // ../react/src/use-mutation.ts
106
+ import { useCallback as useCallback3 } from "react";
107
+ function useMutation() {
108
+ const { tracker, invalidate } = useLakeSync();
109
+ const insert = useCallback3(
110
+ async (table, rowId, data) => {
111
+ const result = await tracker.insert(table, rowId, data);
112
+ if (result.ok) invalidate();
113
+ return result;
114
+ },
115
+ [tracker, invalidate]
116
+ );
117
+ const update = useCallback3(
118
+ async (table, rowId, data) => {
119
+ const result = await tracker.update(table, rowId, data);
120
+ if (result.ok) invalidate();
121
+ return result;
122
+ },
123
+ [tracker, invalidate]
124
+ );
125
+ const remove = useCallback3(
126
+ async (table, rowId) => {
127
+ const result = await tracker.delete(table, rowId);
128
+ if (result.ok) invalidate();
129
+ return result;
130
+ },
131
+ [tracker, invalidate]
132
+ );
133
+ return { insert, update, remove };
134
+ }
135
+
136
+ // ../react/src/use-query.ts
137
+ import { useCallback as useCallback4, useEffect as useEffect3, useRef, useState as useState3 } from "react";
138
+ function useQuery(sql, params) {
139
+ const { tracker, dataVersion } = useLakeSync();
140
+ const [data, setData] = useState3([]);
141
+ const [error, setError] = useState3(null);
142
+ const [isLoading, setIsLoading] = useState3(true);
143
+ const [manualTrigger, setManualTrigger] = useState3(0);
144
+ const paramsKey = JSON.stringify(params ?? []);
145
+ const paramsRef = useRef(params);
146
+ paramsRef.current = params;
147
+ const refetch = useCallback4(() => {
148
+ setManualTrigger((v) => v + 1);
149
+ }, []);
150
+ const version = `${dataVersion}:${manualTrigger}:${paramsKey}`;
151
+ useEffect3(() => {
152
+ void version;
153
+ let cancelled = false;
154
+ const run = async () => {
155
+ const result = await tracker.query(sql, paramsRef.current);
156
+ if (cancelled) return;
157
+ if (result.ok) {
158
+ setData(result.value);
159
+ setError(null);
160
+ } else {
161
+ setError(result.error);
162
+ }
163
+ setIsLoading(false);
164
+ };
165
+ run();
166
+ return () => {
167
+ cancelled = true;
168
+ };
169
+ }, [tracker, sql, version]);
170
+ return { data, error, isLoading, refetch };
171
+ }
172
+
173
+ // ../react/src/use-sync-status.ts
174
+ import { useCallback as useCallback5, useEffect as useEffect4, useState as useState4 } from "react";
175
+ function useSyncStatus() {
176
+ const { coordinator, dataVersion } = useLakeSync();
177
+ const [isSyncing, setIsSyncing] = useState4(false);
178
+ const [lastSyncTime, setLastSyncTime] = useState4(null);
179
+ const [queueDepth, setQueueDepth] = useState4(0);
180
+ const [error, setError] = useState4(null);
181
+ const refreshQueueDepth = useCallback5(async () => {
182
+ const depth = await coordinator.queueDepth();
183
+ setQueueDepth(depth);
184
+ }, [coordinator]);
185
+ useEffect4(() => {
186
+ const handleSyncComplete = () => {
187
+ setIsSyncing(false);
188
+ setLastSyncTime(coordinator.lastSyncTime);
189
+ setError(null);
190
+ refreshQueueDepth();
191
+ };
192
+ const handleError = (err) => {
193
+ setIsSyncing(false);
194
+ setError(err);
195
+ };
196
+ const handleChange = () => {
197
+ refreshQueueDepth();
198
+ };
199
+ coordinator.on("onSyncComplete", handleSyncComplete);
200
+ coordinator.on("onError", handleError);
201
+ coordinator.on("onChange", handleChange);
202
+ refreshQueueDepth();
203
+ return () => {
204
+ coordinator.off("onSyncComplete", handleSyncComplete);
205
+ coordinator.off("onError", handleError);
206
+ coordinator.off("onChange", handleChange);
207
+ };
208
+ }, [coordinator, refreshQueueDepth]);
209
+ useEffect4(() => {
210
+ void dataVersion;
211
+ refreshQueueDepth();
212
+ }, [dataVersion, refreshQueueDepth]);
213
+ return { isSyncing, lastSyncTime, queueDepth, error };
214
+ }
215
+ export {
216
+ LakeSyncProvider,
217
+ useAction,
218
+ useActionDiscovery,
219
+ useLakeSync,
220
+ useMutation,
221
+ useQuery,
222
+ useSyncStatus
223
+ };
224
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../react/src/context.ts","../../react/src/use-action.ts","../../react/src/use-mutation.ts","../../react/src/use-query.ts","../../react/src/use-sync-status.ts"],"sourcesContent":["import type { SyncCoordinator, SyncTracker } from \"@lakesync/client\";\nimport {\n\tcreateContext,\n\tcreateElement,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n} from \"react\";\n\n/** Internal context value shared across all hooks. */\nexport interface LakeSyncContextValue {\n\tcoordinator: SyncCoordinator;\n\ttracker: SyncTracker;\n\t/** Monotonically increasing counter — bumped on every data change. */\n\tdataVersion: number;\n\t/** Increment dataVersion to trigger query re-runs. */\n\tinvalidate: () => void;\n}\n\nconst LakeSyncContext = createContext<LakeSyncContextValue | null>(null);\n\n/** Props for the LakeSyncProvider component. */\nexport interface LakeSyncProviderProps {\n\t/** An already-constructed SyncCoordinator instance. */\n\tcoordinator: SyncCoordinator;\n\tchildren: React.ReactNode;\n}\n\n/**\n * Provides LakeSync context to the component tree.\n *\n * Subscribes to `onChange` events from the coordinator and maintains a\n * `dataVersion` counter that increments on every remote delta application,\n * triggering reactive query re-runs in `useQuery`.\n */\nexport function LakeSyncProvider(props: LakeSyncProviderProps) {\n\tconst { coordinator, children } = props;\n\tconst [dataVersion, setDataVersion] = useState(0);\n\n\tconst invalidate = useCallback(() => {\n\t\tsetDataVersion((v) => v + 1);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst handleChange = () => {\n\t\t\tsetDataVersion((v) => v + 1);\n\t\t};\n\t\tcoordinator.on(\"onChange\", handleChange);\n\t\treturn () => {\n\t\t\tcoordinator.off(\"onChange\", handleChange);\n\t\t};\n\t}, [coordinator]);\n\n\tconst value = useMemo<LakeSyncContextValue>(\n\t\t() => ({\n\t\t\tcoordinator,\n\t\t\ttracker: coordinator.tracker,\n\t\t\tdataVersion,\n\t\t\tinvalidate,\n\t\t}),\n\t\t[coordinator, dataVersion, invalidate],\n\t);\n\n\treturn createElement(LakeSyncContext.Provider, { value }, children);\n}\n\n/**\n * Access the raw LakeSync SDK instances from context.\n *\n * @throws if called outside a `<LakeSyncProvider>`.\n */\nexport function useLakeSync(): LakeSyncContextValue {\n\tconst ctx = useContext(LakeSyncContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useLakeSync must be used within a <LakeSyncProvider>\");\n\t}\n\treturn ctx;\n}\n","import type {\n\tActionDescriptor,\n\tActionErrorResult,\n\tActionResult,\n\tLakeSyncError,\n} from \"@lakesync/core\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useLakeSync } from \"./context\";\n\n/** Parameters for a single action execution. */\nexport interface ActionParams {\n\tconnector: string;\n\tactionType: string;\n\tparams: Record<string, unknown>;\n\tidempotencyKey?: string;\n}\n\n/** Return type of `useAction`. */\nexport interface UseActionResult {\n\t/** Execute an action against a connector via the gateway. */\n\texecute: (params: ActionParams) => Promise<void>;\n\t/** Last action result (success or error). Null before first execution. */\n\tlastResult: ActionResult | ActionErrorResult | null;\n\t/** Whether an action is currently in flight. */\n\tisPending: boolean;\n}\n\n/**\n * Execute imperative actions against external systems via the gateway.\n *\n * Wraps `SyncCoordinator.executeAction()` and subscribes to\n * `onActionComplete` events to track the latest result.\n *\n * ```ts\n * const { execute, lastResult, isPending } = useAction();\n *\n * await execute({\n * connector: \"slack\",\n * actionType: \"send_message\",\n * params: { channel: \"#general\", text: \"Hello\" },\n * });\n * ```\n */\nexport function useAction(): UseActionResult {\n\tconst { coordinator } = useLakeSync();\n\tconst [lastResult, setLastResult] = useState<ActionResult | ActionErrorResult | null>(null);\n\tconst [isPending, setIsPending] = useState(false);\n\n\tuseEffect(() => {\n\t\tconst handleComplete = (_actionId: string, result: ActionResult | ActionErrorResult) => {\n\t\t\tsetLastResult(result);\n\t\t\tsetIsPending(false);\n\t\t};\n\n\t\tcoordinator.on(\"onActionComplete\", handleComplete);\n\t\treturn () => {\n\t\t\tcoordinator.off(\"onActionComplete\", handleComplete);\n\t\t};\n\t}, [coordinator]);\n\n\tconst execute = useCallback(\n\t\tasync (params: ActionParams): Promise<void> => {\n\t\t\tsetIsPending(true);\n\t\t\tawait coordinator.executeAction(params);\n\t\t},\n\t\t[coordinator],\n\t);\n\n\treturn { execute, lastResult, isPending };\n}\n\n/** Return type of `useActionDiscovery`. */\nexport interface UseActionDiscoveryResult {\n\t/** Map of connector name to supported action descriptors. */\n\tconnectors: Record<string, ActionDescriptor[]>;\n\t/** Whether discovery is loading. */\n\tisLoading: boolean;\n\t/** Error from the last fetch, or null. */\n\terror: LakeSyncError | null;\n\t/** Manually re-fetch available actions. */\n\trefetch: () => void;\n}\n\n/**\n * Discover available connectors and their supported action types.\n *\n * Calls `transport.describeActions()` on mount and returns the result\n * reactively. Use this to build dynamic UI based on available actions.\n *\n * ```ts\n * const { connectors, isLoading } = useActionDiscovery();\n *\n * for (const [name, actions] of Object.entries(connectors)) {\n * console.log(name, actions.map(a => a.actionType));\n * }\n * ```\n */\nexport function useActionDiscovery(): UseActionDiscoveryResult {\n\tconst { coordinator } = useLakeSync();\n\tconst [connectors, setConnectors] = useState<Record<string, ActionDescriptor[]>>({});\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [error, setError] = useState<LakeSyncError | null>(null);\n\tconst [trigger, setTrigger] = useState(0);\n\n\tconst refetch = useCallback(() => {\n\t\tsetTrigger((v) => v + 1);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tvoid trigger;\n\t\tlet cancelled = false;\n\n\t\tconst run = async () => {\n\t\t\tsetIsLoading(true);\n\t\t\tconst result = await coordinator.describeActions();\n\t\t\tif (cancelled) return;\n\n\t\t\tif (result.ok) {\n\t\t\t\tsetConnectors(result.value.connectors);\n\t\t\t\tsetError(null);\n\t\t\t} else {\n\t\t\t\tsetError(result.error);\n\t\t\t}\n\t\t\tsetIsLoading(false);\n\t\t};\n\n\t\trun();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [coordinator, trigger]);\n\n\treturn { connectors, isLoading, error, refetch };\n}\n","import type { LakeSyncError, Result } from \"@lakesync/core\";\nimport { useCallback } from \"react\";\nimport { useLakeSync } from \"./context\";\n\n/** Return type of `useMutation`. */\nexport interface UseMutationResult {\n\tinsert: (\n\t\ttable: string,\n\t\trowId: string,\n\t\tdata: Record<string, unknown>,\n\t) => Promise<Result<void, LakeSyncError>>;\n\tupdate: (\n\t\ttable: string,\n\t\trowId: string,\n\t\tdata: Record<string, unknown>,\n\t) => Promise<Result<void, LakeSyncError>>;\n\tremove: (table: string, rowId: string) => Promise<Result<void, LakeSyncError>>;\n}\n\n/**\n * Wraps SyncTracker mutations with automatic query invalidation.\n *\n * After each successful mutation, `dataVersion` is incremented so all\n * active `useQuery` hooks re-run.\n */\nexport function useMutation(): UseMutationResult {\n\tconst { tracker, invalidate } = useLakeSync();\n\n\tconst insert = useCallback(\n\t\tasync (\n\t\t\ttable: string,\n\t\t\trowId: string,\n\t\t\tdata: Record<string, unknown>,\n\t\t): Promise<Result<void, LakeSyncError>> => {\n\t\t\tconst result = await tracker.insert(table, rowId, data);\n\t\t\tif (result.ok) invalidate();\n\t\t\treturn result;\n\t\t},\n\t\t[tracker, invalidate],\n\t);\n\n\tconst update = useCallback(\n\t\tasync (\n\t\t\ttable: string,\n\t\t\trowId: string,\n\t\t\tdata: Record<string, unknown>,\n\t\t): Promise<Result<void, LakeSyncError>> => {\n\t\t\tconst result = await tracker.update(table, rowId, data);\n\t\t\tif (result.ok) invalidate();\n\t\t\treturn result;\n\t\t},\n\t\t[tracker, invalidate],\n\t);\n\n\tconst remove = useCallback(\n\t\tasync (table: string, rowId: string): Promise<Result<void, LakeSyncError>> => {\n\t\t\tconst result = await tracker.delete(table, rowId);\n\t\t\tif (result.ok) invalidate();\n\t\t\treturn result;\n\t\t},\n\t\t[tracker, invalidate],\n\t);\n\n\treturn { insert, update, remove };\n}\n","import type { DbError } from \"@lakesync/client\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLakeSync } from \"./context\";\n\n/** Return type of `useQuery`. */\nexport interface UseQueryResult<T> {\n\tdata: T[];\n\terror: DbError | null;\n\tisLoading: boolean;\n\trefetch: () => void;\n}\n\n/**\n * Reactive SQL query hook.\n *\n * Re-runs automatically when:\n * - Remote deltas are applied (via `onChange`)\n * - A local mutation completes (via `invalidate()`)\n * - The `sql` or `params` arguments change\n *\n * @param sql - SQL query string\n * @param params - Optional bind parameters\n */\nexport function useQuery<T>(sql: string, params?: unknown[]): UseQueryResult<T> {\n\tconst { tracker, dataVersion } = useLakeSync();\n\tconst [data, setData] = useState<T[]>([]);\n\tconst [error, setError] = useState<DbError | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [manualTrigger, setManualTrigger] = useState(0);\n\n\t// Stable serialisation of params for dependency comparison\n\tconst paramsKey = JSON.stringify(params ?? []);\n\tconst paramsRef = useRef(params);\n\tparamsRef.current = params;\n\n\tconst refetch = useCallback(() => {\n\t\tsetManualTrigger((v) => v + 1);\n\t}, []);\n\n\t// Combine all trigger values into a single version for the effect.\n\t// This satisfies exhaustive-deps: the effect reads `version` directly.\n\tconst version = `${dataVersion}:${manualTrigger}:${paramsKey}`;\n\n\tuseEffect(() => {\n\t\t// Read version to establish dependency\n\t\tvoid version;\n\t\tlet cancelled = false;\n\n\t\tconst run = async () => {\n\t\t\tconst result = await tracker.query<T>(sql, paramsRef.current);\n\t\t\tif (cancelled) return;\n\n\t\t\tif (result.ok) {\n\t\t\t\tsetData(result.value);\n\t\t\t\tsetError(null);\n\t\t\t} else {\n\t\t\t\tsetError(result.error);\n\t\t\t}\n\t\t\tsetIsLoading(false);\n\t\t};\n\n\t\trun();\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t};\n\t}, [tracker, sql, version]);\n\n\treturn { data, error, isLoading, refetch };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useLakeSync } from \"./context\";\n\n/** Return type of `useSyncStatus`. */\nexport interface UseSyncStatusResult {\n\tisSyncing: boolean;\n\tlastSyncTime: Date | null;\n\tqueueDepth: number;\n\terror: Error | null;\n}\n\n/**\n * Observe the sync lifecycle.\n *\n * Tracks whether a sync is in progress, last successful sync time,\n * outbox queue depth, and the most recent sync error (cleared on success).\n */\nexport function useSyncStatus(): UseSyncStatusResult {\n\tconst { coordinator, dataVersion } = useLakeSync();\n\tconst [isSyncing, setIsSyncing] = useState(false);\n\tconst [lastSyncTime, setLastSyncTime] = useState<Date | null>(null);\n\tconst [queueDepth, setQueueDepth] = useState(0);\n\tconst [error, setError] = useState<Error | null>(null);\n\n\tconst refreshQueueDepth = useCallback(async () => {\n\t\tconst depth = await coordinator.queueDepth();\n\t\tsetQueueDepth(depth);\n\t}, [coordinator]);\n\n\tuseEffect(() => {\n\t\tconst handleSyncComplete = () => {\n\t\t\tsetIsSyncing(false);\n\t\t\tsetLastSyncTime(coordinator.lastSyncTime);\n\t\t\tsetError(null);\n\t\t\trefreshQueueDepth();\n\t\t};\n\n\t\tconst handleError = (err: Error) => {\n\t\t\tsetIsSyncing(false);\n\t\t\tsetError(err);\n\t\t};\n\n\t\tconst handleChange = () => {\n\t\t\trefreshQueueDepth();\n\t\t};\n\n\t\tcoordinator.on(\"onSyncComplete\", handleSyncComplete);\n\t\tcoordinator.on(\"onError\", handleError);\n\t\tcoordinator.on(\"onChange\", handleChange);\n\n\t\t// Initial queue depth\n\t\trefreshQueueDepth();\n\n\t\treturn () => {\n\t\t\tcoordinator.off(\"onSyncComplete\", handleSyncComplete);\n\t\t\tcoordinator.off(\"onError\", handleError);\n\t\t\tcoordinator.off(\"onChange\", handleChange);\n\t\t};\n\t}, [coordinator, refreshQueueDepth]);\n\n\t// Also refresh queue depth when dataVersion changes (local mutations)\n\tuseEffect(() => {\n\t\tvoid dataVersion;\n\t\trefreshQueueDepth();\n\t}, [dataVersion, refreshQueueDepth]);\n\n\treturn { isSyncing, lastSyncTime, queueDepth, error };\n}\n"],"mappings":";;;AACA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAYP,IAAM,kBAAkB,cAA2C,IAAI;AAgBhE,SAAS,iBAAiB,OAA8B;AAC9D,QAAM,EAAE,aAAa,SAAS,IAAI;AAClC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAEhD,QAAM,aAAa,YAAY,MAAM;AACpC,mBAAe,CAAC,MAAM,IAAI,CAAC;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACf,UAAM,eAAe,MAAM;AAC1B,qBAAe,CAAC,MAAM,IAAI,CAAC;AAAA,IAC5B;AACA,gBAAY,GAAG,YAAY,YAAY;AACvC,WAAO,MAAM;AACZ,kBAAY,IAAI,YAAY,YAAY;AAAA,IACzC;AAAA,EACD,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,QAAQ;AAAA,IACb,OAAO;AAAA,MACN;AAAA,MACA,SAAS,YAAY;AAAA,MACrB;AAAA,MACA;AAAA,IACD;AAAA,IACA,CAAC,aAAa,aAAa,UAAU;AAAA,EACtC;AAEA,SAAO,cAAc,gBAAgB,UAAU,EAAE,MAAM,GAAG,QAAQ;AACnE;AAOO,SAAS,cAAoC;AACnD,QAAM,MAAM,WAAW,eAAe;AACtC,MAAI,CAAC,KAAK;AACT,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACvE;AACA,SAAO;AACR;;;ACzEA,SAAS,eAAAA,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAqC1C,SAAS,YAA6B;AAC5C,QAAM,EAAE,YAAY,IAAI,YAAY;AACpC,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAkD,IAAI;AAC1F,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAEhD,EAAAC,WAAU,MAAM;AACf,UAAM,iBAAiB,CAAC,WAAmB,WAA6C;AACvF,oBAAc,MAAM;AACpB,mBAAa,KAAK;AAAA,IACnB;AAEA,gBAAY,GAAG,oBAAoB,cAAc;AACjD,WAAO,MAAM;AACZ,kBAAY,IAAI,oBAAoB,cAAc;AAAA,IACnD;AAAA,EACD,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,UAAUC;AAAA,IACf,OAAO,WAAwC;AAC9C,mBAAa,IAAI;AACjB,YAAM,YAAY,cAAc,MAAM;AAAA,IACvC;AAAA,IACA,CAAC,WAAW;AAAA,EACb;AAEA,SAAO,EAAE,SAAS,YAAY,UAAU;AACzC;AA4BO,SAAS,qBAA+C;AAC9D,QAAM,EAAE,YAAY,IAAI,YAAY;AACpC,QAAM,CAAC,YAAY,aAAa,IAAIF,UAA6C,CAAC,CAAC;AACnF,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAA+B,IAAI;AAC7D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,CAAC;AAExC,QAAM,UAAUE,aAAY,MAAM;AACjC,eAAW,CAAC,MAAM,IAAI,CAAC;AAAA,EACxB,GAAG,CAAC,CAAC;AAEL,EAAAD,WAAU,MAAM;AACf,SAAK;AACL,QAAI,YAAY;AAEhB,UAAM,MAAM,YAAY;AACvB,mBAAa,IAAI;AACjB,YAAM,SAAS,MAAM,YAAY,gBAAgB;AACjD,UAAI,UAAW;AAEf,UAAI,OAAO,IAAI;AACd,sBAAc,OAAO,MAAM,UAAU;AACrC,iBAAS,IAAI;AAAA,MACd,OAAO;AACN,iBAAS,OAAO,KAAK;AAAA,MACtB;AACA,mBAAa,KAAK;AAAA,IACnB;AAEA,QAAI;AAEJ,WAAO,MAAM;AACZ,kBAAY;AAAA,IACb;AAAA,EACD,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,SAAO,EAAE,YAAY,WAAW,OAAO,QAAQ;AAChD;;;ACrIA,SAAS,eAAAE,oBAAmB;AAwBrB,SAAS,cAAiC;AAChD,QAAM,EAAE,SAAS,WAAW,IAAI,YAAY;AAE5C,QAAM,SAASC;AAAA,IACd,OACC,OACA,OACA,SAC0C;AAC1C,YAAM,SAAS,MAAM,QAAQ,OAAO,OAAO,OAAO,IAAI;AACtD,UAAI,OAAO,GAAI,YAAW;AAC1B,aAAO;AAAA,IACR;AAAA,IACA,CAAC,SAAS,UAAU;AAAA,EACrB;AAEA,QAAM,SAASA;AAAA,IACd,OACC,OACA,OACA,SAC0C;AAC1C,YAAM,SAAS,MAAM,QAAQ,OAAO,OAAO,OAAO,IAAI;AACtD,UAAI,OAAO,GAAI,YAAW;AAC1B,aAAO;AAAA,IACR;AAAA,IACA,CAAC,SAAS,UAAU;AAAA,EACrB;AAEA,QAAM,SAASA;AAAA,IACd,OAAO,OAAe,UAAwD;AAC7E,YAAM,SAAS,MAAM,QAAQ,OAAO,OAAO,KAAK;AAChD,UAAI,OAAO,GAAI,YAAW;AAC1B,aAAO;AAAA,IACR;AAAA,IACA,CAAC,SAAS,UAAU;AAAA,EACrB;AAEA,SAAO,EAAE,QAAQ,QAAQ,OAAO;AACjC;;;AC/DA,SAAS,eAAAC,cAAa,aAAAC,YAAW,QAAQ,YAAAC,iBAAgB;AAsBlD,SAAS,SAAY,KAAa,QAAuC;AAC/E,QAAM,EAAE,SAAS,YAAY,IAAI,YAAY;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAc,CAAC,CAAC;AACxC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAyB,IAAI;AACvD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,CAAC;AAGpD,QAAM,YAAY,KAAK,UAAU,UAAU,CAAC,CAAC;AAC7C,QAAM,YAAY,OAAO,MAAM;AAC/B,YAAU,UAAU;AAEpB,QAAM,UAAUC,aAAY,MAAM;AACjC,qBAAiB,CAAC,MAAM,IAAI,CAAC;AAAA,EAC9B,GAAG,CAAC,CAAC;AAIL,QAAM,UAAU,GAAG,WAAW,IAAI,aAAa,IAAI,SAAS;AAE5D,EAAAC,WAAU,MAAM;AAEf,SAAK;AACL,QAAI,YAAY;AAEhB,UAAM,MAAM,YAAY;AACvB,YAAM,SAAS,MAAM,QAAQ,MAAS,KAAK,UAAU,OAAO;AAC5D,UAAI,UAAW;AAEf,UAAI,OAAO,IAAI;AACd,gBAAQ,OAAO,KAAK;AACpB,iBAAS,IAAI;AAAA,MACd,OAAO;AACN,iBAAS,OAAO,KAAK;AAAA,MACtB;AACA,mBAAa,KAAK;AAAA,IACnB;AAEA,QAAI;AAEJ,WAAO,MAAM;AACZ,kBAAY;AAAA,IACb;AAAA,EACD,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC;AAE1B,SAAO,EAAE,MAAM,OAAO,WAAW,QAAQ;AAC1C;;;ACrEA,SAAS,eAAAC,cAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAiB1C,SAAS,gBAAqC;AACpD,QAAM,EAAE,aAAa,YAAY,IAAI,YAAY;AACjD,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,KAAK;AAChD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAsB,IAAI;AAClE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,CAAC;AAC9C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AAErD,QAAM,oBAAoBC,aAAY,YAAY;AACjD,UAAM,QAAQ,MAAM,YAAY,WAAW;AAC3C,kBAAc,KAAK;AAAA,EACpB,GAAG,CAAC,WAAW,CAAC;AAEhB,EAAAC,WAAU,MAAM;AACf,UAAM,qBAAqB,MAAM;AAChC,mBAAa,KAAK;AAClB,sBAAgB,YAAY,YAAY;AACxC,eAAS,IAAI;AACb,wBAAkB;AAAA,IACnB;AAEA,UAAM,cAAc,CAAC,QAAe;AACnC,mBAAa,KAAK;AAClB,eAAS,GAAG;AAAA,IACb;AAEA,UAAM,eAAe,MAAM;AAC1B,wBAAkB;AAAA,IACnB;AAEA,gBAAY,GAAG,kBAAkB,kBAAkB;AACnD,gBAAY,GAAG,WAAW,WAAW;AACrC,gBAAY,GAAG,YAAY,YAAY;AAGvC,sBAAkB;AAElB,WAAO,MAAM;AACZ,kBAAY,IAAI,kBAAkB,kBAAkB;AACpD,kBAAY,IAAI,WAAW,WAAW;AACtC,kBAAY,IAAI,YAAY,YAAY;AAAA,IACzC;AAAA,EACD,GAAG,CAAC,aAAa,iBAAiB,CAAC;AAGnC,EAAAA,WAAU,MAAM;AACf,SAAK;AACL,sBAAkB;AAAA,EACnB,GAAG,CAAC,aAAa,iBAAiB,CAAC;AAEnC,SAAO,EAAE,WAAW,cAAc,YAAY,MAAM;AACrD;","names":["useCallback","useEffect","useState","useState","useEffect","useCallback","useCallback","useCallback","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useEffect","useState","useState","useCallback","useEffect"]}
@@ -0,0 +1,10 @@
1
+ import { R as RowDelta } from './types-V_jVu2sA.js';
2
+ import { R as Result, C as ConflictError } from './result-CojzlFE2.js';
3
+
4
+ /** Strategy for resolving conflicting row deltas */
5
+ interface ConflictResolver {
6
+ /** Resolve two conflicting deltas for the same row, returning the merged result */
7
+ resolve(local: RowDelta, remote: RowDelta): Result<RowDelta, ConflictError>;
8
+ }
9
+
10
+ export type { ConflictResolver as C };
@@ -0,0 +1,64 @@
1
+ /** Base error class for all LakeSync errors */
2
+ declare class LakeSyncError extends Error {
3
+ readonly code: string;
4
+ readonly cause?: Error;
5
+ constructor(message: string, code: string, cause?: Error);
6
+ }
7
+ /** Clock drift exceeds maximum allowed threshold */
8
+ declare class ClockDriftError extends LakeSyncError {
9
+ constructor(message: string, cause?: Error);
10
+ }
11
+ /** Conflict resolution failure */
12
+ declare class ConflictError extends LakeSyncError {
13
+ constructor(message: string, cause?: Error);
14
+ }
15
+ /** Flush operation failure */
16
+ declare class FlushError extends LakeSyncError {
17
+ constructor(message: string, cause?: Error);
18
+ }
19
+ /** Schema mismatch or validation failure */
20
+ declare class SchemaError extends LakeSyncError {
21
+ constructor(message: string, cause?: Error);
22
+ }
23
+ /** Lake adapter operation failure */
24
+ declare class AdapterError extends LakeSyncError {
25
+ constructor(message: string, cause?: Error);
26
+ }
27
+ /** Named source adapter not found in gateway configuration */
28
+ declare class AdapterNotFoundError extends LakeSyncError {
29
+ constructor(message: string, cause?: Error);
30
+ }
31
+ /** Buffer backpressure limit exceeded — push rejected to prevent OOM. */
32
+ declare class BackpressureError extends LakeSyncError {
33
+ constructor(message: string, cause?: Error);
34
+ }
35
+ /** Coerce an unknown thrown value into an Error instance. */
36
+ declare function toError(err: unknown): Error;
37
+
38
+ /** HLC timestamp: 64-bit value with [48-bit wall clock ms][16-bit logical counter] */
39
+ type HLCTimestamp = bigint & {
40
+ readonly __brand: "HLCTimestamp";
41
+ };
42
+
43
+ /** Discriminated union representing either success or failure */
44
+ type Result<T, E = LakeSyncError> = {
45
+ ok: true;
46
+ value: T;
47
+ } | {
48
+ ok: false;
49
+ error: E;
50
+ };
51
+ /** Create a successful Result */
52
+ declare function Ok<T>(value: T): Result<T, never>;
53
+ /** Create a failed Result */
54
+ declare function Err<E>(error: E): Result<never, E>;
55
+ /** Transform the success value of a Result */
56
+ declare function mapResult<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E>;
57
+ /** Chain Result-returning operations */
58
+ declare function flatMapResult<T, U, E>(result: Result<T, E>, fn: (value: T) => Result<U, E>): Result<U, E>;
59
+ /** Extract the value from a Result or throw the error */
60
+ declare function unwrapOrThrow<T, E>(result: Result<T, E>): T;
61
+ /** Wrap a Promise into a Result */
62
+ declare function fromPromise<T>(promise: Promise<T>): Promise<Result<T, Error>>;
63
+
64
+ export { AdapterError as A, BackpressureError as B, ConflictError as C, Err as E, FlushError as F, type HLCTimestamp as H, LakeSyncError as L, Ok as O, type Result as R, SchemaError as S, AdapterNotFoundError as a, ClockDriftError as b, fromPromise as c, flatMapResult as f, mapResult as m, toError as t, unwrapOrThrow as u };