@agelum/backend 0.1.3 → 0.1.4

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.
@@ -1,7 +1,7 @@
1
- import { analyzeSql } from './analyzer.js';
2
- import { MemoryProvider } from '../providers/memory.js';
3
- import { RedisProvider } from '../providers/redis.js';
4
- import { broadcastInvalidation } from './sse.js';
1
+ import { analyzeSql } from "./analyzer.js";
2
+ import { MemoryProvider } from "../providers/memory.js";
3
+ import { RedisProvider } from "../providers/redis.js";
4
+ import { broadcastInvalidation } from "./sse.js";
5
5
  /**
6
6
  * Reactive SQL driver that intercepts all Drizzle operations
7
7
  */
@@ -15,16 +15,19 @@ class ReactiveSqlDriver {
15
15
  this.originalDb = originalDb;
16
16
  this.config = config;
17
17
  // Initialize cache provider based on config
18
- this.cache = this.initializeCacheProvider();
18
+ this.cache =
19
+ this.initializeCacheProvider();
19
20
  // Wrap the original database methods
20
21
  this.wrapDrizzleMethods();
21
22
  }
22
23
  initializeCacheProvider() {
23
- const provider = this.config.cache?.server?.provider || 'memory';
24
+ const provider = this.config.cache?.server
25
+ ?.provider || "memory";
24
26
  switch (provider) {
25
- case 'redis':
26
- return new RedisProvider();
27
- case 'memory':
27
+ case "redis":
28
+ return new RedisProvider(this.config.cache?.server
29
+ ?.redis);
30
+ case "memory":
28
31
  default:
29
32
  return new MemoryProvider();
30
33
  }
@@ -33,16 +36,24 @@ class ReactiveSqlDriver {
33
36
  // Intercept the execute method which is the core SQL execution point
34
37
  if (this.originalDb.execute) {
35
38
  const originalExecute = this.originalDb.execute.bind(this.originalDb);
36
- this.originalDb.execute = async (query, params) => {
37
- return this.interceptQuery(query, params, () => originalExecute(query, params));
38
- };
39
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
+ this.originalDb.execute =
41
+ async (query, params) => {
42
+ return this.interceptQuery(query, params, () => originalExecute(query, params));
43
+ };
39
44
  }
40
45
  // Intercept select/insert/update/delete methods
41
- const methods = ['select', 'insert', 'update', 'delete'];
46
+ const methods = [
47
+ "select",
48
+ "insert",
49
+ "update",
50
+ "delete",
51
+ ];
42
52
  methods.forEach((method) => {
43
53
  const dbMethod = this.originalDb[method];
44
54
  if (dbMethod) {
45
55
  const originalMethod = dbMethod.bind(this.originalDb);
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
57
  this.originalDb[method] = (...args) => {
47
58
  const queryBuilder = originalMethod(...args);
48
59
  return this.wrapQueryBuilder(queryBuilder, method.toUpperCase());
@@ -54,33 +65,48 @@ class ReactiveSqlDriver {
54
65
  // Wrap query execution methods
55
66
  if (queryBuilder.execute) {
56
67
  const originalExecute = queryBuilder.execute.bind(queryBuilder);
57
- queryBuilder.execute = async () => {
58
- const sql = queryBuilder.toSQL?.() || { sql: 'unknown', params: [] };
59
- return this.interceptQuery(sql, sql.params, originalExecute);
60
- };
68
+ queryBuilder.execute =
69
+ async () => {
70
+ const sql = queryBuilder.toSQL?.() || {
71
+ sql: "unknown",
72
+ params: [],
73
+ };
74
+ return this.interceptQuery(sql, sql.params, originalExecute);
75
+ };
61
76
  }
62
77
  // Wrap other execution methods like .all(), .get(), etc.
63
- const execMethods = ['all', 'get', 'run', 'values'];
78
+ const execMethods = [
79
+ "all",
80
+ "get",
81
+ "run",
82
+ "values",
83
+ ];
64
84
  execMethods.forEach((method) => {
65
85
  if (queryBuilder[method]) {
66
86
  const originalMethod = queryBuilder[method].bind(queryBuilder);
67
- queryBuilder[method] = async () => {
68
- const sql = queryBuilder.toSQL?.() || { sql: 'unknown', params: [] };
69
- return this.interceptQuery(sql, sql.params, originalMethod);
70
- };
87
+ queryBuilder[method] =
88
+ async () => {
89
+ const sql = queryBuilder.toSQL?.() || {
90
+ sql: "unknown",
91
+ params: [],
92
+ };
93
+ return this.interceptQuery(sql, sql.params, originalMethod);
94
+ };
71
95
  }
72
96
  });
73
97
  return queryBuilder;
74
98
  }
75
99
  async interceptQuery(query, params = [], originalExecute) {
76
100
  // Extract SQL string from query object or use directly
77
- const sqlString = typeof query === 'string' ? query : query.sql || 'unknown';
101
+ const sqlString = typeof query === "string"
102
+ ? query
103
+ : query.sql || "unknown";
78
104
  const queryParams = params || query.params || [];
79
105
  // Analyze the SQL to understand what it does
80
106
  const analysis = analyzeSql(sqlString, queryParams);
81
107
  const cacheKey = this.generateCacheKey(analysis, queryParams);
82
108
  // Handle SELECT queries with caching
83
- if (analysis.operation === 'SELECT') {
109
+ if (analysis.operation === "SELECT") {
84
110
  return this.handleSelectQuery(analysis, cacheKey, originalExecute);
85
111
  }
86
112
  // Handle mutations (INSERT/UPDATE/DELETE) with invalidation
@@ -94,7 +120,7 @@ class ReactiveSqlDriver {
94
120
  JSON.stringify(analysis.whereKeys.sort()),
95
121
  JSON.stringify(params),
96
122
  ];
97
- return keyParts.join(':');
123
+ return keyParts.join(":");
98
124
  }
99
125
  async handleSelectQuery(analysis, cacheKey, originalExecute) {
100
126
  // Try to get from cache first
@@ -131,11 +157,15 @@ class ReactiveSqlDriver {
131
157
  }
132
158
  async invalidateRelatedQueries(analysis) {
133
159
  const { table } = analysis;
134
- const relatedTables = this.config.relations[table] || [];
160
+ const relatedTables = this.config.relations[table] ||
161
+ [];
135
162
  // Find all queries that depend on this table or related tables
136
- const tablesToInvalidate = [table, ...relatedTables];
163
+ const tablesToInvalidate = [
164
+ table,
165
+ ...relatedTables,
166
+ ];
137
167
  const keysToInvalidate = [];
138
- for (const [cacheKey, metadata] of this.queryMetadata.entries()) {
168
+ for (const [cacheKey, metadata,] of this.queryMetadata.entries()) {
139
169
  const shouldInvalidate = metadata.dependencies.some((dep) => tablesToInvalidate.includes(dep));
140
170
  if (shouldInvalidate) {
141
171
  keysToInvalidate.push(cacheKey);
@@ -146,6 +176,33 @@ class ReactiveSqlDriver {
146
176
  await Promise.all(keysToInvalidate.map((key) => this.cache.del(key)));
147
177
  // Remove metadata for invalidated queries
148
178
  keysToInvalidate.forEach((key) => this.queryMetadata.delete(key));
179
+ await this.invalidateReactiveFunctionCaches(tablesToInvalidate);
180
+ }
181
+ functionDependencyIndexKey(table) {
182
+ return `@agelum/backend:function-dependency:${table}`;
183
+ }
184
+ async invalidateReactiveFunctionCaches(tablesToInvalidate) {
185
+ const dependencyIndex = new Map();
186
+ const keysToInvalidate = new Set();
187
+ for (const table of tablesToInvalidate) {
188
+ const indexKey = this.functionDependencyIndexKey(table);
189
+ const keys = (await this.cache.get(indexKey)) || [];
190
+ dependencyIndex.set(table, keys);
191
+ keys.forEach((key) => keysToInvalidate.add(key));
192
+ }
193
+ if (keysToInvalidate.size === 0) {
194
+ return;
195
+ }
196
+ await Promise.all(Array.from(keysToInvalidate).map((key) => this.cache.del(key)));
197
+ await Promise.all(Array.from(dependencyIndex.entries()).map(async ([table, keys]) => {
198
+ const remaining = keys.filter((key) => !keysToInvalidate.has(key));
199
+ const indexKey = this.functionDependencyIndexKey(table);
200
+ if (remaining.length === 0) {
201
+ await this.cache.del(indexKey);
202
+ return;
203
+ }
204
+ await this.cache.set(indexKey, remaining);
205
+ }));
149
206
  }
150
207
  async broadcastInvalidation(analysis) {
151
208
  const { table, organizationId } = analysis;
@@ -156,7 +213,7 @@ class ReactiveSqlDriver {
156
213
  return;
157
214
  // Create invalidation event
158
215
  const event = {
159
- type: 'invalidation',
216
+ type: "invalidation",
160
217
  table,
161
218
  organizationId,
162
219
  affectedQueries: Array.from(this.queryMetadata.keys()).filter((key) => {
@@ -173,13 +230,13 @@ class ReactiveSqlDriver {
173
230
  callback(event);
174
231
  }
175
232
  catch (error) {
176
- console.error('[ReactiveDB] Error in invalidation callback:', error);
233
+ console.error("[ReactiveDB] Error in invalidation callback:", error);
177
234
  }
178
235
  });
179
236
  // Broadcast to SSE subscribers for real-time updates
180
237
  try {
181
238
  await broadcastInvalidation(organizationId, {
182
- type: 'invalidation',
239
+ type: "invalidation",
183
240
  table,
184
241
  organizationId,
185
242
  affectedQueries: event.affectedQueries,
@@ -190,19 +247,19 @@ class ReactiveSqlDriver {
190
247
  console.log(`[ReactiveDriver] SSE broadcast sent for org: ${organizationId}, table: ${table}`);
191
248
  }
192
249
  catch (error) {
193
- console.warn('[ReactiveDriver] SSE broadcast failed:', error);
250
+ console.warn("[ReactiveDriver] SSE broadcast failed:", error);
194
251
  // Continue execution - local invalidation still works
195
252
  }
196
253
  }
197
254
  getTtlForTable(table) {
198
255
  // Smart TTL based on table type
199
256
  switch (table) {
200
- case 'agent':
201
- case 'organization':
257
+ case "agent":
258
+ case "organization":
202
259
  return 300; // 5 minutes for relatively stable data
203
- case 'message':
260
+ case "message":
204
261
  return 60; // 1 minute for frequently changing data
205
- case 'memory':
262
+ case "memory":
206
263
  return 180; // 3 minutes for memory data
207
264
  default:
208
265
  return 120; // 2 minutes default
@@ -221,7 +278,9 @@ class ReactiveSqlDriver {
221
278
  if (!this.subscribers.has(organizationId)) {
222
279
  this.subscribers.set(organizationId, new Set());
223
280
  }
224
- this.subscribers.get(organizationId).add(callback);
281
+ this.subscribers
282
+ .get(organizationId)
283
+ .add(callback);
225
284
  // Return unsubscribe function
226
285
  return () => {
227
286
  const orgSubscribers = this.subscribers.get(organizationId);
@@ -236,16 +295,50 @@ class ReactiveSqlDriver {
236
295
  getOriginalDb() {
237
296
  return this.originalDb;
238
297
  }
298
+ /**
299
+ * Execute operations within a database transaction (Option 3)
300
+ * Provides fine-grained transaction control with optional replication mode
301
+ */
302
+ async transaction(options, callback) {
303
+ // Check if the database supports transactions
304
+ const dbTransaction = this.originalDb.transaction;
305
+ if (typeof dbTransaction !== "function") {
306
+ console.warn("[ReactiveDB] Database does not support transactions, executing without transaction wrapper");
307
+ return callback(this.originalDb);
308
+ }
309
+ // Execute within a transaction
310
+ return dbTransaction.call(this.originalDb, async (tx) => {
311
+ // Set replication mode if specified (PostgreSQL specific)
312
+ if (options.replicationMode) {
313
+ try {
314
+ const syncCommitValue = options.replicationMode ===
315
+ "sync"
316
+ ? "remote_apply"
317
+ : "local";
318
+ console.log(`[ReactiveDB] Setting synchronous_commit = '${syncCommitValue}' for transaction`);
319
+ // Use SET LOCAL to only affect current transaction
320
+ await tx.execute?.(`SET LOCAL synchronous_commit = '${syncCommitValue}'`);
321
+ }
322
+ catch (error) {
323
+ console.warn("[ReactiveDB] Failed to set synchronous_commit (database may not support it):", error);
324
+ // Continue with transaction even if setting fails
325
+ }
326
+ }
327
+ return callback(tx);
328
+ });
329
+ }
239
330
  }
240
331
  /**
241
332
  * Create a reactive database instance
242
333
  * This is the main entry point for the library
243
334
  */
244
335
  export function createReactiveDb(drizzleDb, config) {
245
- console.log('[ReactiveDB] Initializing reactive database with config:', {
336
+ console.log("[ReactiveDB] Initializing reactive database with config:", {
246
337
  relations: Object.keys(config.relations),
247
- cacheProvider: config.cache?.server?.provider || 'memory',
248
- realtimeEnabled: config.realtime?.enabled ?? true,
338
+ cacheProvider: config.cache?.server
339
+ ?.provider || "memory",
340
+ realtimeEnabled: config.realtime?.enabled ??
341
+ true,
249
342
  });
250
343
  const driver = new ReactiveSqlDriver(drizzleDb, config);
251
344
  return {
@@ -254,6 +347,7 @@ export function createReactiveDb(drizzleDb, config) {
254
347
  query: driver.query.bind(driver),
255
348
  getCache: driver.getCache.bind(driver),
256
349
  subscribe: driver.subscribe.bind(driver),
350
+ transaction: driver.transaction.bind(driver),
257
351
  };
258
352
  }
259
353
  //# sourceMappingURL=driver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/core/driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/core/driver.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD;;GAEG;AACH,MAAM,iBAAiB;IAcX;IACA;IAZF,KAAK,CAAgB;IACrB,WAAW,GAAG,IAAI,GAAG,EAG1B,CAAC;IACI,aAAa,GAAG,IAAI,GAAG,EAG5B,CAAC;IAEJ,YACU,UAAoB,EACpB,MAAsB;QADtB,eAAU,GAAV,UAAU,CAAU;QACpB,WAAM,GAAN,MAAM,CAAgB;QAE9B,4CAA4C;QAC5C,IAAI,CAAC,KAAK;YACR,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAEjC,qCAAqC;QACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAEO,uBAAuB;QAC7B,MAAM,QAAQ,GACZ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;YACvB,EAAE,QAAQ,IAAI,QAAQ,CAAC;QAE3B,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,OAAO;gBACV,OAAO,IAAI,aAAa,CACtB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;oBACvB,EAAE,KAAK,CACV,CAAC;YACJ,KAAK,QAAQ,CAAC;YACd;gBACE,OAAO,IAAI,cAAc,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,qEAAqE;QACrE,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,eAAe,GACnB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAC1B,IAAI,CAAC,UAAU,CAII,CAAC;YACxB,8DAA8D;YAC7D,IAAI,CAAC,UAAkB,CAAC,OAAO;gBAC9B,KAAK,EACH,KAAc,EACd,MAAkB,EAClB,EAAE;oBACF,OAAO,IAAI,CAAC,cAAc,CACxB,KAAK,EACL,MAAM,EACN,GAAG,EAAE,CACH,eAAe,CACb,KAAK,EACL,MAAM,CACP,CACJ,CAAC;gBACJ,CAAC,CAAC;QACN,CAAC;QAED,gDAAgD;QAChD,MAAM,OAAO,GAAG;YACd,QAAQ;YACR,QAAQ;YACR,QAAQ;YACR,QAAQ;SACA,CAAC;QACX,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,MAAM,QAAQ,GACZ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,cAAc,GAClB,QAGD,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxB,8DAA8D;gBAC7D,IAAI,CAAC,UAAkB,CACtB,MAAM,CACP,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;oBACzB,MAAM,YAAY,GAChB,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;oBAC1B,OAAO,IAAI,CAAC,gBAAgB,CAC1B,YAAY,EACZ,MAAM,CAAC,WAAW,EAAE,CACrB,CAAC;gBACJ,CAAC,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB,CACtB,YAAiB,EACjB,SAAiB;QAEjB,+BAA+B;QAC/B,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,eAAe,GACnB,YAAY,CAAC,OAAO,CAAC,IAAI,CACvB,YAAY,CACb,CAAC;YACJ,YAAY,CAAC,OAAO;gBAClB,KAAK,IAAI,EAAE;oBACT,MAAM,GAAG,GACP,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI;wBACxB,GAAG,EAAE,SAAS;wBACd,MAAM,EAAE,EAAE;qBACX,CAAC;oBACJ,OAAO,IAAI,CAAC,cAAc,CACxB,GAAG,EACH,GAAG,CAAC,MAAM,EACV,eAAe,CAChB,CAAC;gBACJ,CAAC,CAAC;QACN,CAAC;QAED,yDAAyD;QACzD,MAAM,WAAW,GAAG;YAClB,KAAK;YACL,KAAK;YACL,KAAK;YACL,QAAQ;SACT,CAAC;QACF,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,MAAM,cAAc,GAClB,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CACvB,YAAY,CACb,CAAC;gBACJ,YAAY,CAAC,MAAM,CAAC;oBAClB,KAAK,IAAI,EAAE;wBACT,MAAM,GAAG,GACP,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI;4BACxB,GAAG,EAAE,SAAS;4BACd,MAAM,EAAE,EAAE;yBACX,CAAC;wBACJ,OAAO,IAAI,CAAC,cAAc,CACxB,GAAG,EACH,GAAG,CAAC,MAAM,EACV,cAAc,CACf,CAAC;oBACJ,CAAC,CAAC;YACN,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,KAAU,EACV,SAAgB,EAAE,EAClB,eAAmC;QAEnC,uDAAuD;QACvD,MAAM,SAAS,GACb,OAAO,KAAK,KAAK,QAAQ;YACvB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,SAAS,CAAC;QAC7B,MAAM,WAAW,GACf,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAE/B,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,UAAU,CACzB,SAAS,EACT,WAAW,CACZ,CAAC;QACF,MAAM,QAAQ,GACZ,IAAI,CAAC,gBAAgB,CACnB,QAAQ,EACR,WAAW,CACZ,CAAC;QAEJ,qCAAqC;QACrC,IACE,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAC/B,CAAC;YACD,OAAO,IAAI,CAAC,iBAAiB,CAC3B,QAAQ,EACR,QAAQ,EACR,eAAe,CAChB,CAAC;QACJ,CAAC;QAED,4DAA4D;QAC5D,OAAO,IAAI,CAAC,mBAAmB,CAC7B,QAAQ,EACR,eAAe,CAChB,CAAC;IACJ,CAAC;IAEO,gBAAgB,CACtB,QAAqB,EACrB,MAAa;QAEb,kDAAkD;QAClD,MAAM,QAAQ,GAAG;YACf,QAAQ,CAAC,KAAK;YACd,QAAQ,CAAC,SAAS;YAClB,IAAI,CAAC,SAAS,CACZ,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAC1B;YACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;SACvB,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,QAAqB,EACrB,QAAgB,EAChB,eAAmC;QAEnC,8BAA8B;QAC9B,MAAM,MAAM,GACV,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CACT,8BAA8B,QAAQ,CAAC,KAAK,EAAE,CAC/C,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CACT,+CAA+C,QAAQ,CAAC,KAAK,EAAE,CAChE,CAAC;QACF,MAAM,MAAM,GACV,MAAM,eAAe,EAAE,CAAC;QAE1B,mBAAmB;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAC7B,QAAQ,CAAC,KAAK,CACf,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,QAAQ,EACR,MAAM,EACN,GAAG,CACJ,CAAC;QAEF,wCAAwC;QACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE;YAC/B,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC9B,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;YACxB,GAAG;YACH,cAAc,EACZ,QAAQ,CAAC,cAAc;SAC1B,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAC/B,QAAqB,EACrB,eAAmC;QAEnC,OAAO,CAAC,GAAG,CACT,sCAAsC,QAAQ,CAAC,SAAS,OAAO,QAAQ,CAAC,KAAK,oCAAoC,CAClH,CAAC;QAEF,uBAAuB;QACvB,MAAM,MAAM,GACV,MAAM,eAAe,EAAE,CAAC;QAE1B,6BAA6B;QAC7B,MAAM,IAAI,CAAC,wBAAwB,CACjC,QAAQ,CACT,CAAC;QAEF,gCAAgC;QAChC,MAAM,IAAI,CAAC,qBAAqB,CAC9B,QAAQ,CACT,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,QAAqB;QAErB,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;QAC3B,MAAM,aAAa,GACjB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;YAC5B,EAAE,CAAC;QAEL,+DAA+D;QAC/D,MAAM,kBAAkB,GAAG;YACzB,KAAK;YACL,GAAG,aAAa;SACjB,CAAC;QACF,MAAM,gBAAgB,GACpB,EAAE,CAAC;QAEL,KAAK,MAAM,CACT,QAAQ,EACR,QAAQ,EACT,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;YAClC,MAAM,gBAAgB,GACpB,QAAQ,CAAC,YAAY,CAAC,IAAI,CACxB,CAAC,GAAG,EAAE,EAAE,CACN,kBAAkB,CAAC,QAAQ,CACzB,GAAG,CACJ,CACJ,CAAC;YAEJ,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,OAAO,CAAC,GAAG,CACT,6BAA6B,gBAAgB,CAAC,MAAM,uBAAuB,KAAK,EAAE,CACnF,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CACf,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CACpB,CACF,CAAC;QAEF,0CAA0C;QAC1C,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAC/B,CAAC;QAEF,MAAM,IAAI,CAAC,gCAAgC,CACzC,kBAAkB,CACnB,CAAC;IACJ,CAAC;IAEO,0BAA0B,CAChC,KAAa;QAEb,OAAO,uCAAuC,KAAK,EAAE,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,gCAAgC,CAC5C,kBAA4B;QAE5B,MAAM,eAAe,GAAG,IAAI,GAAG,EAG5B,CAAC;QACJ,MAAM,gBAAgB,GACpB,IAAI,GAAG,EAAU,CAAC;QAEpB,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;YACvC,MAAM,QAAQ,GACZ,IAAI,CAAC,0BAA0B,CAC7B,KAAK,CACN,CAAC;YACJ,MAAM,IAAI,GACR,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CACnB,QAAQ,CACT,CAAC,IAAI,EAAE,CAAC;YACX,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CACnB,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAC1B,CAAC;QACJ,CAAC;QAED,IAAI,gBAAgB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAC9B,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAC7B,CACF,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CACR,eAAe,CAAC,OAAO,EAAE,CAC1B,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAC3B,CAAC,GAAG,EAAE,EAAE,CACN,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAC7B,CAAC;YACF,MAAM,QAAQ,GACZ,IAAI,CAAC,0BAA0B,CAC7B,KAAK,CACN,CAAC;YACJ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,QAAQ,CACT,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,QAAQ,EACR,SAAS,CACV,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,QAAqB;QAErB,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAC7B,QAAQ,CAAC;QAEX,IAAI,CAAC,cAAc;YAAE,OAAO;QAE5B,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,cAAc,CACf,CAAC;QACJ,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,4BAA4B;QAC5B,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,cAAuB;YAC7B,KAAK;YACL,cAAc;YACd,eAAe,EAAE,KAAK,CAAC,IAAI,CACzB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAC1B,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBACf,MAAM,QAAQ,GACZ,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9B,OAAO,QAAQ,EAAE,YAAY,CAAC,QAAQ,CACpC,KAAK,CACN,CAAC;YACJ,CAAC,CAAC;YACF,OAAO,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACvE,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,yBAAyB;QACzB,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC/B,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CACX,8CAA8C,EAC9C,KAAK,CACN,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,IAAI,CAAC;YACH,MAAM,qBAAqB,CACzB,cAAc,EACd;gBACE,IAAI,EAAE,cAAc;gBACpB,KAAK;gBACL,cAAc;gBACd,eAAe,EACb,KAAK,CAAC,eAAe;gBACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,YAAY,EACV,QAAQ,CAAC,SAAS;aACrB,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,gDAAgD,cAAc,YAAY,KAAK,EAAE,CAClF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,wCAAwC,EACxC,KAAK,CACN,CAAC;YACF,sDAAsD;QACxD,CAAC;IACH,CAAC;IAEO,cAAc,CACpB,KAAa;QAEb,gCAAgC;QAChC,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,OAAO,CAAC;YACb,KAAK,cAAc;gBACjB,OAAO,GAAG,CAAC,CAAC,uCAAuC;YACrD,KAAK,SAAS;gBACZ,OAAO,EAAE,CAAC,CAAC,wCAAwC;YACrD,KAAK,QAAQ;gBACX,OAAO,GAAG,CAAC,CAAC,4BAA4B;YAC1C;gBACE,OAAO,GAAG,CAAC,CAAC,oBAAoB;QACpC,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,KAAK,CACT,GAAW,EACX,MAAc;QAEd,OAAO,IAAI,CAAC,cAAc,CACxB,GAAG,EACH,MAAM,EACN,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAClC,GAAG,EACH,MAAM,CACP,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,SAAS,CACP,cAAsB,EACtB,QAA8B;QAE9B,IACE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CACnB,cAAc,CACf,EACD,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,cAAc,EACd,IAAI,GAAG,EAAE,CACV,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,WAAW;aACb,GAAG,CAAC,cAAc,CAAE;aACpB,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEjB,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,MAAM,cAAc,GAClB,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,cAAc,CACf,CAAC;YACJ,IAAI,cAAc,EAAE,CAAC;gBACnB,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBAC9B,IAAI,CAAC,WAAW,CAAC,MAAM,CACrB,cAAc,CACf,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,OAA2B,EAC3B,QAEe;QAEf,8CAA8C;QAC9C,MAAM,aAAa,GACjB,IAAI,CAAC,UACN,CAAC,WAAW,CAAC;QACd,IACE,OAAO,aAAa,KAAK,UAAU,EACnC,CAAC;YACD,OAAO,CAAC,IAAI,CACV,4FAA4F,CAC7F,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;QAED,+BAA+B;QAC/B,OAAO,aAAa,CAAC,IAAI,CACvB,IAAI,CAAC,UAAU,EACf,KAAK,EAAE,EAAY,EAAE,EAAE;YACrB,0DAA0D;YAC1D,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,eAAe,GACnB,OAAO,CAAC,eAAe;wBACvB,MAAM;wBACJ,CAAC,CAAC,cAAc;wBAChB,CAAC,CAAC,OAAO,CAAC;oBAEd,OAAO,CAAC,GAAG,CACT,8CAA8C,eAAe,mBAAmB,CACjF,CAAC;oBAEF,mDAAmD;oBACnD,MAAO,EAAU,CAAC,OAAO,EAAE,CACzB,mCAAmC,eAAe,GAAG,CACtD,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CACV,8EAA8E,EAC9E,KAAK,CACN,CAAC;oBACF,kDAAkD;gBACpD,CAAC;YACH,CAAC;YAED,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC,CACF,CAAC;IACJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAG9B,SAAmB,EACnB,MAAsB;IAEtB,OAAO,CAAC,GAAG,CACT,0DAA0D,EAC1D;QACE,SAAS,EAAE,MAAM,CAAC,IAAI,CACpB,MAAM,CAAC,SAAS,CACjB;QACD,aAAa,EACX,MAAM,CAAC,KAAK,EAAE,MAAM;YAClB,EAAE,QAAQ,IAAI,QAAQ;QAC1B,eAAe,EACb,MAAM,CAAC,QAAQ,EAAE,OAAO;YACxB,IAAI;KACP,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAClC,SAAS,EACT,MAAM,CACP,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,aAAa,EAAE;QAC1B,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,QAAQ,EACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B,SAAS,EACP,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B,WAAW,EACT,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;KAClC,CAAC;AACJ,CAAC"}
@@ -2,8 +2,8 @@
2
2
  * Define reactive functions with explicit dependencies
3
3
  * Core building block that works both standalone and with tRPC
4
4
  */
5
- import { z } from 'zod';
6
- import type { ReactiveDb, ReactiveFunctionContext } from './types.js';
5
+ import { z } from "zod";
6
+ import type { ReactiveDb, ReactiveFunctionContext, TransactionConfig, TransactionReplicationMode } from "./types.js";
7
7
  /**
8
8
  * Options passed to tRPC handler
9
9
  */
@@ -19,18 +19,25 @@ export interface ReactiveFunctionConfig<TInput = unknown, TOutput = unknown> {
19
19
  dependencies: string[];
20
20
  /** Optional: Specific invalidation conditions */
21
21
  invalidateWhen?: Record<string, (change: InvalidationChange) => boolean>;
22
+ /** Optional: Enable cache for this function */
23
+ cacheEnabled?: boolean;
22
24
  /** Cache configuration */
23
25
  cache?: {
24
26
  enabled?: boolean;
25
27
  ttl?: number;
26
28
  key?: (input: TInput) => string;
27
29
  };
30
+ /**
31
+ * Optional: Transaction configuration (Option 1 - declarative)
32
+ * When enabled, the handler will be automatically wrapped in a database transaction
33
+ */
34
+ transaction?: TransactionConfig;
28
35
  /** The actual function logic - receives context with input and db */
29
36
  handler: (ctx: ReactiveFunctionContext<TInput>) => Promise<TOutput>;
30
37
  }
31
38
  export interface InvalidationChange {
32
39
  table: string;
33
- operation: 'INSERT' | 'UPDATE' | 'DELETE';
40
+ operation: "INSERT" | "UPDATE" | "DELETE";
34
41
  keys: string[];
35
42
  timestamp: number;
36
43
  }
@@ -54,6 +61,10 @@ export interface ReactiveFunctionMetadata {
54
61
  cacheEnabled: boolean;
55
62
  cacheTtl: number;
56
63
  hasInvalidationRules: boolean;
64
+ /** Whether this function runs in a transaction */
65
+ transactionEnabled: boolean;
66
+ /** Replication mode for transactions */
67
+ transactionReplicationMode?: TransactionReplicationMode;
57
68
  }
58
69
  /**
59
70
  * Define a reactive function - the core building block
@@ -1 +1 @@
1
- {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/core/function.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/core/function.ts"],"names":[],"mappings":"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"}
@@ -8,23 +8,27 @@
8
8
  export function defineReactiveFunction(config) {
9
9
  // Validate configuration
10
10
  if (!config.name) {
11
- throw new Error('ReactiveFunction requires name');
11
+ throw new Error("ReactiveFunction requires name");
12
12
  }
13
13
  if (!config.input) {
14
- throw new Error('ReactiveFunction requires input schema');
14
+ throw new Error("ReactiveFunction requires input schema");
15
15
  }
16
- if (!config.dependencies || config.dependencies.length === 0) {
17
- throw new Error('ReactiveFunction requires dependencies array');
16
+ if (!config.dependencies ||
17
+ config.dependencies.length === 0) {
18
+ throw new Error("ReactiveFunction requires dependencies array");
18
19
  }
19
20
  if (!config.handler) {
20
- throw new Error('ReactiveFunction requires handler function');
21
+ throw new Error("ReactiveFunction requires handler function");
21
22
  }
23
+ const cacheEnabled = config.cacheEnabled ??
24
+ config.cache?.enabled ??
25
+ false;
22
26
  // Default cache configuration
23
27
  const cacheConfig = {
24
- enabled: true,
25
28
  ttl: 300, // 5 minutes default
26
29
  key: (input) => `${config.name}:${JSON.stringify(input)}`,
27
30
  ...config.cache,
31
+ enabled: cacheEnabled,
28
32
  };
29
33
  /**
30
34
  * Execute the function (standalone server-side execution)
@@ -39,13 +43,34 @@ export function defineReactiveFunction(config) {
39
43
  // Check cache if enabled
40
44
  if (cacheConfig.enabled) {
41
45
  const cached = await getCachedResult(db, cacheKey);
42
- if (cached && !isCacheStale(cached, cacheConfig.ttl)) {
46
+ if (cached &&
47
+ !isCacheStale(cached, cacheConfig.ttl)) {
43
48
  console.log(`[ReactiveFunction] Cache hit for ${cacheKey}`);
44
49
  return cached.data;
45
50
  }
46
51
  }
47
- // Execute function handler - clean and simple
48
- const result = await config.handler({ input: validatedInput, db });
52
+ // Execute function handler - with optional transaction wrapping (Option 1)
53
+ let result;
54
+ if (config.transaction?.enabled) {
55
+ // Wrap handler in a transaction
56
+ console.log(`[ReactiveFunction] Executing ${config.name} in transaction (replicationMode: ${config.transaction.replicationMode ?? "default"})`);
57
+ result = await db.transaction({
58
+ replicationMode: config.transaction
59
+ .replicationMode,
60
+ }, async () => {
61
+ return await config.handler({
62
+ input: validatedInput,
63
+ db,
64
+ });
65
+ });
66
+ }
67
+ else {
68
+ // Execute without transaction wrapper
69
+ result = await config.handler({
70
+ input: validatedInput,
71
+ db,
72
+ });
73
+ }
49
74
  // Cache result if enabled
50
75
  if (cacheConfig.enabled) {
51
76
  await cacheResult(db, cacheKey, result, cacheConfig.ttl, {
@@ -75,12 +100,13 @@ export function defineReactiveFunction(config) {
75
100
  return false;
76
101
  }
77
102
  // Check custom invalidation rules
78
- if (config.invalidateWhen && config.invalidateWhen[change.table]) {
103
+ if (config.invalidateWhen &&
104
+ config.invalidateWhen[change.table]) {
79
105
  try {
80
106
  return config.invalidateWhen[change.table](change);
81
107
  }
82
108
  catch (error) {
83
- console.warn('[ReactiveFunction] Invalidation rule error:', error);
109
+ console.warn("[ReactiveFunction] Invalidation rule error:", error);
84
110
  // Default to invalidate on error for safety
85
111
  return true;
86
112
  }
@@ -98,6 +124,10 @@ export function defineReactiveFunction(config) {
98
124
  cacheEnabled: cacheConfig.enabled,
99
125
  cacheTtl: cacheConfig.ttl,
100
126
  hasInvalidationRules: !!config.invalidateWhen,
127
+ transactionEnabled: config.transaction?.enabled ??
128
+ false,
129
+ transactionReplicationMode: config.transaction
130
+ ?.replicationMode,
101
131
  };
102
132
  };
103
133
  /**
@@ -157,11 +187,13 @@ export class ReactiveFunctionRegistry {
157
187
  */
158
188
  getStats() {
159
189
  const functionsByDependency = {};
160
- for (const [name, fn] of this.functions) {
190
+ for (const [name, fn] of this
191
+ .functions) {
161
192
  const metadata = fn.getMetadata();
162
193
  for (const dep of metadata.dependencies) {
163
194
  if (!functionsByDependency[dep]) {
164
- functionsByDependency[dep] = [];
195
+ functionsByDependency[dep] =
196
+ [];
165
197
  }
166
198
  functionsByDependency[dep].push(name);
167
199
  }
@@ -176,7 +208,7 @@ export class ReactiveFunctionRegistry {
176
208
  */
177
209
  clear() {
178
210
  this.functions.clear();
179
- console.log('[ReactiveRegistry] Cleared all functions');
211
+ console.log("[ReactiveRegistry] Cleared all functions");
180
212
  }
181
213
  }
182
214
  // Global registry instance
@@ -186,7 +218,8 @@ let globalRegistry = null;
186
218
  */
187
219
  export function getReactiveFunctionRegistry() {
188
220
  if (!globalRegistry) {
189
- globalRegistry = new ReactiveFunctionRegistry();
221
+ globalRegistry =
222
+ new ReactiveFunctionRegistry();
190
223
  }
191
224
  return globalRegistry;
192
225
  }
@@ -204,9 +237,12 @@ export function registerReactiveFunction(name, config) {
204
237
  */
205
238
  async function getCachedResult(db, cacheKey) {
206
239
  try {
207
- // In a real implementation, this would use the cache provider
208
- // For now, we simulate cache behavior
209
- return null;
240
+ const cache = db.getCache();
241
+ const cached = await cache.get(cacheKey);
242
+ if (!cached) {
243
+ return null;
244
+ }
245
+ return cached;
210
246
  }
211
247
  catch (error) {
212
248
  console.warn(`[ReactiveFunction] Cache get error:`, error);
@@ -225,21 +261,33 @@ function isCacheStale(cached, ttl) {
225
261
  */
226
262
  async function cacheResult(db, cacheKey, data, ttl, metadata) {
227
263
  try {
228
- // In a real implementation, this would use the cache provider
229
264
  console.log(`[ReactiveFunction] Caching result for ${cacheKey} with TTL ${ttl}s`);
230
- // Store with metadata for invalidation
231
265
  const cacheEntry = {
232
266
  data,
233
267
  timestamp: Date.now(),
234
- ttl: ttl * 1000,
235
268
  metadata,
236
269
  };
237
- // This would actually cache the data
238
- // await db.setCache(cacheKey, cacheEntry, ttl)
239
- void cacheEntry; // Suppress unused variable warning until implemented
270
+ const cache = db.getCache();
271
+ await cache.set(cacheKey, cacheEntry, ttl);
272
+ await updateDependencyIndex(cache, metadata.dependencies, cacheKey);
240
273
  }
241
274
  catch (error) {
242
275
  console.warn(`[ReactiveFunction] Cache set error:`, error);
243
276
  }
244
277
  }
278
+ const functionDependencyIndexKey = (dependency) => `@agelum/backend:function-dependency:${dependency}`;
279
+ async function updateDependencyIndex(cache, dependencies, cacheKey) {
280
+ await Promise.all(dependencies.map(async (dependency) => {
281
+ const indexKey = functionDependencyIndexKey(dependency);
282
+ const existing = (await cache.get(indexKey)) || [];
283
+ if (existing.includes(cacheKey)) {
284
+ return;
285
+ }
286
+ const next = [
287
+ ...existing,
288
+ cacheKey,
289
+ ];
290
+ await cache.set(indexKey, next);
291
+ }));
292
+ }
245
293
  //# sourceMappingURL=function.js.map