@agelum/backend 0.1.1 → 0.1.2

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/dist/client/hooks.d.ts +65 -0
  2. package/dist/client/hooks.d.ts.map +1 -0
  3. package/dist/client/index.d.ts +10 -0
  4. package/dist/client/index.d.ts.map +1 -0
  5. package/dist/client/manager.d.ts +137 -0
  6. package/dist/client/manager.d.ts.map +1 -0
  7. package/dist/client/provider.d.ts +25 -0
  8. package/dist/client/provider.d.ts.map +1 -0
  9. package/dist/client/revalidation.d.ts +101 -0
  10. package/dist/client/revalidation.d.ts.map +1 -0
  11. package/dist/client/sse-client.d.ts +81 -0
  12. package/dist/client/sse-client.d.ts.map +1 -0
  13. package/dist/client/storage.d.ts +126 -0
  14. package/dist/client/storage.d.ts.map +1 -0
  15. package/dist/client/trpc.d.ts +12 -0
  16. package/dist/client/trpc.d.ts.map +1 -0
  17. package/dist/client.d.ts +12 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/config/schema.d.ts +250 -0
  20. package/dist/config/schema.d.ts.map +1 -0
  21. package/dist/config/schema.js +69 -0
  22. package/dist/config/schema.js.map +1 -0
  23. package/dist/core/analyzer.d.ts +15 -0
  24. package/dist/core/analyzer.d.ts.map +1 -0
  25. package/dist/core/driver.d.ts +7 -0
  26. package/dist/core/driver.d.ts.map +1 -0
  27. package/dist/core/driver.js +262 -0
  28. package/dist/core/driver.js.map +1 -0
  29. package/dist/core/function.d.ts +103 -0
  30. package/dist/core/function.d.ts.map +1 -0
  31. package/dist/core/function.js +252 -0
  32. package/dist/core/function.js.map +1 -0
  33. package/dist/core/sse.d.ts +98 -0
  34. package/dist/core/sse.d.ts.map +1 -0
  35. package/dist/core/types.d.ts +196 -0
  36. package/dist/core/types.d.ts.map +1 -0
  37. package/dist/core/types.js +3 -0
  38. package/dist/core/types.js.map +1 -0
  39. package/dist/examples/teamhub-integration.d.ts +56 -0
  40. package/dist/examples/teamhub-integration.d.ts.map +1 -0
  41. package/dist/examples/teamhub-integration.js +192 -0
  42. package/dist/examples/teamhub-integration.js.map +1 -0
  43. package/dist/index.d.ts +40 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +57 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/providers/localStorage.d.ts +13 -0
  48. package/dist/providers/localStorage.d.ts.map +1 -0
  49. package/dist/providers/memory.d.ts +13 -0
  50. package/dist/providers/memory.d.ts.map +1 -0
  51. package/dist/providers/redis.d.ts +14 -0
  52. package/dist/providers/redis.d.ts.map +1 -0
  53. package/dist/server.d.ts +18 -0
  54. package/dist/server.d.ts.map +1 -0
  55. package/dist/server.js +34 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/trpc/index.d.ts +9 -0
  58. package/dist/trpc/index.d.ts.map +1 -0
  59. package/dist/trpc/index.js +19 -0
  60. package/dist/trpc/index.js.map +1 -0
  61. package/dist/trpc/router.d.ts +76 -0
  62. package/dist/trpc/router.d.ts.map +1 -0
  63. package/dist/trpc/router.js +177 -0
  64. package/dist/trpc/router.js.map +1 -0
  65. package/dist/trpc/types.d.ts +114 -0
  66. package/dist/trpc/types.d.ts.map +1 -0
  67. package/dist/trpc/types.js +6 -0
  68. package/dist/trpc/types.js.map +1 -0
  69. package/package.json +1 -1
