@agelum/backend 0.1.0 → 0.1.1
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/README.md +184 -113
- package/package.json +13 -13
- package/dist/client/hooks.d.ts +0 -65
- package/dist/client/hooks.d.ts.map +0 -1
- package/dist/client/hooks.js +0 -339
- package/dist/client/hooks.js.map +0 -1
- package/dist/client/index.d.ts +0 -10
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js +0 -37
- package/dist/client/index.js.map +0 -1
- package/dist/client/manager.d.ts +0 -137
- package/dist/client/manager.d.ts.map +0 -1
- package/dist/client/manager.js +0 -292
- package/dist/client/manager.js.map +0 -1
- package/dist/client/provider.d.ts +0 -25
- package/dist/client/provider.d.ts.map +0 -1
- package/dist/client/provider.js +0 -121
- package/dist/client/provider.js.map +0 -1
- package/dist/client/revalidation.d.ts +0 -101
- package/dist/client/revalidation.d.ts.map +0 -1
- package/dist/client/revalidation.js +0 -313
- package/dist/client/revalidation.js.map +0 -1
- package/dist/client/session.d.ts +0 -84
- package/dist/client/session.d.ts.map +0 -1
- package/dist/client/session.js +0 -186
- package/dist/client/session.js.map +0 -1
- package/dist/client/sse-client.d.ts +0 -81
- package/dist/client/sse-client.d.ts.map +0 -1
- package/dist/client/sse-client.js +0 -221
- package/dist/client/sse-client.js.map +0 -1
- package/dist/client/storage.d.ts +0 -124
- package/dist/client/storage.d.ts.map +0 -1
- package/dist/client/storage.js +0 -441
- package/dist/client/storage.js.map +0 -1
- package/dist/client/trpc.d.ts +0 -12
- package/dist/client/trpc.d.ts.map +0 -1
- package/dist/client/trpc.js +0 -36
- package/dist/client/trpc.js.map +0 -1
- package/dist/client/types.d.ts +0 -10
- package/dist/client/types.d.ts.map +0 -1
- package/dist/client/types.js +0 -3
- package/dist/client/types.js.map +0 -1
- package/dist/client.d.ts +0 -12
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -26
- package/dist/client.js.map +0 -1
- package/dist/config/schema.d.ts +0 -261
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/config/schema.js +0 -69
- package/dist/config/schema.js.map +0 -1
- package/dist/core/analyzer.d.ts +0 -15
- package/dist/core/analyzer.d.ts.map +0 -1
- package/dist/core/analyzer.js +0 -217
- package/dist/core/analyzer.js.map +0 -1
- package/dist/core/driver.d.ts +0 -7
- package/dist/core/driver.d.ts.map +0 -1
- package/dist/core/driver.js +0 -261
- package/dist/core/driver.js.map +0 -1
- package/dist/core/function.d.ts +0 -97
- package/dist/core/function.d.ts.map +0 -1
- package/dist/core/function.js +0 -252
- package/dist/core/function.js.map +0 -1
- package/dist/core/sse.d.ts +0 -98
- package/dist/core/sse.d.ts.map +0 -1
- package/dist/core/sse.js +0 -331
- package/dist/core/sse.js.map +0 -1
- package/dist/core/types.d.ts +0 -179
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -3
- package/dist/core/types.js.map +0 -1
- package/dist/examples/teamhub-integration.d.ts +0 -56
- package/dist/examples/teamhub-integration.d.ts.map +0 -1
- package/dist/examples/teamhub-integration.js +0 -188
- package/dist/examples/teamhub-integration.js.map +0 -1
- package/dist/index.d.ts +0 -39
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -57
- package/dist/index.js.map +0 -1
- package/dist/providers/localStorage.d.ts +0 -13
- package/dist/providers/localStorage.d.ts.map +0 -1
- package/dist/providers/localStorage.js +0 -64
- package/dist/providers/localStorage.js.map +0 -1
- package/dist/providers/memory.d.ts +0 -13
- package/dist/providers/memory.d.ts.map +0 -1
- package/dist/providers/memory.js +0 -40
- package/dist/providers/memory.js.map +0 -1
- package/dist/providers/redis.d.ts +0 -14
- package/dist/providers/redis.d.ts.map +0 -1
- package/dist/providers/redis.js +0 -36
- package/dist/providers/redis.js.map +0 -1
- package/dist/server.d.ts +0 -17
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -34
- package/dist/server.js.map +0 -1
- package/dist/trpc/hooks.d.ts +0 -82
- package/dist/trpc/hooks.d.ts.map +0 -1
- package/dist/trpc/hooks.js +0 -282
- package/dist/trpc/hooks.js.map +0 -1
- package/dist/trpc/router.d.ts +0 -75
- package/dist/trpc/router.d.ts.map +0 -1
- package/dist/trpc/router.js +0 -160
- package/dist/trpc/router.js.map +0 -1
- package/dist/trpc/types.d.ts +0 -105
- package/dist/trpc/types.d.ts.map +0 -1
- package/dist/trpc/types.js +0 -6
- package/dist/trpc/types.js.map +0 -1
package/dist/core/sse.d.ts
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
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
|
package/dist/core/sse.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/core/sse.js
DELETED
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Server-Sent Events implementation for real-time cache invalidation
|
|
4
|
-
* Perfect for unidirectional communication with automatic reconnection
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.SSEManager = void 0;
|
|
8
|
-
exports.getSSEManager = getSSEManager;
|
|
9
|
-
exports.createSSEStream = createSSEStream;
|
|
10
|
-
exports.broadcastInvalidation = broadcastInvalidation;
|
|
11
|
-
exports.acknowledgeEvent = acknowledgeEvent;
|
|
12
|
-
/**
|
|
13
|
-
* SSE Manager for reliable real-time communication
|
|
14
|
-
* NO HEARTBEATS - uses event acknowledgments and connection monitoring instead
|
|
15
|
-
*/
|
|
16
|
-
class SSEManager {
|
|
17
|
-
connections = new Map();
|
|
18
|
-
pendingEvents = new Map();
|
|
19
|
-
retrySchedule = [2000, 5000, 10000]; // 2s, 5s, 10s
|
|
20
|
-
connectionMonitorInterval = null;
|
|
21
|
-
constructor() {
|
|
22
|
-
this.startConnectionMonitor();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Create SSE stream for an organization
|
|
26
|
-
*/
|
|
27
|
-
createSSEStream(organizationId) {
|
|
28
|
-
const encoder = new TextEncoder();
|
|
29
|
-
const stream = new ReadableStream({
|
|
30
|
-
start: (controller) => {
|
|
31
|
-
const connection = {
|
|
32
|
-
organizationId,
|
|
33
|
-
controller,
|
|
34
|
-
lastActivity: Date.now(), // Track last activity instead of heartbeat
|
|
35
|
-
isActive: true,
|
|
36
|
-
};
|
|
37
|
-
// Register connection
|
|
38
|
-
this.addConnection(organizationId, connection);
|
|
39
|
-
// Send initial connection event
|
|
40
|
-
this.sendEvent(controller, {
|
|
41
|
-
type: 'connected',
|
|
42
|
-
organizationId,
|
|
43
|
-
timestamp: Date.now(),
|
|
44
|
-
});
|
|
45
|
-
console.log(`[SSE] New connection for org: ${organizationId}`);
|
|
46
|
-
// Cleanup on disconnect
|
|
47
|
-
return () => {
|
|
48
|
-
console.log(`[SSE] Connection closed for org: ${organizationId}`);
|
|
49
|
-
connection.isActive = false;
|
|
50
|
-
this.removeConnection(organizationId, connection);
|
|
51
|
-
};
|
|
52
|
-
},
|
|
53
|
-
cancel: () => {
|
|
54
|
-
console.log(`[SSE] Stream cancelled for org: ${organizationId}`);
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
return new Response(stream, {
|
|
58
|
-
headers: {
|
|
59
|
-
'Content-Type': 'text/event-stream',
|
|
60
|
-
'Cache-Control': 'no-cache',
|
|
61
|
-
Connection: 'keep-alive',
|
|
62
|
-
'Access-Control-Allow-Origin': '*',
|
|
63
|
-
'Access-Control-Allow-Headers': 'Cache-Control',
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Broadcast invalidation event to all connections in an organization
|
|
69
|
-
*/
|
|
70
|
-
async broadcastInvalidation(organizationId, invalidationData) {
|
|
71
|
-
const eventId = this.generateEventId();
|
|
72
|
-
const event = {
|
|
73
|
-
...invalidationData,
|
|
74
|
-
eventId,
|
|
75
|
-
requiresAck: true,
|
|
76
|
-
};
|
|
77
|
-
console.log(`🔥 [SSE-BROADCAST] Broadcasting invalidation for org: ${organizationId}, table: ${event.table}, operation: ${event.operation}, eventId: ${eventId}`);
|
|
78
|
-
console.log('🔥 [SSE-BROADCAST] Event details:', {
|
|
79
|
-
table: event.table,
|
|
80
|
-
operation: event.operation,
|
|
81
|
-
affectedQueries: event.affectedQueries,
|
|
82
|
-
affectedKeys: event.affectedKeys,
|
|
83
|
-
});
|
|
84
|
-
// Store for potential retry
|
|
85
|
-
const pendingEvent = {
|
|
86
|
-
id: eventId,
|
|
87
|
-
organizationId,
|
|
88
|
-
data: event,
|
|
89
|
-
timestamp: Date.now(),
|
|
90
|
-
delivered: false,
|
|
91
|
-
retryCount: 0,
|
|
92
|
-
maxRetries: 3,
|
|
93
|
-
};
|
|
94
|
-
this.pendingEvents.set(eventId, pendingEvent);
|
|
95
|
-
// Send to all connections
|
|
96
|
-
const connections = this.connections.get(organizationId);
|
|
97
|
-
if (connections && connections.size > 0) {
|
|
98
|
-
let successCount = 0;
|
|
99
|
-
let failCount = 0;
|
|
100
|
-
for (const connection of connections) {
|
|
101
|
-
if (connection.isActive) {
|
|
102
|
-
try {
|
|
103
|
-
this.sendEvent(connection.controller, event);
|
|
104
|
-
// Update last activity when we successfully send an event
|
|
105
|
-
connection.lastActivity = Date.now();
|
|
106
|
-
successCount++;
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
console.warn(`[SSE] Failed to send to connection:`, error);
|
|
110
|
-
connection.isActive = false;
|
|
111
|
-
failCount++;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
console.log(`[SSE] Broadcast complete: ${successCount} sent, ${failCount} failed`);
|
|
116
|
-
// If no successful sends, schedule retry
|
|
117
|
-
if (successCount === 0) {
|
|
118
|
-
this.scheduleRetryIfNeeded(eventId);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
console.log(`[SSE] No active connections for org: ${organizationId}`);
|
|
123
|
-
// Still schedule retry in case connections come back
|
|
124
|
-
this.scheduleRetryIfNeeded(eventId);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Acknowledge event receipt (called by client)
|
|
129
|
-
*/
|
|
130
|
-
acknowledgeEvent(eventId) {
|
|
131
|
-
const event = this.pendingEvents.get(eventId);
|
|
132
|
-
if (event) {
|
|
133
|
-
event.delivered = true;
|
|
134
|
-
this.pendingEvents.delete(eventId);
|
|
135
|
-
console.log(`[SSE] Event acknowledged: ${eventId}`);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Get connection statistics
|
|
140
|
-
*/
|
|
141
|
-
getConnectionStats() {
|
|
142
|
-
const connectionsByOrg = {};
|
|
143
|
-
let totalConnections = 0;
|
|
144
|
-
for (const [orgId, connections] of this.connections) {
|
|
145
|
-
const activeConnections = Array.from(connections).filter((conn) => conn.isActive).length;
|
|
146
|
-
connectionsByOrg[orgId] = activeConnections;
|
|
147
|
-
totalConnections += activeConnections;
|
|
148
|
-
}
|
|
149
|
-
return {
|
|
150
|
-
totalConnections,
|
|
151
|
-
connectionsByOrg,
|
|
152
|
-
pendingEvents: this.pendingEvents.size,
|
|
153
|
-
activeEvents: Array.from(this.pendingEvents.values()).filter((event) => !event.delivered),
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Send event to a specific connection
|
|
158
|
-
*/
|
|
159
|
-
sendEvent(controller, data) {
|
|
160
|
-
try {
|
|
161
|
-
const encoder = new TextEncoder();
|
|
162
|
-
const eventData = `data: ${JSON.stringify(data)}\n\n`;
|
|
163
|
-
controller.enqueue(encoder.encode(eventData));
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
console.warn('[SSE] Failed to send event:', error);
|
|
167
|
-
throw error;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Add connection to organization
|
|
172
|
-
*/
|
|
173
|
-
addConnection(organizationId, connection) {
|
|
174
|
-
if (!this.connections.has(organizationId)) {
|
|
175
|
-
this.connections.set(organizationId, new Set());
|
|
176
|
-
}
|
|
177
|
-
this.connections.get(organizationId).add(connection);
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Remove connection from organization
|
|
181
|
-
*/
|
|
182
|
-
removeConnection(organizationId, connection) {
|
|
183
|
-
const connections = this.connections.get(organizationId);
|
|
184
|
-
if (connections) {
|
|
185
|
-
connections.delete(connection);
|
|
186
|
-
if (connections.size === 0) {
|
|
187
|
-
this.connections.delete(organizationId);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Schedule retry for unacknowledged events
|
|
193
|
-
*/
|
|
194
|
-
scheduleRetryIfNeeded(eventId) {
|
|
195
|
-
const event = this.pendingEvents.get(eventId);
|
|
196
|
-
if (!event || event.delivered)
|
|
197
|
-
return;
|
|
198
|
-
const delay = this.retrySchedule[event.retryCount] || 10000;
|
|
199
|
-
setTimeout(async () => {
|
|
200
|
-
const currentEvent = this.pendingEvents.get(eventId);
|
|
201
|
-
if (!currentEvent || currentEvent.delivered)
|
|
202
|
-
return;
|
|
203
|
-
if (currentEvent.retryCount < currentEvent.maxRetries) {
|
|
204
|
-
currentEvent.retryCount++;
|
|
205
|
-
console.log(`[SSE] Retrying event ${eventId} (attempt ${currentEvent.retryCount})`);
|
|
206
|
-
// Retry broadcast
|
|
207
|
-
const connections = this.connections.get(currentEvent.organizationId);
|
|
208
|
-
if (connections && connections.size > 0) {
|
|
209
|
-
for (const connection of connections) {
|
|
210
|
-
if (connection.isActive) {
|
|
211
|
-
try {
|
|
212
|
-
this.sendEvent(connection.controller, {
|
|
213
|
-
...currentEvent.data,
|
|
214
|
-
retry: currentEvent.retryCount,
|
|
215
|
-
});
|
|
216
|
-
// Update last activity on successful retry
|
|
217
|
-
connection.lastActivity = Date.now();
|
|
218
|
-
}
|
|
219
|
-
catch (error) {
|
|
220
|
-
connection.isActive = false;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
this.scheduleRetryIfNeeded(eventId);
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
console.warn(`[SSE] Event ${eventId} failed after ${currentEvent.maxRetries} retries`);
|
|
229
|
-
this.pendingEvents.delete(eventId);
|
|
230
|
-
}
|
|
231
|
-
}, delay);
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Monitor connections for health without sending heartbeats
|
|
235
|
-
* Uses activity tracking and error detection instead of periodic messages
|
|
236
|
-
*/
|
|
237
|
-
startConnectionMonitor() {
|
|
238
|
-
this.connectionMonitorInterval = setInterval(() => {
|
|
239
|
-
const now = Date.now();
|
|
240
|
-
const maxInactivity = 120000; // 2 minutes of inactivity
|
|
241
|
-
for (const [orgId, connections] of this.connections) {
|
|
242
|
-
for (const connection of connections) {
|
|
243
|
-
// Mark connections as inactive if they haven't had activity in 2 minutes
|
|
244
|
-
if (connection.isActive && now - connection.lastActivity > maxInactivity) {
|
|
245
|
-
console.log(`[SSE] Marking inactive connection as closed for org: ${orgId}`);
|
|
246
|
-
connection.isActive = false;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
// Remove inactive connections
|
|
250
|
-
const activeConnections = Array.from(connections).filter((conn) => conn.isActive);
|
|
251
|
-
if (activeConnections.length !== connections.size) {
|
|
252
|
-
this.connections.set(orgId, new Set(activeConnections));
|
|
253
|
-
if (activeConnections.length === 0) {
|
|
254
|
-
this.connections.delete(orgId);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
// Clean up old pending events (older than 5 minutes)
|
|
259
|
-
const maxEventAge = 300000; // 5 minutes
|
|
260
|
-
for (const [eventId, event] of this.pendingEvents) {
|
|
261
|
-
if (now - event.timestamp > maxEventAge) {
|
|
262
|
-
console.log(`[SSE] Cleaning up old pending event: ${eventId}`);
|
|
263
|
-
this.pendingEvents.delete(eventId);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}, 60000); // Check every minute instead of every 30 seconds
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Generate unique event ID
|
|
270
|
-
*/
|
|
271
|
-
generateEventId() {
|
|
272
|
-
return `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Cleanup resources
|
|
276
|
-
*/
|
|
277
|
-
cleanup() {
|
|
278
|
-
if (this.connectionMonitorInterval) {
|
|
279
|
-
clearInterval(this.connectionMonitorInterval);
|
|
280
|
-
}
|
|
281
|
-
// Close all connections
|
|
282
|
-
for (const [, connections] of this.connections) {
|
|
283
|
-
for (const connection of connections) {
|
|
284
|
-
if (connection.isActive) {
|
|
285
|
-
try {
|
|
286
|
-
connection.controller.close();
|
|
287
|
-
}
|
|
288
|
-
catch (error) {
|
|
289
|
-
// Ignore close errors
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
this.connections.clear();
|
|
295
|
-
this.pendingEvents.clear();
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
exports.SSEManager = SSEManager;
|
|
299
|
-
// Global SSE manager instance
|
|
300
|
-
let globalSSEManager = null;
|
|
301
|
-
/**
|
|
302
|
-
* Get or create global SSE manager
|
|
303
|
-
*/
|
|
304
|
-
function getSSEManager() {
|
|
305
|
-
if (!globalSSEManager) {
|
|
306
|
-
globalSSEManager = new SSEManager();
|
|
307
|
-
}
|
|
308
|
-
return globalSSEManager;
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Create SSE stream for Vercel/Next.js API routes
|
|
312
|
-
*/
|
|
313
|
-
function createSSEStream(organizationId) {
|
|
314
|
-
const manager = getSSEManager();
|
|
315
|
-
return manager.createSSEStream(organizationId);
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Broadcast invalidation event
|
|
319
|
-
*/
|
|
320
|
-
async function broadcastInvalidation(organizationId, invalidationData) {
|
|
321
|
-
const manager = getSSEManager();
|
|
322
|
-
await manager.broadcastInvalidation(organizationId, invalidationData);
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* Acknowledge event (for API route)
|
|
326
|
-
*/
|
|
327
|
-
function acknowledgeEvent(eventId) {
|
|
328
|
-
const manager = getSSEManager();
|
|
329
|
-
manager.acknowledgeEvent(eventId);
|
|
330
|
-
}
|
|
331
|
-
//# sourceMappingURL=sse.js.map
|
package/dist/core/sse.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/core/sse.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.d.ts
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import type { z } from 'zod';
|
|
2
|
-
/**
|
|
3
|
-
* Core reactive database configuration
|
|
4
|
-
*/
|
|
5
|
-
export interface ReactiveConfig {
|
|
6
|
-
/** Table relationships for automatic invalidation */
|
|
7
|
-
relations: Record<string, string[]>;
|
|
8
|
-
/** Cache configuration (optional - smart defaults used) */
|
|
9
|
-
cache?: {
|
|
10
|
-
server?: {
|
|
11
|
-
provider?: 'redis' | 'memory';
|
|
12
|
-
};
|
|
13
|
-
client?: {
|
|
14
|
-
provider?: 'localStorage' | 'sessionStorage';
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
/** Real-time configuration (optional - SSE enabled by default) */
|
|
18
|
-
realtime?: {
|
|
19
|
-
enabled?: boolean;
|
|
20
|
-
transport?: 'sse';
|
|
21
|
-
fallback?: 'polling';
|
|
22
|
-
reliability?: {
|
|
23
|
-
acknowledgments?: boolean;
|
|
24
|
-
maxRetries?: number;
|
|
25
|
-
retryDelays?: number[];
|
|
26
|
-
periodicHeartbeat?: false;
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Reactive database instance
|
|
32
|
-
*/
|
|
33
|
-
export interface ReactiveDb {
|
|
34
|
-
/** Original Drizzle database instance */
|
|
35
|
-
db: any;
|
|
36
|
-
/** Configuration */
|
|
37
|
-
config: ReactiveConfig;
|
|
38
|
-
/** Execute query with reactive features */
|
|
39
|
-
query: <T>(sql: string, params?: any[]) => Promise<T>;
|
|
40
|
-
/** Get cache provider */
|
|
41
|
-
getCache: () => CacheProvider;
|
|
42
|
-
/** Subscribe to invalidation events */
|
|
43
|
-
subscribe: (organizationId: string, callback: InvalidationCallback) => () => void;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Cache provider interface
|
|
47
|
-
*/
|
|
48
|
-
export interface CacheProvider {
|
|
49
|
-
get<T>(key: string): Promise<T | null>;
|
|
50
|
-
set<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
51
|
-
del(key: string): Promise<void>;
|
|
52
|
-
invalidate(pattern: string): Promise<void>;
|
|
53
|
-
clear(): Promise<void>;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* SQL analysis result
|
|
57
|
-
*/
|
|
58
|
-
export interface SqlAnalysis {
|
|
59
|
-
/** Table name */
|
|
60
|
-
table: string;
|
|
61
|
-
/** Operation type */
|
|
62
|
-
operation: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE';
|
|
63
|
-
/** WHERE condition keys */
|
|
64
|
-
whereKeys: string[];
|
|
65
|
-
/** Affected columns */
|
|
66
|
-
columns: string[];
|
|
67
|
-
/** Organization ID if detected */
|
|
68
|
-
organizationId?: string;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Query metadata for caching
|
|
72
|
-
*/
|
|
73
|
-
export interface QueryMetadata {
|
|
74
|
-
/** Unique query key */
|
|
75
|
-
key: string;
|
|
76
|
-
/** Tables this query depends on */
|
|
77
|
-
dependencies: string[];
|
|
78
|
-
/** Last execution timestamp */
|
|
79
|
-
lastExecuted: number;
|
|
80
|
-
/** Cache TTL in seconds */
|
|
81
|
-
ttl?: number;
|
|
82
|
-
/** Organization scope */
|
|
83
|
-
organizationId?: string;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Invalidation event
|
|
87
|
-
*/
|
|
88
|
-
export interface InvalidationEvent {
|
|
89
|
-
/** Event type */
|
|
90
|
-
type: 'invalidation';
|
|
91
|
-
/** Affected table */
|
|
92
|
-
table: string;
|
|
93
|
-
/** Organization ID */
|
|
94
|
-
organizationId: string;
|
|
95
|
-
/** Affected query keys */
|
|
96
|
-
affectedQueries: string[];
|
|
97
|
-
/** Event ID for acknowledgment */
|
|
98
|
-
eventId: string;
|
|
99
|
-
/** Whether this event requires acknowledgment */
|
|
100
|
-
requiresAck: boolean;
|
|
101
|
-
/** Timestamp */
|
|
102
|
-
timestamp: number;
|
|
103
|
-
/** SQL operation type (INSERT, UPDATE, DELETE) */
|
|
104
|
-
operation?: string;
|
|
105
|
-
/** Affected keys from WHERE clause */
|
|
106
|
-
affectedKeys?: string[];
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Invalidation callback
|
|
110
|
-
*/
|
|
111
|
-
export type InvalidationCallback = (event: InvalidationEvent) => void;
|
|
112
|
-
/**
|
|
113
|
-
* Client-side query registry
|
|
114
|
-
*/
|
|
115
|
-
export interface QueryRegistry {
|
|
116
|
-
/** Organization ID */
|
|
117
|
-
organizationId: string;
|
|
118
|
-
/** Cached queries */
|
|
119
|
-
queries: {
|
|
120
|
-
[queryKey: string]: {
|
|
121
|
-
lastRevalidated: number;
|
|
122
|
-
lastServerChange?: number;
|
|
123
|
-
data?: any;
|
|
124
|
-
};
|
|
125
|
-
};
|
|
126
|
-
/** Session information */
|
|
127
|
-
session: {
|
|
128
|
-
startTime: number;
|
|
129
|
-
lastSync: number;
|
|
130
|
-
realtimeConnected: boolean;
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Reactive function definition
|
|
135
|
-
*/
|
|
136
|
-
export interface ReactiveFunctionDefinition<TInput = any, TOutput = any> {
|
|
137
|
-
/** Unique function ID */
|
|
138
|
-
id: string;
|
|
139
|
-
/** Input validation schema */
|
|
140
|
-
input: z.ZodSchema<TInput>;
|
|
141
|
-
/** Tables this function reads from */
|
|
142
|
-
dependencies: string[];
|
|
143
|
-
/** Optional fine-grained invalidation rules */
|
|
144
|
-
invalidateWhen?: Record<string, (change: TableChange) => boolean>;
|
|
145
|
-
/** Function handler */
|
|
146
|
-
handler: (params: {
|
|
147
|
-
input: TInput;
|
|
148
|
-
db: any;
|
|
149
|
-
}) => Promise<TOutput>;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Table change information
|
|
153
|
-
*/
|
|
154
|
-
export interface TableChange {
|
|
155
|
-
/** Table name */
|
|
156
|
-
table: string;
|
|
157
|
-
/** Operation type */
|
|
158
|
-
operation: 'INSERT' | 'UPDATE' | 'DELETE';
|
|
159
|
-
/** Affected keys/IDs */
|
|
160
|
-
keys: string[];
|
|
161
|
-
/** Organization ID */
|
|
162
|
-
organizationId?: string;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Hook state
|
|
166
|
-
*/
|
|
167
|
-
export interface HookState {
|
|
168
|
-
/** Query key */
|
|
169
|
-
queryKey: string;
|
|
170
|
-
/** Is currently active */
|
|
171
|
-
isActive: boolean;
|
|
172
|
-
/** Last access time */
|
|
173
|
-
lastAccess: number;
|
|
174
|
-
/** Dependencies */
|
|
175
|
-
dependencies: string[];
|
|
176
|
-
/** Organization scope */
|
|
177
|
-
organizationId?: string;
|
|
178
|
-
}
|
|
179
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/core/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/core/types.js
DELETED
package/dist/core/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
|