@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.
- package/dist/client/hooks.d.ts +65 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/manager.d.ts +137 -0
- package/dist/client/manager.d.ts.map +1 -0
- package/dist/client/provider.d.ts +25 -0
- package/dist/client/provider.d.ts.map +1 -0
- package/dist/client/revalidation.d.ts +101 -0
- package/dist/client/revalidation.d.ts.map +1 -0
- package/dist/client/sse-client.d.ts +81 -0
- package/dist/client/sse-client.d.ts.map +1 -0
- package/dist/client/storage.d.ts +126 -0
- package/dist/client/storage.d.ts.map +1 -0
- package/dist/client/trpc.d.ts +12 -0
- package/dist/client/trpc.d.ts.map +1 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/config/schema.d.ts +250 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +69 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/analyzer.d.ts +15 -0
- package/dist/core/analyzer.d.ts.map +1 -0
- package/dist/core/driver.d.ts +7 -0
- package/dist/core/driver.d.ts.map +1 -0
- package/dist/core/driver.js +262 -0
- package/dist/core/driver.js.map +1 -0
- package/dist/core/function.d.ts +103 -0
- package/dist/core/function.d.ts.map +1 -0
- package/dist/core/function.js +252 -0
- package/dist/core/function.js.map +1 -0
- package/dist/core/sse.d.ts +98 -0
- package/dist/core/sse.d.ts.map +1 -0
- package/dist/core/types.d.ts +196 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/examples/teamhub-integration.d.ts +56 -0
- package/dist/examples/teamhub-integration.d.ts.map +1 -0
- package/dist/examples/teamhub-integration.js +192 -0
- package/dist/examples/teamhub-integration.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/localStorage.d.ts +13 -0
- package/dist/providers/localStorage.d.ts.map +1 -0
- package/dist/providers/memory.d.ts +13 -0
- package/dist/providers/memory.d.ts.map +1 -0
- package/dist/providers/redis.d.ts +14 -0
- package/dist/providers/redis.d.ts.map +1 -0
- package/dist/server.d.ts +18 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +34 -0
- package/dist/server.js.map +1 -0
- package/dist/trpc/index.d.ts +9 -0
- package/dist/trpc/index.d.ts.map +1 -0
- package/dist/trpc/index.js +19 -0
- package/dist/trpc/index.js.map +1 -0
- package/dist/trpc/router.d.ts +76 -0
- package/dist/trpc/router.d.ts.map +1 -0
- package/dist/trpc/router.js +177 -0
- package/dist/trpc/router.js.map +1 -0
- package/dist/trpc/types.d.ts +114 -0
- package/dist/trpc/types.d.ts.map +1 -0
- package/dist/trpc/types.js +6 -0
- package/dist/trpc/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Define reactive functions with explicit dependencies
|
|
3
|
+
* Core building block that works both standalone and with tRPC
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import type { ReactiveDb, ReactiveFunctionContext } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Options passed to tRPC handler
|
|
9
|
+
*/
|
|
10
|
+
export interface TrpcHandlerOptions<TInput> {
|
|
11
|
+
input: TInput;
|
|
12
|
+
}
|
|
13
|
+
export interface ReactiveFunctionConfig<TInput = unknown, TOutput = unknown> {
|
|
14
|
+
/** Function name (used for cache keys and tRPC procedure names) */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Input validation schema */
|
|
17
|
+
input: z.ZodType<TInput>;
|
|
18
|
+
/** Tables this function depends on (for cache invalidation) */
|
|
19
|
+
dependencies: string[];
|
|
20
|
+
/** Optional: Specific invalidation conditions */
|
|
21
|
+
invalidateWhen?: Record<string, (change: InvalidationChange) => boolean>;
|
|
22
|
+
/** Cache configuration */
|
|
23
|
+
cache?: {
|
|
24
|
+
enabled?: boolean;
|
|
25
|
+
ttl?: number;
|
|
26
|
+
key?: (input: TInput) => string;
|
|
27
|
+
};
|
|
28
|
+
/** The actual function logic - receives context with input and db */
|
|
29
|
+
handler: (ctx: ReactiveFunctionContext<TInput>) => Promise<TOutput>;
|
|
30
|
+
}
|
|
31
|
+
export interface InvalidationChange {
|
|
32
|
+
table: string;
|
|
33
|
+
operation: 'INSERT' | 'UPDATE' | 'DELETE';
|
|
34
|
+
keys: string[];
|
|
35
|
+
timestamp: number;
|
|
36
|
+
}
|
|
37
|
+
export interface ReactiveFunction<TInput = unknown, TOutput = unknown> {
|
|
38
|
+
/** Function configuration */
|
|
39
|
+
config: ReactiveFunctionConfig<TInput, TOutput>;
|
|
40
|
+
/** Execute the function standalone (server-side) */
|
|
41
|
+
execute: (input: TInput, db: ReactiveDb) => Promise<TOutput>;
|
|
42
|
+
/** Get cache key for input */
|
|
43
|
+
getCacheKey: (input: TInput) => string;
|
|
44
|
+
/** Check if function should be invalidated by a change */
|
|
45
|
+
shouldInvalidate: (change: InvalidationChange) => boolean;
|
|
46
|
+
/** Get function metadata for tRPC integration */
|
|
47
|
+
getMetadata: () => ReactiveFunctionMetadata;
|
|
48
|
+
/** Get tRPC-compatible handler (for tRPC router integration) */
|
|
49
|
+
getTrpcHandler: (db: ReactiveDb) => (opts: TrpcHandlerOptions<TInput>) => Promise<TOutput>;
|
|
50
|
+
}
|
|
51
|
+
export interface ReactiveFunctionMetadata {
|
|
52
|
+
name: string;
|
|
53
|
+
dependencies: string[];
|
|
54
|
+
cacheEnabled: boolean;
|
|
55
|
+
cacheTtl: number;
|
|
56
|
+
hasInvalidationRules: boolean;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Define a reactive function - the core building block
|
|
60
|
+
*/
|
|
61
|
+
export declare function defineReactiveFunction<TInput, TOutput>(config: ReactiveFunctionConfig<TInput, TOutput>): ReactiveFunction<TInput, TOutput>;
|
|
62
|
+
/**
|
|
63
|
+
* Registry for managing reactive functions
|
|
64
|
+
*/
|
|
65
|
+
export declare class ReactiveFunctionRegistry {
|
|
66
|
+
private functions;
|
|
67
|
+
/**
|
|
68
|
+
* Register a reactive function
|
|
69
|
+
*/
|
|
70
|
+
register<TInput, TOutput>(name: string, fn: ReactiveFunction<TInput, TOutput>): void;
|
|
71
|
+
/**
|
|
72
|
+
* Execute a registered function
|
|
73
|
+
*/
|
|
74
|
+
execute<T>(name: string, input: unknown, db: ReactiveDb): Promise<T>;
|
|
75
|
+
/**
|
|
76
|
+
* Get function by name
|
|
77
|
+
*/
|
|
78
|
+
get(name: string): ReactiveFunction<unknown, unknown> | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Get all registered function names
|
|
81
|
+
*/
|
|
82
|
+
getFunctionNames(): string[];
|
|
83
|
+
/**
|
|
84
|
+
* Get registry statistics
|
|
85
|
+
*/
|
|
86
|
+
getStats(): {
|
|
87
|
+
totalFunctions: number;
|
|
88
|
+
functionsByDependency: Record<string, string[]>;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Clear all functions
|
|
92
|
+
*/
|
|
93
|
+
clear(): void;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get or create global reactive function registry
|
|
97
|
+
*/
|
|
98
|
+
export declare function getReactiveFunctionRegistry(): ReactiveFunctionRegistry;
|
|
99
|
+
/**
|
|
100
|
+
* Helper to register a reactive function globally
|
|
101
|
+
*/
|
|
102
|
+
export declare function registerReactiveFunction<TInput, TOutput>(name: string, config: ReactiveFunctionConfig<TInput, TOutput>): ReactiveFunction<TInput, TOutput>;
|
|
103
|
+
//# sourceMappingURL=function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/core/function.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Define reactive functions with explicit dependencies
|
|
4
|
+
* Core building block that works both standalone and with tRPC
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ReactiveFunctionRegistry = void 0;
|
|
8
|
+
exports.defineReactiveFunction = defineReactiveFunction;
|
|
9
|
+
exports.getReactiveFunctionRegistry = getReactiveFunctionRegistry;
|
|
10
|
+
exports.registerReactiveFunction = registerReactiveFunction;
|
|
11
|
+
/**
|
|
12
|
+
* Define a reactive function - the core building block
|
|
13
|
+
*/
|
|
14
|
+
function defineReactiveFunction(config) {
|
|
15
|
+
// Validate configuration
|
|
16
|
+
if (!config.name) {
|
|
17
|
+
throw new Error('ReactiveFunction requires name');
|
|
18
|
+
}
|
|
19
|
+
if (!config.input) {
|
|
20
|
+
throw new Error('ReactiveFunction requires input schema');
|
|
21
|
+
}
|
|
22
|
+
if (!config.dependencies || config.dependencies.length === 0) {
|
|
23
|
+
throw new Error('ReactiveFunction requires dependencies array');
|
|
24
|
+
}
|
|
25
|
+
if (!config.handler) {
|
|
26
|
+
throw new Error('ReactiveFunction requires handler function');
|
|
27
|
+
}
|
|
28
|
+
// Default cache configuration
|
|
29
|
+
const cacheConfig = {
|
|
30
|
+
enabled: true,
|
|
31
|
+
ttl: 300, // 5 minutes default
|
|
32
|
+
key: (input) => `${config.name}:${JSON.stringify(input)}`,
|
|
33
|
+
...config.cache,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Execute the function (standalone server-side execution)
|
|
37
|
+
*/
|
|
38
|
+
const execute = async (input, db) => {
|
|
39
|
+
// Validate input
|
|
40
|
+
const validatedInput = config.input.parse(input);
|
|
41
|
+
// Generate cache key
|
|
42
|
+
const cacheKey = getCacheKey(validatedInput);
|
|
43
|
+
console.log(`[ReactiveFunction] Executing function with cache key: ${cacheKey}`);
|
|
44
|
+
try {
|
|
45
|
+
// Check cache if enabled
|
|
46
|
+
if (cacheConfig.enabled) {
|
|
47
|
+
const cached = await getCachedResult(db, cacheKey);
|
|
48
|
+
if (cached && !isCacheStale(cached, cacheConfig.ttl)) {
|
|
49
|
+
console.log(`[ReactiveFunction] Cache hit for ${cacheKey}`);
|
|
50
|
+
return cached.data;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Execute function handler - clean and simple
|
|
54
|
+
const result = await config.handler({ input: validatedInput, db });
|
|
55
|
+
// Cache result if enabled
|
|
56
|
+
if (cacheConfig.enabled) {
|
|
57
|
+
await cacheResult(db, cacheKey, result, cacheConfig.ttl, {
|
|
58
|
+
dependencies: config.dependencies,
|
|
59
|
+
timestamp: Date.now(),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error(`[ReactiveFunction] Execution error for ${cacheKey}:`, error);
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Get cache key for input
|
|
71
|
+
*/
|
|
72
|
+
const getCacheKey = (input) => {
|
|
73
|
+
return cacheConfig.key(input);
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Check if function should be invalidated by a change
|
|
77
|
+
*/
|
|
78
|
+
const shouldInvalidate = (change) => {
|
|
79
|
+
// Check if the changed table is in our dependencies
|
|
80
|
+
if (!config.dependencies.includes(change.table)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
// Check custom invalidation rules
|
|
84
|
+
if (config.invalidateWhen && config.invalidateWhen[change.table]) {
|
|
85
|
+
try {
|
|
86
|
+
return config.invalidateWhen[change.table](change);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.warn('[ReactiveFunction] Invalidation rule error:', error);
|
|
90
|
+
// Default to invalidate on error for safety
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Default: invalidate if table is in dependencies
|
|
95
|
+
return true;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Get function metadata for tRPC integration
|
|
99
|
+
*/
|
|
100
|
+
const getMetadata = () => {
|
|
101
|
+
return {
|
|
102
|
+
name: config.name,
|
|
103
|
+
dependencies: config.dependencies,
|
|
104
|
+
cacheEnabled: cacheConfig.enabled,
|
|
105
|
+
cacheTtl: cacheConfig.ttl,
|
|
106
|
+
hasInvalidationRules: !!config.invalidateWhen,
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Get tRPC-compatible handler that wraps the reactive function
|
|
111
|
+
*/
|
|
112
|
+
const getTrpcHandler = (db) => {
|
|
113
|
+
return async (opts) => {
|
|
114
|
+
// Simply delegate to the execute method with the reactive database
|
|
115
|
+
return execute(opts.input, db);
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
config,
|
|
120
|
+
execute,
|
|
121
|
+
getCacheKey,
|
|
122
|
+
shouldInvalidate,
|
|
123
|
+
getMetadata,
|
|
124
|
+
getTrpcHandler,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Registry for managing reactive functions
|
|
129
|
+
*/
|
|
130
|
+
class ReactiveFunctionRegistry {
|
|
131
|
+
functions = new Map();
|
|
132
|
+
/**
|
|
133
|
+
* Register a reactive function
|
|
134
|
+
*/
|
|
135
|
+
register(name, fn) {
|
|
136
|
+
this.functions.set(name, fn);
|
|
137
|
+
console.log(`[ReactiveRegistry] Registered function: ${name}`);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Execute a registered function
|
|
141
|
+
*/
|
|
142
|
+
async execute(name, input, db) {
|
|
143
|
+
const fn = this.functions.get(name);
|
|
144
|
+
if (!fn) {
|
|
145
|
+
throw new Error(`ReactiveFunction '${name}' not found`);
|
|
146
|
+
}
|
|
147
|
+
return fn.execute(input, db);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get function by name
|
|
151
|
+
*/
|
|
152
|
+
get(name) {
|
|
153
|
+
return this.functions.get(name);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get all registered function names
|
|
157
|
+
*/
|
|
158
|
+
getFunctionNames() {
|
|
159
|
+
return Array.from(this.functions.keys());
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get registry statistics
|
|
163
|
+
*/
|
|
164
|
+
getStats() {
|
|
165
|
+
const functionsByDependency = {};
|
|
166
|
+
for (const [name, fn] of this.functions) {
|
|
167
|
+
const metadata = fn.getMetadata();
|
|
168
|
+
for (const dep of metadata.dependencies) {
|
|
169
|
+
if (!functionsByDependency[dep]) {
|
|
170
|
+
functionsByDependency[dep] = [];
|
|
171
|
+
}
|
|
172
|
+
functionsByDependency[dep].push(name);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
totalFunctions: this.functions.size,
|
|
177
|
+
functionsByDependency,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Clear all functions
|
|
182
|
+
*/
|
|
183
|
+
clear() {
|
|
184
|
+
this.functions.clear();
|
|
185
|
+
console.log('[ReactiveRegistry] Cleared all functions');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.ReactiveFunctionRegistry = ReactiveFunctionRegistry;
|
|
189
|
+
// Global registry instance
|
|
190
|
+
let globalRegistry = null;
|
|
191
|
+
/**
|
|
192
|
+
* Get or create global reactive function registry
|
|
193
|
+
*/
|
|
194
|
+
function getReactiveFunctionRegistry() {
|
|
195
|
+
if (!globalRegistry) {
|
|
196
|
+
globalRegistry = new ReactiveFunctionRegistry();
|
|
197
|
+
}
|
|
198
|
+
return globalRegistry;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Helper to register a reactive function globally
|
|
202
|
+
*/
|
|
203
|
+
function registerReactiveFunction(name, config) {
|
|
204
|
+
const fn = defineReactiveFunction(config);
|
|
205
|
+
const registry = getReactiveFunctionRegistry();
|
|
206
|
+
registry.register(name, fn);
|
|
207
|
+
return fn;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get cached result from database
|
|
211
|
+
*/
|
|
212
|
+
async function getCachedResult(db, cacheKey) {
|
|
213
|
+
try {
|
|
214
|
+
// In a real implementation, this would use the cache provider
|
|
215
|
+
// For now, we simulate cache behavior
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.warn(`[ReactiveFunction] Cache get error:`, error);
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check if cached result is stale
|
|
225
|
+
*/
|
|
226
|
+
function isCacheStale(cached, ttl) {
|
|
227
|
+
const age = Date.now() - cached.timestamp;
|
|
228
|
+
return age > ttl * 1000; // Convert TTL to milliseconds
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Cache function result
|
|
232
|
+
*/
|
|
233
|
+
async function cacheResult(db, cacheKey, data, ttl, metadata) {
|
|
234
|
+
try {
|
|
235
|
+
// In a real implementation, this would use the cache provider
|
|
236
|
+
console.log(`[ReactiveFunction] Caching result for ${cacheKey} with TTL ${ttl}s`);
|
|
237
|
+
// Store with metadata for invalidation
|
|
238
|
+
const cacheEntry = {
|
|
239
|
+
data,
|
|
240
|
+
timestamp: Date.now(),
|
|
241
|
+
ttl: ttl * 1000,
|
|
242
|
+
metadata,
|
|
243
|
+
};
|
|
244
|
+
// This would actually cache the data
|
|
245
|
+
// await db.setCache(cacheKey, cacheEntry, ttl)
|
|
246
|
+
void cacheEntry; // Suppress unused variable warning until implemented
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.warn(`[ReactiveFunction] Cache set error:`, error);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/core/function.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-Sent Events implementation for real-time cache invalidation
|
|
3
|
+
* Perfect for unidirectional communication with automatic reconnection
|
|
4
|
+
*/
|
|
5
|
+
import type { InvalidationEvent } from './types';
|
|
6
|
+
export interface SSEConnection {
|
|
7
|
+
organizationId: string;
|
|
8
|
+
controller: ReadableStreamDefaultController;
|
|
9
|
+
lastActivity: number;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface PendingEvent {
|
|
13
|
+
id: string;
|
|
14
|
+
organizationId: string;
|
|
15
|
+
data: InvalidationEvent;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
delivered: boolean;
|
|
18
|
+
retryCount: number;
|
|
19
|
+
maxRetries: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* SSE Manager for reliable real-time communication
|
|
23
|
+
* NO HEARTBEATS - uses event acknowledgments and connection monitoring instead
|
|
24
|
+
*/
|
|
25
|
+
export declare class SSEManager {
|
|
26
|
+
private connections;
|
|
27
|
+
private pendingEvents;
|
|
28
|
+
private retrySchedule;
|
|
29
|
+
private connectionMonitorInterval;
|
|
30
|
+
constructor();
|
|
31
|
+
/**
|
|
32
|
+
* Create SSE stream for an organization
|
|
33
|
+
*/
|
|
34
|
+
createSSEStream(organizationId: string): Response;
|
|
35
|
+
/**
|
|
36
|
+
* Broadcast invalidation event to all connections in an organization
|
|
37
|
+
*/
|
|
38
|
+
broadcastInvalidation(organizationId: string, invalidationData: Omit<InvalidationEvent, 'eventId' | 'requiresAck'>): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Acknowledge event receipt (called by client)
|
|
41
|
+
*/
|
|
42
|
+
acknowledgeEvent(eventId: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get connection statistics
|
|
45
|
+
*/
|
|
46
|
+
getConnectionStats(): {
|
|
47
|
+
totalConnections: number;
|
|
48
|
+
connectionsByOrg: Record<string, number>;
|
|
49
|
+
pendingEvents: number;
|
|
50
|
+
activeEvents: PendingEvent[];
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Send event to a specific connection
|
|
54
|
+
*/
|
|
55
|
+
private sendEvent;
|
|
56
|
+
/**
|
|
57
|
+
* Add connection to organization
|
|
58
|
+
*/
|
|
59
|
+
private addConnection;
|
|
60
|
+
/**
|
|
61
|
+
* Remove connection from organization
|
|
62
|
+
*/
|
|
63
|
+
private removeConnection;
|
|
64
|
+
/**
|
|
65
|
+
* Schedule retry for unacknowledged events
|
|
66
|
+
*/
|
|
67
|
+
private scheduleRetryIfNeeded;
|
|
68
|
+
/**
|
|
69
|
+
* Monitor connections for health without sending heartbeats
|
|
70
|
+
* Uses activity tracking and error detection instead of periodic messages
|
|
71
|
+
*/
|
|
72
|
+
private startConnectionMonitor;
|
|
73
|
+
/**
|
|
74
|
+
* Generate unique event ID
|
|
75
|
+
*/
|
|
76
|
+
private generateEventId;
|
|
77
|
+
/**
|
|
78
|
+
* Cleanup resources
|
|
79
|
+
*/
|
|
80
|
+
cleanup(): void;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get or create global SSE manager
|
|
84
|
+
*/
|
|
85
|
+
export declare function getSSEManager(): SSEManager;
|
|
86
|
+
/**
|
|
87
|
+
* Create SSE stream for Vercel/Next.js API routes
|
|
88
|
+
*/
|
|
89
|
+
export declare function createSSEStream(organizationId: string): Response;
|
|
90
|
+
/**
|
|
91
|
+
* Broadcast invalidation event
|
|
92
|
+
*/
|
|
93
|
+
export declare function broadcastInvalidation(organizationId: string, invalidationData: Omit<InvalidationEvent, 'eventId' | 'requiresAck'>): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Acknowledge event (for API route)
|
|
96
|
+
*/
|
|
97
|
+
export declare function acknowledgeEvent(eventId: string): void;
|
|
98
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/core/sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,+BAA+B,CAAA;IAC3C,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,iBAAiB,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,yBAAyB,CAA8B;;IAM/D;;OAEG;IACH,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,QAAQ;IAgDjD;;OAEG;IACG,qBAAqB,CACzB,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,aAAa,CAAC,GACnE,OAAO,CAAC,IAAI,CAAC;IAmEhB;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IASvC;;OAEG;IACH,kBAAkB,IAAI;QACpB,gBAAgB,EAAE,MAAM,CAAA;QACxB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxC,aAAa,EAAE,MAAM,CAAA;QACrB,YAAY,EAAE,YAAY,EAAE,CAAA;KAC7B;IAsBD;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA6C7B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAuC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,IAAI,IAAI;CAqBhB;AAKD;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,QAAQ,CAGhE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,aAAa,CAAC,GACnE,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGtD"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Drizzle database instance type
|
|
4
|
+
* Uses a minimal interface to avoid tight coupling with specific Drizzle versions
|
|
5
|
+
*/
|
|
6
|
+
export interface DrizzleDatabase {
|
|
7
|
+
execute: (query: unknown, params?: unknown[]) => Promise<unknown>;
|
|
8
|
+
select: (...args: unknown[]) => unknown;
|
|
9
|
+
insert: (...args: unknown[]) => unknown;
|
|
10
|
+
update: (...args: unknown[]) => unknown;
|
|
11
|
+
delete: (...args: unknown[]) => unknown;
|
|
12
|
+
/** Allow index access for dynamic method calls */
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Core reactive database configuration
|
|
17
|
+
*/
|
|
18
|
+
export interface ReactiveConfig {
|
|
19
|
+
/** Table relationships for automatic invalidation */
|
|
20
|
+
relations: Record<string, string[]>;
|
|
21
|
+
/** Cache configuration (optional - smart defaults used) */
|
|
22
|
+
cache?: {
|
|
23
|
+
server?: {
|
|
24
|
+
provider?: 'redis' | 'memory';
|
|
25
|
+
};
|
|
26
|
+
client?: {
|
|
27
|
+
provider?: 'localStorage' | 'sessionStorage';
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
/** Real-time configuration (optional - SSE enabled by default) */
|
|
31
|
+
realtime?: {
|
|
32
|
+
enabled?: boolean;
|
|
33
|
+
transport?: 'sse';
|
|
34
|
+
fallback?: 'polling';
|
|
35
|
+
reliability?: {
|
|
36
|
+
acknowledgments?: boolean;
|
|
37
|
+
maxRetries?: number;
|
|
38
|
+
retryDelays?: number[];
|
|
39
|
+
periodicHeartbeat?: false;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Reactive database instance
|
|
45
|
+
*/
|
|
46
|
+
export interface ReactiveDb<TDrizzle extends DrizzleDatabase = DrizzleDatabase> {
|
|
47
|
+
/** Original Drizzle database instance */
|
|
48
|
+
db: TDrizzle;
|
|
49
|
+
/** Configuration */
|
|
50
|
+
config: ReactiveConfig;
|
|
51
|
+
/** Execute query with reactive features */
|
|
52
|
+
query: <T>(sql: string, params?: unknown[]) => Promise<T>;
|
|
53
|
+
/** Get cache provider */
|
|
54
|
+
getCache: () => CacheProvider;
|
|
55
|
+
/** Subscribe to invalidation events */
|
|
56
|
+
subscribe: (organizationId: string, callback: InvalidationCallback) => () => void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Cache provider interface
|
|
60
|
+
*/
|
|
61
|
+
export interface CacheProvider {
|
|
62
|
+
get<T>(key: string): Promise<T | null>;
|
|
63
|
+
set<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
64
|
+
del(key: string): Promise<void>;
|
|
65
|
+
invalidate(pattern: string): Promise<void>;
|
|
66
|
+
clear(): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* SQL analysis result
|
|
70
|
+
*/
|
|
71
|
+
export interface SqlAnalysis {
|
|
72
|
+
/** Table name */
|
|
73
|
+
table: string;
|
|
74
|
+
/** Operation type */
|
|
75
|
+
operation: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE';
|
|
76
|
+
/** WHERE condition keys */
|
|
77
|
+
whereKeys: string[];
|
|
78
|
+
/** Affected columns */
|
|
79
|
+
columns: string[];
|
|
80
|
+
/** Organization ID if detected */
|
|
81
|
+
organizationId?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Query metadata for caching
|
|
85
|
+
*/
|
|
86
|
+
export interface QueryMetadata {
|
|
87
|
+
/** Unique query key */
|
|
88
|
+
key: string;
|
|
89
|
+
/** Tables this query depends on */
|
|
90
|
+
dependencies: string[];
|
|
91
|
+
/** Last execution timestamp */
|
|
92
|
+
lastExecuted: number;
|
|
93
|
+
/** Cache TTL in seconds */
|
|
94
|
+
ttl?: number;
|
|
95
|
+
/** Organization scope */
|
|
96
|
+
organizationId?: string;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Invalidation event
|
|
100
|
+
*/
|
|
101
|
+
export interface InvalidationEvent {
|
|
102
|
+
/** Event type */
|
|
103
|
+
type: 'invalidation';
|
|
104
|
+
/** Affected table */
|
|
105
|
+
table: string;
|
|
106
|
+
/** Organization ID */
|
|
107
|
+
organizationId: string;
|
|
108
|
+
/** Affected query keys */
|
|
109
|
+
affectedQueries: string[];
|
|
110
|
+
/** Event ID for acknowledgment */
|
|
111
|
+
eventId: string;
|
|
112
|
+
/** Whether this event requires acknowledgment */
|
|
113
|
+
requiresAck: boolean;
|
|
114
|
+
/** Timestamp */
|
|
115
|
+
timestamp: number;
|
|
116
|
+
/** SQL operation type (INSERT, UPDATE, DELETE) */
|
|
117
|
+
operation?: string;
|
|
118
|
+
/** Affected keys from WHERE clause */
|
|
119
|
+
affectedKeys?: string[];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Invalidation callback
|
|
123
|
+
*/
|
|
124
|
+
export type InvalidationCallback = (event: InvalidationEvent) => void;
|
|
125
|
+
/**
|
|
126
|
+
* Client-side query registry
|
|
127
|
+
*/
|
|
128
|
+
export interface QueryRegistry {
|
|
129
|
+
/** Organization ID */
|
|
130
|
+
organizationId: string;
|
|
131
|
+
/** Cached queries */
|
|
132
|
+
queries: {
|
|
133
|
+
[queryKey: string]: {
|
|
134
|
+
lastRevalidated: number;
|
|
135
|
+
lastServerChange?: number;
|
|
136
|
+
data?: unknown;
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
/** Session information */
|
|
140
|
+
session: {
|
|
141
|
+
startTime: number;
|
|
142
|
+
lastSync: number;
|
|
143
|
+
realtimeConnected: boolean;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Context passed to reactive function handlers
|
|
148
|
+
*/
|
|
149
|
+
export interface ReactiveFunctionContext<TInput = unknown> {
|
|
150
|
+
input: TInput;
|
|
151
|
+
db: ReactiveDb;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Reactive function definition
|
|
155
|
+
*/
|
|
156
|
+
export interface ReactiveFunctionDefinition<TInput = unknown, TOutput = unknown> {
|
|
157
|
+
/** Unique function ID */
|
|
158
|
+
id: string;
|
|
159
|
+
/** Input validation schema */
|
|
160
|
+
input: z.ZodSchema<TInput>;
|
|
161
|
+
/** Tables this function reads from */
|
|
162
|
+
dependencies: string[];
|
|
163
|
+
/** Optional fine-grained invalidation rules */
|
|
164
|
+
invalidateWhen?: Record<string, (change: TableChange) => boolean>;
|
|
165
|
+
/** Function handler */
|
|
166
|
+
handler: (ctx: ReactiveFunctionContext<TInput>) => Promise<TOutput>;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Table change information
|
|
170
|
+
*/
|
|
171
|
+
export interface TableChange {
|
|
172
|
+
/** Table name */
|
|
173
|
+
table: string;
|
|
174
|
+
/** Operation type */
|
|
175
|
+
operation: 'INSERT' | 'UPDATE' | 'DELETE';
|
|
176
|
+
/** Affected keys/IDs */
|
|
177
|
+
keys: string[];
|
|
178
|
+
/** Organization ID */
|
|
179
|
+
organizationId?: string;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Hook state
|
|
183
|
+
*/
|
|
184
|
+
export interface HookState {
|
|
185
|
+
/** Query key */
|
|
186
|
+
queryKey: string;
|
|
187
|
+
/** Is currently active */
|
|
188
|
+
isActive: boolean;
|
|
189
|
+
/** Last access time */
|
|
190
|
+
lastAccess: number;
|
|
191
|
+
/** Dependencies */
|
|
192
|
+
dependencies: string[];
|
|
193
|
+
/** Organization scope */
|
|
194
|
+
organizationId?: string;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|