@agelum/backend 0.1.1 → 0.1.3

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 (106) hide show
  1. package/README.md +33 -5
  2. package/dist/client/hooks.d.ts +65 -0
  3. package/dist/client/hooks.d.ts.map +1 -0
  4. package/dist/client/hooks.js +343 -0
  5. package/dist/client/hooks.js.map +1 -0
  6. package/dist/client/index.d.ts +10 -0
  7. package/dist/client/index.d.ts.map +1 -0
  8. package/dist/client/index.js +15 -0
  9. package/dist/client/index.js.map +1 -0
  10. package/dist/client/manager.d.ts +137 -0
  11. package/dist/client/manager.d.ts.map +1 -0
  12. package/dist/client/manager.js +287 -0
  13. package/dist/client/manager.js.map +1 -0
  14. package/dist/client/provider.d.ts +25 -0
  15. package/dist/client/provider.d.ts.map +1 -0
  16. package/dist/client/provider.js +84 -0
  17. package/dist/client/provider.js.map +1 -0
  18. package/dist/client/revalidation.d.ts +101 -0
  19. package/dist/client/revalidation.d.ts.map +1 -0
  20. package/dist/client/revalidation.js +308 -0
  21. package/dist/client/revalidation.js.map +1 -0
  22. package/dist/client/session.d.ts +84 -0
  23. package/dist/client/session.d.ts.map +1 -0
  24. package/dist/client/session.js +180 -0
  25. package/dist/client/session.js.map +1 -0
  26. package/dist/client/sse-client.d.ts +81 -0
  27. package/dist/client/sse-client.d.ts.map +1 -0
  28. package/dist/client/sse-client.js +217 -0
  29. package/dist/client/sse-client.js.map +1 -0
  30. package/dist/client/storage.d.ts +126 -0
  31. package/dist/client/storage.d.ts.map +1 -0
  32. package/dist/client/storage.js +489 -0
  33. package/dist/client/storage.js.map +1 -0
  34. package/dist/client/trpc.d.ts +12 -0
  35. package/dist/client/trpc.d.ts.map +1 -0
  36. package/dist/client/trpc.js +29 -0
  37. package/dist/client/trpc.js.map +1 -0
  38. package/dist/client/types.d.ts +10 -0
  39. package/dist/client/types.d.ts.map +1 -0
  40. package/dist/client/types.js +2 -0
  41. package/dist/client/types.js.map +1 -0
  42. package/dist/client.d.ts +12 -0
  43. package/dist/client.d.ts.map +1 -0
  44. package/dist/client.js +14 -0
  45. package/dist/client.js.map +1 -0
  46. package/dist/config/schema.d.ts +250 -0
  47. package/dist/config/schema.d.ts.map +1 -0
  48. package/dist/config/schema.js +66 -0
  49. package/dist/config/schema.js.map +1 -0
  50. package/dist/core/analyzer.d.ts +15 -0
  51. package/dist/core/analyzer.d.ts.map +1 -0
  52. package/dist/core/analyzer.js +212 -0
  53. package/dist/core/analyzer.js.map +1 -0
  54. package/dist/core/driver.d.ts +7 -0
  55. package/dist/core/driver.d.ts.map +1 -0
  56. package/dist/core/driver.js +259 -0
  57. package/dist/core/driver.js.map +1 -0
  58. package/dist/core/function.d.ts +103 -0
  59. package/dist/core/function.d.ts.map +1 -0
  60. package/dist/core/function.js +245 -0
  61. package/dist/core/function.js.map +1 -0
  62. package/dist/core/sse.d.ts +98 -0
  63. package/dist/core/sse.d.ts.map +1 -0
  64. package/dist/core/sse.js +323 -0
  65. package/dist/core/sse.js.map +1 -0
  66. package/dist/core/types.d.ts +196 -0
  67. package/dist/core/types.d.ts.map +1 -0
  68. package/dist/core/types.js +2 -0
  69. package/dist/core/types.js.map +1 -0
  70. package/dist/index.d.ts +40 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +41 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/providers/localStorage.d.ts +13 -0
  75. package/dist/providers/localStorage.d.ts.map +1 -0
  76. package/dist/providers/localStorage.js +66 -0
  77. package/dist/providers/localStorage.js.map +1 -0
  78. package/dist/providers/memory.d.ts +13 -0
  79. package/dist/providers/memory.d.ts.map +1 -0
  80. package/dist/providers/memory.js +36 -0
  81. package/dist/providers/memory.js.map +1 -0
  82. package/dist/providers/redis.d.ts +14 -0
  83. package/dist/providers/redis.d.ts.map +1 -0
  84. package/dist/providers/redis.js +32 -0
  85. package/dist/providers/redis.js.map +1 -0
  86. package/dist/server.d.ts +18 -0
  87. package/dist/server.d.ts.map +1 -0
  88. package/dist/server.js +19 -0
  89. package/dist/server.js.map +1 -0
  90. package/dist/trpc/hooks.d.ts +82 -0
  91. package/dist/trpc/hooks.d.ts.map +1 -0
  92. package/dist/trpc/hooks.js +276 -0
  93. package/dist/trpc/hooks.js.map +1 -0
  94. package/dist/trpc/index.d.ts +9 -0
  95. package/dist/trpc/index.d.ts.map +1 -0
  96. package/dist/trpc/index.js +9 -0
  97. package/dist/trpc/index.js.map +1 -0
  98. package/dist/trpc/router.d.ts +76 -0
  99. package/dist/trpc/router.d.ts.map +1 -0
  100. package/dist/trpc/router.js +171 -0
  101. package/dist/trpc/router.js.map +1 -0
  102. package/dist/trpc/types.d.ts +114 -0
  103. package/dist/trpc/types.d.ts.map +1 -0
  104. package/dist/trpc/types.js +5 -0
  105. package/dist/trpc/types.js.map +1 -0
  106. package/package.json +21 -10