@@ -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";
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,eAAe,CAAC;AAkBvB;;;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,10 @@
1
+ /**
2
+ * Client-side reactive database features
3
+ */
4
+ export { ReactiveStorage, createReactiveStorage } from './storage';
5
+ export { SimpleSessionManager, createSimpleSessionManager, revalidateOnPageLoad, type SessionInfo, type QueryRegistry, type QueryRegistryEntry, } from './session';
6
+ export { ReactiveClientManager, createReactiveClientManager, type ReactiveManagerOptions, } from './manager';
7
+ export { useReactive, useReactiveQuery, useReactivePriorities, useReactiveStats, useReactiveRefresh, useReactiveInvalidation, useRevalidationStats, useReactiveConnection, initializeReactiveClient, } from './hooks';
8
+ export { SmartRevalidationEngine, createSmartRevalidationEngine, type RevalidationStrategy, type RevalidationOptions, type RevalidationResult, } from './revalidation';
9
+ export { ReactiveProvider } from './provider';
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,WAAW,CAAA;AAClE,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,WAAW,CAAA;AAGlB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,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';
6
+ import type { ReactiveConfig, InvalidationEvent } from '../core/types';
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").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").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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/client/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtE,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,cAAc,CAAA;IACtB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACnD,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CACvC;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAoC;IAC3D,OAAO,CAAC,YAAY,CAAC,CAAoC;IAGzD,OAAO,CAAC,kBAAkB,CAAC,CAAY;IACvC,OAAO,CAAC,oBAAoB,CAAC,CAAY;gBAE7B,OAAO,EAAE,sBAAsB;IA0B3C;;OAEG;IACH,IAAI,qBAAqB,IAAI,MAAM,CAElC;IAED;;OAEG;IACH,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,IAAI,CAAC,EAAE,GAAG,EACV,GAAG,CAAC,EAAE,MAAM,GACX,IAAI;IAIP;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI;IASxE;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM;;;;;IAI9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAW9B;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAwBrD;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsB/B;;OAEG;IACH,WAAW;IAIX;;OAEG;IACH,YAAY,IAAI,IAAI;IAUpB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;YACW,mBAAmB;IAYjC;;OAEG;YACW,sBAAsB;IAOpC;;OAEG;IACH,mBAAmB,IAAI,WAAW,GAAG,YAAY,GAAG,cAAc;IAUlE;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAO5B;;OAEG;IACH,eAAe;IAIf;;OAEG;IACH,eAAe;;;;;;;IAIf;;OAEG;IACH,oBAAoB;;;;;;;;;IAIpB;;OAEG;IACH,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIhD;;OAEG;IACH,OAAO,IAAI,IAAI;CAahB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,sBAAsB,GAC9B,qBAAqB,CAEvB"}
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import type { ReactiveConfig } from '../core/types';
3
+ interface ReactiveProviderConfig {
4
+ relations: Record<string, string[]>;
5
+ organizationId: string;
6
+ revalidateFn?: (queryKey: string) => Promise<any>;
7
+ }
8
+ interface ReactiveContextValue {
9
+ organizationId: string;
10
+ config: ReactiveConfig;
11
+ isInitialized: boolean;
12
+ }
13
+ /**
14
+ * React context provider for reactive features
15
+ */
16
+ export declare function ReactiveProvider({ children, config, }: {
17
+ children: React.ReactNode;
18
+ config: ReactiveProviderConfig;
19
+ }): React.FunctionComponentElement<React.ProviderProps<ReactiveContextValue | null>>;
20
+ /**
21
+ * Hook to access reactive context
22
+ */
23
+ export declare function useReactiveContext(): ReactiveContextValue;
24
+ export {};
25
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/client/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAyD,MAAM,OAAO,CAAA;AAE7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,UAAU,sBAAsB;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;CAClD;AAED,UAAU,oBAAoB;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,cAAc,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;CACvB;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,GACP,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,MAAM,EAAE,sBAAsB,CAAA;CAC/B,oFA2GA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,yBAMjC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Smart revalidation system with active hooks priority
3
+ * Provides intelligent query revalidation based on user interaction patterns
4
+ */
5
+ import type { ReactiveStorage } from './storage';
6
+ import type { ReactiveConfig } from '../core/types';
7
+ export interface RevalidationStrategy {
8
+ immediate: string[];
9
+ delayed: string[];
10
+ background: string[];
11
+ estimatedTime: number;
12
+ }
13
+ export interface RevalidationOptions {
14
+ maxConcurrent?: number;
15
+ delayBetweenBatches?: number;
16
+ priorityFirst?: boolean;
17
+ backgroundDelay?: number;
18
+ }
19
+ export interface RevalidationResult {
20
+ immediate: {
21
+ successful: number;
22
+ failed: number;
23
+ duration: number;
24
+ };
25
+ delayed: {
26
+ successful: number;
27
+ failed: number;
28
+ duration: number;
29
+ };
30
+ background: {
31
+ successful: number;
32
+ failed: number;
33
+ duration: number;
34
+ };
35
+ totalDuration: number;
36
+ overallSuccess: boolean;
37
+ }
38
+ export declare class SmartRevalidationEngine {
39
+ private storage;
40
+ private config;
41
+ private activeRevalidations;
42
+ private revalidationQueue;
43
+ constructor(storage: ReactiveStorage, config: ReactiveConfig);
44
+ /**
45
+ * Create an intelligent revalidation strategy
46
+ */
47
+ createRevalidationStrategy(invalidatedQueries: string[], options?: RevalidationOptions): RevalidationStrategy;
48
+ /**
49
+ * Execute the revalidation strategy
50
+ */
51
+ executeRevalidationStrategy(strategy: RevalidationStrategy, revalidateFn: (queryKey: string) => Promise<any>, options?: RevalidationOptions): Promise<RevalidationResult>;
52
+ /**
53
+ * Add queries to revalidation queue with priority
54
+ */
55
+ queueRevalidation(queryKey: string, priority?: number): void;
56
+ /**
57
+ * Process revalidation queue
58
+ */
59
+ processRevalidationQueue(revalidateFn: (queryKey: string) => Promise<any>, options?: RevalidationOptions): Promise<void>;
60
+ /**
61
+ * Smart invalidation with automatic revalidation
62
+ */
63
+ smartInvalidateAndRevalidate(table: string, revalidateFn: (queryKey: string) => Promise<any>, options?: RevalidationOptions): Promise<RevalidationResult>;
64
+ /**
65
+ * Execute a batch of queries with concurrency control
66
+ */
67
+ private executeQueryBatch;
68
+ /**
69
+ * Execute background revalidation with rate limiting
70
+ */
71
+ private executeBackgroundRevalidation;
72
+ /**
73
+ * Find queries affected by table changes
74
+ */
75
+ private findAffectedQueries;
76
+ /**
77
+ * Estimate total revalidation time
78
+ */
79
+ private estimateRevalidationTime;
80
+ /**
81
+ * Utility to wait for a specified time
82
+ */
83
+ private wait;
84
+ /**
85
+ * Get current revalidation statistics
86
+ */
87
+ getRevalidationStats(): {
88
+ activeRevalidations: number;
89
+ queuedQueries: number;
90
+ activeHooks: number;
91
+ recentActivity: {
92
+ queryKey: string;
93
+ timestamp: number;
94
+ }[];
95
+ };
96
+ }
97
+ /**
98
+ * Create a smart revalidation engine
99
+ */
100
+ export declare function createSmartRevalidationEngine(storage: ReactiveStorage, config: ReactiveConfig): SmartRevalidationEngine;
101
+ //# sourceMappingURL=revalidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revalidation.d.ts","sourceRoot":"","sources":["../../src/client/revalidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Client-side SSE client for real-time cache invalidation
3
+ * NO HEARTBEATS - relies on event acknowledgments and connection health
4
+ */
5
+ import type { InvalidationEvent } from '../core/types';
6
+ export interface SSEClientOptions {
7
+ url: string;
8
+ onInvalidation: (event: InvalidationEvent) => void;
9
+ onError: (error: Error) => void;
10
+ onReconnect?: () => void;
11
+ maxReconnectAttempts?: number;
12
+ reconnectDelay?: number;
13
+ }
14
+ export interface SSEClientStats {
15
+ connectionAttempts: number;
16
+ successfulConnections: number;
17
+ failedConnections: number;
18
+ reconnectAttempts: number;
19
+ eventsReceived: number;
20
+ eventsAcknowledged: number;
21
+ lastEventTime: number;
22
+ connectionStartTime?: number;
23
+ totalUptime: number;
24
+ }
25
+ /**
26
+ * SSE Client for real-time cache invalidation
27
+ * Uses event acknowledgments instead of heartbeats for reliability
28
+ */
29
+ export declare class SSEClient {
30
+ private eventSource;
31
+ private reconnectTimer;
32
+ private isIntentionallyClosed;
33
+ private stats;
34
+ private options;
35
+ constructor(options: SSEClientOptions);
36
+ /**
37
+ * Connect to SSE stream
38
+ */
39
+ connect(): void;
40
+ /**
41
+ * Disconnect from SSE stream
42
+ */
43
+ disconnect(): void;
44
+ /**
45
+ * Handle incoming SSE messages
46
+ */
47
+ private handleMessage;
48
+ /**
49
+ * Handle invalidation events
50
+ */
51
+ private handleInvalidationEvent;
52
+ /**
53
+ * Send event acknowledgment to server
54
+ */
55
+ private acknowledgeEvent;
56
+ /**
57
+ * Schedule reconnection attempt
58
+ */
59
+ private scheduleReconnect;
60
+ /**
61
+ * Handle connection errors and schedule reconnection
62
+ */
63
+ private handleConnectionError;
64
+ /**
65
+ * Clear reconnection timer
66
+ */
67
+ private clearReconnectTimer;
68
+ /**
69
+ * Get connection statistics
70
+ */
71
+ getStats(): SSEClientStats;
72
+ /**
73
+ * Check if currently connected
74
+ */
75
+ isConnected(): boolean;
76
+ /**
77
+ * Get connection state
78
+ */
79
+ getConnectionState(): 'connecting' | 'open' | 'closed';
80
+ }
81
+ //# sourceMappingURL=sse-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.d.ts","sourceRoot":"","sources":["../../src/client/sse-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAClD,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CAExB;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,qBAAqB,EAAE,MAAM,CAAA;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAA4B;gBAE/B,OAAO,EAAE,gBAAgB;IAoBrC;;OAEG;IACH,OAAO,IAAI,IAAI;IAgCf;;OAEG;IACH,UAAU,IAAI,IAAI;IAkBlB;;OAEG;IACH,OAAO,CAAC,aAAa;IA8BrB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAU/B;;OAEG;YACW,gBAAgB;IAsB9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,QAAQ,IAAI,cAAc;IAI1B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,kBAAkB,IAAI,YAAY,GAAG,MAAM,GAAG,QAAQ;CAcvD"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Client-side storage management for reactive queries
3
+ * Handles localStorage-based query registry and session persistence
4
+ */
5
+ import type { QueryRegistry, HookState } from "../core/types";
6
+ export declare class ReactiveStorage {
7
+ private storageKey;
8
+ private legacyStorageKey;
9
+ private indexKey;
10
+ private activeHooks;
11
+ private sessionId;
12
+ private organizationId;
13
+ constructor(organizationId: string);
14
+ /** Derive the per-org index key */
15
+ private getIndexKey;
16
+ /** Derive per-query entry key */
17
+ private getEntryKey;
18
+ private getLegacyEntryKey;
19
+ /** Simple 32-bit hash for stable short keys */
20
+ private hash;
21
+ /**
22
+ * Initialize the query registry for this organization
23
+ */
24
+ private initializeRegistry;
25
+ /**
26
+ * Get the current query registry
27
+ */
28
+ getRegistry(): QueryRegistry | null;
29
+ /**
30
+ * Save the query registry to localStorage
31
+ */
32
+ private saveRegistry;
33
+ /**
34
+ * Register a query execution
35
+ */
36
+ registerQuery(queryKey: string, dependencies: string[], data?: any, ttl?: number): void;
37
+ /**
38
+ * Mark a query as stale (needs revalidation)
39
+ */
40
+ invalidateQuery(queryKey: string): void;
41
+ /**
42
+ * Mark a query as stale for testing (simulates server-side changes)
43
+ */
44
+ markQueryStaleForTesting(queryKey: string): void;
45
+ /**
46
+ * Invalidate queries based on table changes
47
+ */
48
+ invalidateByTable(table: string, relations: Record<string, string[]>): void;
49
+ /**
50
+ * Get cached data for a query
51
+ */
52
+ getCachedData(queryKey: string): {
53
+ data: any;
54
+ isStale: boolean;
55
+ lastRevalidated: number;
56
+ } | null;
57
+ /**
58
+ * Detect session gaps and queries that need revalidation
59
+ */
60
+ detectSessionGap(): {
61
+ hasGap: boolean;
62
+ gapDuration: number;
63
+ staleQueries: string[];
64
+ };
65
+ /**
66
+ * Register an active hook for priority revalidation
67
+ */
68
+ registerActiveHook(queryKey: string, dependencies: string[], organizationId?: string): void;
69
+ /**
70
+ * Unregister an active hook
71
+ */
72
+ unregisterActiveHook(queryKey: string): void;
73
+ /**
74
+ * Get active hooks for priority revalidation
75
+ */
76
+ getActiveHooks(): HookState[];
77
+ /**
78
+ * Get active hooks sorted by priority (most recent access first)
79
+ */
80
+ getActiveHooksByPriority(): HookState[];
81
+ /**
82
+ * Update real-time connection status
83
+ */
84
+ updateRealtimeStatus(connected: boolean): void;
85
+ /**
86
+ * Get queries that should be revalidated first (active hooks)
87
+ */
88
+ getPriorityQueries(): string[];
89
+ /**
90
+ * Get background queries that can be revalidated later
91
+ */
92
+ getBackgroundQueries(): string[];
93
+ /**
94
+ * Clean up expired entries to free up localStorage space
95
+ */
96
+ private cleanupExpiredEntries;
97
+ /**
98
+ * Clean up old entries when localStorage is full
99
+ */
100
+ private cleanupOldEntries;
101
+ /**
102
+ * Generate a unique session ID
103
+ */
104
+ private generateSessionId;
105
+ /**
106
+ * Get session information
107
+ */
108
+ getSessionInfo(): {
109
+ startTime: number;
110
+ lastSync: number;
111
+ realtimeConnected: boolean;
112
+ } | null;
113
+ /**
114
+ * Clear all stored data for this organization
115
+ */
116
+ clearRegistry(): void;
117
+ /**
118
+ * Export registry for debugging
119
+ */
120
+ exportRegistry(): QueryRegistry | null;
121
+ }
122
+ /**
123
+ * Create a storage instance for an organization
124
+ */
125
+ export declare function createReactiveStorage(organizationId: string): ReactiveStorage;
126
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/client/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACV,MAAM,eAAe,CAAC;AAEvB,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CACW;IAC7B,OAAO,CAAC,gBAAgB,CACO;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAGf;IACJ,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;gBAEnB,cAAc,EAAE,MAAM;IAYlC,mCAAmC;IACnC,OAAO,CAAC,WAAW;IAInB,iCAAiC;IACjC,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,iBAAiB;IAOzB,+CAA+C;IAC/C,OAAO,CAAC,IAAI;IAaZ;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,WAAW,IAAI,aAAa,GAAG,IAAI;IA8BnC;;OAEG;IACH,OAAO,CAAC,YAAY;IAiCpB;;OAEG;IACH,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,IAAI,CAAC,EAAE,GAAG,EACV,GAAG,CAAC,EAAE,MAAM,GACX,IAAI;IA4FP;;OAEG;IACH,eAAe,CACb,QAAQ,EAAE,MAAM,GACf,IAAI;IAmBP;;OAEG;IACH,wBAAwB,CACtB,QAAQ,EAAE,MAAM,GACf,IAAI;IAoBP;;OAEG;IACH,iBAAiB,CACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAClC,IAAI;IA0CP;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG;QAC/B,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;KACzB,GAAG,IAAI;IAqER;;OAEG;IACH,gBAAgB,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB;IAgDD;;OAEG;IACH,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE,EACtB,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI;IAUP;;OAEG;IACH,oBAAoB,CAClB,QAAQ,EAAE,MAAM,GACf,IAAI;IAIP;;OAEG;IACH,cAAc,IAAI,SAAS,EAAE;IAM7B;;OAEG;IACH,wBAAwB,IAAI,SAAS,EAAE;IAOvC;;OAEG;IACH,oBAAoB,CAClB,SAAS,EAAE,OAAO,GACjB,IAAI;IAWP;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAQ9B;;OAEG;IACH,oBAAoB,IAAI,MAAM,EAAE;IAehC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA8B7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyCzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,cAAc;;;;;IAKd;;OAEG;IACH,aAAa,IAAI,IAAI;IAgDrB;;OAEG;IACH,cAAc,IAAI,aAAa,GAAG,IAAI;CAGvC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,GACrB,eAAe,CAIjB"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ type RelationsMap = Record<string, string[]>;
3
+ export declare function createTrpcRevalidateFn(trpcClient: any): (compositeKey: string) => Promise<any>;
4
+ interface TrpcReactiveProviderProps {
5
+ children: React.ReactNode;
6
+ organizationId: string;
7
+ relations: RelationsMap;
8
+ trpcClient: any;
9
+ }
10
+ export declare function TrpcReactiveProvider({ children, organizationId, relations, trpcClient, }: TrpcReactiveProviderProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=trpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpc.d.ts","sourceRoot":"","sources":["../../src/client/trpc.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;AAE5C,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,GAAG,IACtC,cAAc,MAAM,kBAanC;AAED,UAAU,yBAAyB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,YAAY,CAAA;IACvB,UAAU,EAAE,GAAG,CAAA;CAChB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,cAAc,EACd,SAAS,EACT,UAAU,GACX,EAAE,yBAAyB,2CAa3B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Client-only exports for @agelum/backend
3
+ * Import this with: import { ... } from '@agelum/backend/client'
4
+ */
5
+ export { ReactiveProvider, useReactiveContext, } from "./client/provider";
6
+ export { useReactive, useReactiveQuery, initializeReactiveClient, } from "./client/hooks";
7
+ export { ReactiveClientManager } from "./client/manager";
8
+ export { TrpcReactiveProvider, createTrpcRevalidateFn, } from "./client/trpc";
9
+ export { LocalStorageProvider } from "./providers/localStorage";
10
+ export type { UseReactiveResult } from "./client/types";
11
+ export declare const version = "0.1.0";
12
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,eAAO,MAAM,OAAO,UAAU,CAAC"}