package/README.md CHANGED
@@ -27,7 +27,7 @@ pnpm add @agelum/backend drizzle-orm @trpc/server @trpc/client zod
27
27
 
28
28
  ### 1. Define Reactive Functions
29
29
 
30
- **Key Concept**: Reactive functions work both standalone (server-side) AND via tRPC. The `name` property is crucial for cache keys and tRPC procedures. Use `db.db` to access the underlying Drizzle instance inside handlers.
30
+ **Key Concept**: Reactive functions work both standalone (server-side) AND via tRPC. The `name` property is crucial for cache keys and tRPC procedures. Handlers receive `{ input, db }` and you can use `db.db` to access the underlying Drizzle instance inside handlers.
31
31
 
32
32
  ```typescript
33
33
  // server/functions/users.ts
@@ -49,8 +49,8 @@ export const getUsers =
49
49
 
50
50
  dependencies: ["user"], // What tables this function reads from
51
51
 
52
- handler: async (input, db) => {
53
- // Clean signature: (input, db)
52
+ handler: async ({ input, db }) => {
53
+ // Clean signature: ({ input, db })
54
54
  return db.db.query.users.findMany(
55
55
  {
56
56
  where: (users, { eq }) =>
@@ -76,7 +76,7 @@ export const createUser =
76
76
 
77
77
  dependencies: ["user"],
78
78
 
79
- handler: async (input, db) => {
79
+ handler: async ({ input, db }) => {
80
80
  return db.db
81
81
  .insert(users)
82
82
  .values(input)
@@ -98,7 +98,7 @@ export const getUserProfile =
98
98
  "preferences",
99
99
  ],
100
100
 
101
- handler: async (input, db) => {
101
+ handler: async ({ input, db }) => {
102
102
  const user =
103
103
  await db.db.query.users.findFirst(
104
104
  {
@@ -118,6 +118,34 @@ export const getUserProfile =
118
118
  });
119
119
  ```
120
120
 
121
+ #### Typing Notes
122
+
123
+ If you want explicit handler typing, use `ReactiveFunctionContext<TInput>` with a Zod-inferred input type:
124
+
125
+ ```typescript
126
+ import type { ReactiveFunctionContext } from "@agelum/backend/server";
127
+ import { z } from "zod";
128
+
129
+ const getUsersInput = z.object({
130
+ companyId: z.string(),
131
+ limit: z.number().optional(),
132
+ });
133
+
134
+ type GetUsersInput = z.infer<typeof getUsersInput>;
135
+
136
+ export const getUsers = defineReactiveFunction({
137
+ name: "users.getAll",
138
+ input: getUsersInput,
139
+ dependencies: ["user"],
140
+ handler: async ({ input, db }: ReactiveFunctionContext<GetUsersInput>) => {
141
+ return db.db.query.users.findMany({
142
+ where: (users, { eq }) => eq(users.companyId, input.companyId),
143
+ limit: input.limit ?? 50,
144
+ });
145
+ },
146
+ });
147
+ ```
148
+
121
149
  ### 2. Server-Side Execution (Without tRPC)
122
150
 
123
151
  **Use Case**: Background jobs, API routes, server actions, webhooks, etc.
@@ -0,0 +1,65 @@
1
+ /**
2
+ * React hooks for @agelum/backend
3
+ * Provides reactive data access with automatic caching and real-time updates
4
+ */
5
+ import type { ReactiveConfig, InvalidationEvent } from "../core/types.js";
6
+ /**
7
+ * Initialize the reactive client
8
+ * Call this once at app startup
9
+ */
10
+ export declare function initializeReactiveClient(organizationId: string, config: ReactiveConfig, revalidateFn: (queryKey: string) => Promise<any>): void;
11
+ /**
12
+ * Main hook for reactive data access
13
+ * Automatically handles caching, real-time updates, and revalidation
14
+ */
15
+ export declare function useReactive<T = any>(queryKey: string, input?: any, options?: {
16
+ enabled?: boolean;
17
+ }): {
18
+ data: T | undefined;
19
+ isLoading: boolean;
20
+ isStale: boolean;
21
+ error: Error | null;
22
+ refetch: () => void;
23
+ };
24
+ /**
25
+ * Optional page-level priority hints for better UX
26
+ */
27
+ export declare function useReactivePriorities(priorities: string[]): void;
28
+ /**
29
+ * Hook to get current session statistics
30
+ */
31
+ export declare function useReactiveStats(): any;
32
+ /**
33
+ * Hook to manually trigger cache refresh
34
+ */
35
+ export declare function useReactiveRefresh(): () => Promise<void>;
36
+ /**
37
+ * Hook to get revalidation statistics and performance metrics
38
+ */
39
+ export declare function useRevalidationStats(): any;
40
+ /**
41
+ * Hook to handle invalidation events
42
+ */
43
+ export declare function useReactiveInvalidation(callback: (event: InvalidationEvent) => void): void;
44
+ /**
45
+ * Hook for manual queries with dynamic parameters
46
+ * Unlike useReactive, this hook doesn't auto-fetch and allows changing parameters on each call
47
+ */
48
+ export declare function useReactiveQuery<TData = unknown, TVariables = unknown>(queryKey: string): {
49
+ data: TData | undefined;
50
+ isLoading: boolean;
51
+ error: Error | null;
52
+ refetch: (variables?: TVariables) => Promise<TData>;
53
+ run: (variables: TVariables) => Promise<TData>;
54
+ };
55
+ /**
56
+ * Hook to get connection status
57
+ */
58
+ export declare function useReactiveConnection(): {
59
+ status: "connected" | "connecting" | "disconnected";
60
+ isConnected: boolean;
61
+ isConnecting: boolean;
62
+ isDisconnected: boolean;
63
+ reconnect: () => void;
64
+ };
65
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/client/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAkB1B;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,CACZ,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,GAAG,CAAC,GAChB,IAAI,CA0CN;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,GAAG,GAAG,EACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,GAAG,EACX,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACA;IACD,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAsNA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAAE,GACnB,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,QA2B/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,wBA0BjC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,QAwBnC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,CACR,KAAK,EAAE,iBAAiB,KACrB,IAAI,GACR,IAAI,CAgBN;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,GAAG,OAAO,EACf,UAAU,GAAG,OAAO,EAEpB,QAAQ,EAAE,MAAM,GACf;IACD,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,CACP,SAAS,CAAC,EAAE,UAAU,KACnB,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,GAAG,EAAE,CACH,SAAS,EAAE,UAAU,KAClB,OAAO,CAAC,KAAK,CAAC,CAAC;CACrB,CAyFA;AAED;;GAEG;AACH,wBAAgB,qBAAqB;;;;;;EAoCpC"}
@@ -0,0 +1,343 @@
1
+ /**
2
+ * React hooks for @agelum/backend
3
+ * Provides reactive data access with automatic caching and real-time updates
4
+ */
5
+ import { useEffect, useState, useCallback, useRef, } from "react";
6
+ import { createReactiveClientManager, } from "./manager.js";
7
+ // Global client manager instance
8
+ let globalClientManager = null;
9
+ /**
10
+ * Get or create the global client manager
11
+ */
12
+ function getClientManager() {
13
+ if (!globalClientManager) {
14
+ throw new Error("Reactive client not initialized. Call initializeReactiveClient first.");
15
+ }
16
+ return globalClientManager;
17
+ }
18
+ /**
19
+ * Initialize the reactive client
20
+ * Call this once at app startup
21
+ */
22
+ export function initializeReactiveClient(organizationId, config, revalidateFn) {
23
+ console.log("🚀 Initializing reactive client for org:", organizationId);
24
+ if (globalClientManager) {
25
+ console.log("⚠️ Client already initialized, cleaning up previous instance");
26
+ globalClientManager.cleanup();
27
+ }
28
+ globalClientManager =
29
+ createReactiveClientManager({
30
+ organizationId,
31
+ config,
32
+ onRevalidate: revalidateFn,
33
+ onInvalidation: (event) => {
34
+ console.log(`[ReactiveClient] Received invalidation for table: ${event.table}`);
35
+ },
36
+ });
37
+ // Expose client manager to window for testing purposes
38
+ if (typeof window !== "undefined") {
39
+ window.__reactiveClientManager =
40
+ globalClientManager;
41
+ console.log("🔧 [ReactiveClient] Client manager exposed to window for testing");
42
+ }
43
+ console.log("✅ Reactive client initialized successfully for org:", organizationId);
44
+ }
45
+ /**
46
+ * Main hook for reactive data access
47
+ * Automatically handles caching, real-time updates, and revalidation
48
+ */
49
+ export function useReactive(queryKey, input, options) {
50
+ const [data, setData] = useState(undefined);
51
+ const [isLoading, setIsLoading] = useState(true);
52
+ const [isStale, setIsStale] = useState(false);
53
+ const [error, setError] = useState(null);
54
+ const clientManager = getClientManager();
55
+ const isInitialMount = useRef(true);
56
+ // Handle enabled option
57
+ const enabled = options?.enabled !== false;
58
+ // Compose an effective cache key that includes serialized input
59
+ const inputKey = typeof input === "undefined"
60
+ ? ""
61
+ : `::${JSON.stringify(input)}`;
62
+ const effectiveKey = `${queryKey}${inputKey}`;
63
+ // Register this hook as active
64
+ useEffect(() => {
65
+ if (!enabled) {
66
+ return;
67
+ }
68
+ const cleanup = clientManager.registerActiveHook(effectiveKey, []);
69
+ return cleanup;
70
+ }, [
71
+ effectiveKey,
72
+ clientManager,
73
+ enabled,
74
+ ]);
75
+ // Load data on mount and when queryKey changes
76
+ useEffect(() => {
77
+ if (!enabled) {
78
+ setIsLoading(false);
79
+ return;
80
+ }
81
+ const loadData = async () => {
82
+ try {
83
+ setIsLoading(true);
84
+ setError(null);
85
+ // Check ReactiveStorage cache first (immediate display)
86
+ const cached = clientManager.getCachedData(effectiveKey);
87
+ // Reduced logging - only log cache misses
88
+ if (!cached) {
89
+ console.log(`🔍 [useReactive] Cache miss for ${queryKey}`);
90
+ }
91
+ if (cached) {
92
+ try {
93
+ const now = Date.now();
94
+ const cacheAge = now -
95
+ cached.lastRevalidated;
96
+ const minRevalidationTime = 5 * 60 * 1000; // 5 minutes minimum between revalidations
97
+ // Reduced logging - only log when cache is stale
98
+ if (cached.isStale) {
99
+ console.log(`📊 [useReactive] Cache is stale for ${queryKey}`);
100
+ }
101
+ // Show cached data immediately
102
+ setData(cached.data);
103
+ setIsStale(cached.isStale || false);
104
+ // Only revalidate if cache is old enough (avoid excessive revalidation)
105
+ if (cacheAge >
106
+ minRevalidationTime) {
107
+ console.log(`🔄 [useReactive] Revalidating stale cache for ${queryKey}`);
108
+ // Trigger revalidation in background
109
+ clientManager
110
+ .revalidateQuery(effectiveKey)
111
+ .then((result) => {
112
+ if (result !== undefined) {
113
+ setData(result);
114
+ setIsStale(false);
115
+ // Update ReactiveStorage with fresh data
116
+ clientManager.registerQuery(effectiveKey, [], result);
117
+ // Reduced logging - only log significant updates
118
+ }
119
+ })
120
+ .catch((error) => {
121
+ console.warn(`[useReactive] Background revalidation failed:`, error);
122
+ // Keep showing cached data even if revalidation fails
123
+ });
124
+ }
125
+ else {
126
+ // Reduced logging - only log when cache is stale
127
+ }
128
+ setIsLoading(false);
129
+ isInitialMount.current = false;
130
+ return;
131
+ }
132
+ catch (parseError) {
133
+ console.warn("⚠️ Failed to parse cached data:", parseError);
134
+ // Continue with revalidation if cache is corrupted
135
+ }
136
+ }
137
+ // No cache or corrupted cache - trigger immediate fetch
138
+ console.log(`[useReactive] No cache for ${queryKey}, fetching...`);
139
+ const result = await clientManager.revalidateQuery(effectiveKey);
140
+ if (result !== undefined) {
141
+ setData(result);
142
+ setIsStale(false);
143
+ // Store in ReactiveStorage for future use
144
+ clientManager.registerQuery(effectiveKey, [], result);
145
+ // Reduced logging - only log significant updates
146
+ }
147
+ setIsLoading(false);
148
+ isInitialMount.current = false;
149
+ }
150
+ catch (err) {
151
+ // On error, don't register cache; surface error and keep prior cache visible
152
+ setError(err);
153
+ setIsLoading(false);
154
+ isInitialMount.current = false;
155
+ }
156
+ };
157
+ loadData();
158
+ }, [effectiveKey, clientManager]);
159
+ const refetch = useCallback(async () => {
160
+ if (!enabled) {
161
+ return;
162
+ }
163
+ try {
164
+ setIsLoading(true);
165
+ setError(null);
166
+ // Reduced logging - only log when there are issues
167
+ // Trigger manual revalidation
168
+ await clientManager.revalidateQuery(effectiveKey);
169
+ // Update stale state
170
+ setIsStale(false);
171
+ setIsLoading(false);
172
+ }
173
+ catch (err) {
174
+ setError(err);
175
+ setIsLoading(false);
176
+ }
177
+ }, [
178
+ effectiveKey,
179
+ clientManager,
180
+ enabled,
181
+ ]);
182
+ return {
183
+ data,
184
+ isLoading,
185
+ isStale,
186
+ error,
187
+ refetch,
188
+ };
189
+ }
190
+ /**
191
+ * Optional page-level priority hints for better UX
192
+ */
193
+ export function useReactivePriorities(priorities) {
194
+ useEffect(() => {
195
+ // Reduced logging - only log when there are issues
196
+ // In a full implementation, this would:
197
+ // 1. Pre-warm cache for these queries
198
+ // 2. Subscribe to their invalidation events
199
+ // 3. Set higher revalidation priority
200
+ return () => {
201
+ // Reduced logging - only log when there are issues
202
+ };
203
+ }, [priorities.join(",")]);
204
+ }
205
+ /**
206
+ * Hook to get current session statistics
207
+ */
208
+ export function useReactiveStats() {
209
+ const [stats, setStats] = useState(null);
210
+ const clientManager = getClientManager();
211
+ useEffect(() => {
212
+ const updateStats = () => {
213
+ setStats(clientManager.getSessionStats());
214
+ };
215
+ // Update stats immediately
216
+ updateStats();
217
+ // Update stats every 5 seconds
218
+ const interval = setInterval(updateStats, 5000);
219
+ return () => clearInterval(interval);
220
+ }, [clientManager]);
221
+ return stats;
222
+ }
223
+ /**
224
+ * Hook to manually trigger cache refresh
225
+ */
226
+ export function useReactiveRefresh() {
227
+ const clientManager = getClientManager();
228
+ return useCallback(async () => {
229
+ // Trigger revalidation for all active queries
230
+ const activeHooks = clientManager.getStorageStats()
231
+ ?.queries || {};
232
+ const activeQueryKeys = Object.keys(activeHooks);
233
+ console.log(`[useReactiveRefresh] Refreshing ${activeQueryKeys.length} active queries`);
234
+ // Revalidate all active queries
235
+ await Promise.allSettled(activeQueryKeys.map((queryKey) => clientManager.revalidateQuery(queryKey)));
236
+ }, [clientManager]);
237
+ }
238
+ /**
239
+ * Hook to get revalidation statistics and performance metrics
240
+ */
241
+ export function useRevalidationStats() {
242
+ const [stats, setStats] = useState(null);
243
+ const clientManager = getClientManager();
244
+ useEffect(() => {
245
+ const updateStats = () => {
246
+ const revalidationStats = clientManager.getRevalidationStats();
247
+ setStats(revalidationStats);
248
+ };
249
+ updateStats();
250
+ const interval = setInterval(updateStats, 2000);
251
+ return () => clearInterval(interval);
252
+ }, [clientManager]);
253
+ return stats;
254
+ }
255
+ /**
256
+ * Hook to handle invalidation events
257
+ */
258
+ export function useReactiveInvalidation(callback) {
259
+ const clientManager = getClientManager();
260
+ useEffect(() => {
261
+ // In a full implementation, this would subscribe to invalidation events
262
+ console.log("[useReactiveInvalidation] Setting up invalidation listener");
263
+ return () => {
264
+ console.log("[useReactiveInvalidation] Cleaning up invalidation listener");
265
+ };
266
+ }, [callback, clientManager]);
267
+ }
268
+ /**
269
+ * Hook for manual queries with dynamic parameters
270
+ * Unlike useReactive, this hook doesn't auto-fetch and allows changing parameters on each call
271
+ */
272
+ export function useReactiveQuery(queryKey) {
273
+ const [data, setData] = useState(undefined);
274
+ const [error, setError] = useState(null);
275
+ const [isLoading, setIsLoading] = useState(false);
276
+ const [lastVariables, setLastVariables,] = useState(undefined);
277
+ const clientManager = getClientManager();
278
+ const executeQuery = useCallback(async (variables) => {
279
+ setIsLoading(true);
280
+ setError(null);
281
+ try {
282
+ console.log(`[useReactiveQuery] Executing ${queryKey}`, variables);
283
+ // Compose cache key with variables
284
+ const inputKey = typeof variables ===
285
+ "undefined"
286
+ ? ""
287
+ : `::${JSON.stringify(variables)}`;
288
+ const effectiveKey = `${queryKey}${inputKey}`;
289
+ // Execute the query through the client manager
290
+ const result = await clientManager.revalidateQuery(effectiveKey);
291
+ setData(result);
292
+ setLastVariables(variables);
293
+ console.log(`✅ [useReactiveQuery] ${queryKey} completed successfully`);
294
+ return result;
295
+ }
296
+ catch (err) {
297
+ const error = err;
298
+ setError(error);
299
+ console.error(`❌ [useReactiveQuery] ${queryKey} failed:`, error);
300
+ throw error;
301
+ }
302
+ finally {
303
+ setIsLoading(false);
304
+ }
305
+ }, [queryKey, clientManager]);
306
+ const refetch = useCallback(async (variables) => {
307
+ const varsToUse = variables || lastVariables;
308
+ if (!varsToUse) {
309
+ throw new Error("No variables provided for refetch and no previous variables stored");
310
+ }
311
+ return executeQuery(varsToUse);
312
+ }, [executeQuery, lastVariables]);
313
+ return {
314
+ data,
315
+ isLoading,
316
+ error,
317
+ refetch,
318
+ run: executeQuery,
319
+ };
320
+ }
321
+ /**
322
+ * Hook to get connection status
323
+ */
324
+ export function useReactiveConnection() {
325
+ const [status, setStatus] = useState("disconnected");
326
+ const clientManager = getClientManager();
327
+ useEffect(() => {
328
+ const updateStatus = () => {
329
+ setStatus(clientManager.getConnectionStatus());
330
+ };
331
+ updateStatus();
332
+ const interval = setInterval(updateStatus, 1000);
333
+ return () => clearInterval(interval);
334
+ }, [clientManager]);
335
+ return {
336
+ status,
337
+ isConnected: status === "connected",
338
+ isConnecting: status === "connecting",
339
+ isDisconnected: status === "disconnected",
340
+ reconnect: () => clientManager.reconnectSSE(),
341
+ };
342
+ }
343
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/client/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Client-side reactive database features
3
+ */
4
+ export { ReactiveStorage, createReactiveStorage } from './storage.js';
5
+ export { SimpleSessionManager, createSimpleSessionManager, revalidateOnPageLoad, type SessionInfo, type QueryRegistry, type QueryRegistryEntry, } from './session.js';
6
+ export { ReactiveClientManager, createReactiveClientManager, type ReactiveManagerOptions, } from './manager.js';
7
+ export { useReactive, useReactiveQuery, useReactivePriorities, useReactiveStats, useReactiveRefresh, useReactiveInvalidation, useRevalidationStats, useReactiveConnection, initializeReactiveClient, } from './hooks.js';
8
+ export { SmartRevalidationEngine, createSmartRevalidationEngine, type RevalidationStrategy, type RevalidationOptions, type RevalidationResult, } from './revalidation.js';
9
+ export { ReactiveProvider } from './provider.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Client-side reactive database features
3
+ */
4
+ // Storage and session management
5
+ export { ReactiveStorage, createReactiveStorage } from './storage.js';
6
+ export { SimpleSessionManager, createSimpleSessionManager, revalidateOnPageLoad, } from './session.js';
7
+ // Client manager
8
+ export { ReactiveClientManager, createReactiveClientManager, } from './manager.js';
9
+ // React hooks
10
+ export { useReactive, useReactiveQuery, useReactivePriorities, useReactiveStats, useReactiveRefresh, useReactiveInvalidation, useRevalidationStats, useReactiveConnection, initializeReactiveClient, } from './hooks.js';
11
+ // Smart revalidation
12
+ export { SmartRevalidationEngine, createSmartRevalidationEngine, } from './revalidation.js';
13
+ // Provider and types
14
+ export { ReactiveProvider } from './provider.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,GAIrB,MAAM,cAAc,CAAA;AAErB,iBAAiB;AACjB,OAAO,EACL,qBAAqB,EACrB,2BAA2B,GAE5B,MAAM,cAAc,CAAA;AAErB,cAAc;AACd,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAEnB,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,GAI9B,MAAM,mBAAmB,CAAA;AAE1B,qBAAqB;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Client-side reactive manager
3
+ * Coordinates storage, session recovery, and real-time synchronization
4
+ */
5
+ import { type SSEClientOptions } from './sse-client.js';
6
+ import type { ReactiveConfig, InvalidationEvent } from '../core/types.js';
7
+ export interface ReactiveManagerOptions {
8
+ organizationId: string;
9
+ config: ReactiveConfig;
10
+ onInvalidation?: (event: InvalidationEvent) => void;
11
+ onRevalidate?: (queryKey: string) => Promise<any>;
12
+ sseOptions?: Partial<SSEClientOptions>;
13
+ }
14
+ export declare class ReactiveClientManager {
15
+ private storage;
16
+ private sessionManager;
17
+ private revalidationEngine;
18
+ private sseClient;
19
+ private config;
20
+ private organizationId;
21
+ private onInvalidation?;
22
+ private onRevalidate?;
23
+ private visibilityListener?;
24
+ private beforeUnloadListener?;
25
+ constructor(options: ReactiveManagerOptions);
26
+ /**
27
+ * Get organization ID
28
+ */
29
+ get currentOrganizationId(): string;
30
+ /**
31
+ * Register a query execution
32
+ */
33
+ registerQuery(queryKey: string, dependencies: string[], data?: any, ttl?: number): void;
34
+ /**
35
+ * Register an active React hook
36
+ */
37
+ registerActiveHook(queryKey: string, dependencies: string[]): () => void;
38
+ /**
39
+ * Get cached data for a query
40
+ */
41
+ getCachedData(queryKey: string): {
42
+ data: any;
43
+ isStale: boolean;
44
+ lastRevalidated: number;
45
+ } | null;
46
+ /**
47
+ * Handle invalidation event from server
48
+ */
49
+ private handleInvalidation;
50
+ /**
51
+ * Find queries affected by table changes
52
+ */
53
+ private findAffectedQueries;
54
+ /**
55
+ * Handle connection status changes
56
+ */
57
+ private handleConnectionStatus;
58
+ /**
59
+ * Revalidate a specific query
60
+ */
61
+ revalidateQuery(queryKey: string): Promise<any>;
62
+ /**
63
+ * Initialize SSE connection for real-time updates
64
+ */
65
+ private initializeSSEConnection;
66
+ /**
67
+ * Get SSE connection statistics
68
+ */
69
+ getSSEStats(): import("./sse-client.js").SSEClientStats | null;
70
+ /**
71
+ * Manually reconnect SSE
72
+ */
73
+ reconnectSSE(): void;
74
+ /**
75
+ * Set up browser event listeners
76
+ */
77
+ private setupEventListeners;
78
+ /**
79
+ * Remove event listeners
80
+ */
81
+ private removeEventListeners;
82
+ /**
83
+ * Check for session gap on initial load (simple approach as per spec)
84
+ */
85
+ private checkInitialSession;
86
+ /**
87
+ * Handle page visibility change
88
+ */
89
+ private handleVisibilityChange;
90
+ /**
91
+ * Get current connection status
92
+ */
93
+ getConnectionStatus(): 'connected' | 'connecting' | 'disconnected';
94
+ /**
95
+ * Check if real-time is enabled and connected
96
+ */
97
+ isRealtimeEnabled(): boolean;
98
+ /**
99
+ * Get storage statistics
100
+ */
101
+ getStorageStats(): import("../core/types.js").QueryRegistry | null;
102
+ /**
103
+ * Get session statistics
104
+ */
105
+ getSessionStats(): {
106
+ sessionAge: number;
107
+ timeSinceLastSync: number;
108
+ realtimeConnected: boolean;
109
+ totalQueries: number;
110
+ staleQueries: number;
111
+ };
112
+ /**
113
+ * Get revalidation statistics
114
+ */
115
+ getRevalidationStats(): {
116
+ activeRevalidations: number;
117
+ queuedQueries: number;
118
+ activeHooks: number;
119
+ recentActivity: {
120
+ queryKey: string;
121
+ timestamp: number;
122
+ }[];
123
+ };
124
+ /**
125
+ * Mark a query as stale for testing purposes
126
+ */
127
+ markQueryStaleForTesting(queryKey: string): void;
128
+ /**
129
+ * Cleanup resources
130
+ */
131
+ cleanup(): void;
132
+ }
133
+ /**
134
+ * Create reactive client manager
135
+ */
136
+ export declare function createReactiveClientManager(options: ReactiveManagerOptions): ReactiveClientManager;
137
+ //# sourceMappingURL=manager.d.ts.map