@qwickapps/qwickbrain-proxy 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/engineering/bugs/BUG-qwickbrain-proxy-cache-and-design.md +840 -0
- package/.github/workflows/publish.yml +13 -0
- package/CHANGELOG.md +54 -0
- package/dist/db/schema.d.ts +63 -6
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +17 -2
- package/dist/db/schema.js.map +1 -1
- package/dist/lib/__tests__/cache-manager.test.js +146 -83
- package/dist/lib/__tests__/cache-manager.test.js.map +1 -1
- package/dist/lib/__tests__/proxy-server.test.js +16 -44
- package/dist/lib/__tests__/proxy-server.test.js.map +1 -1
- package/dist/lib/__tests__/sse-invalidation-listener.test.d.ts +2 -0
- package/dist/lib/__tests__/sse-invalidation-listener.test.d.ts.map +1 -0
- package/dist/lib/__tests__/sse-invalidation-listener.test.js +245 -0
- package/dist/lib/__tests__/sse-invalidation-listener.test.js.map +1 -0
- package/dist/lib/__tests__/write-queue-manager.test.d.ts +2 -0
- package/dist/lib/__tests__/write-queue-manager.test.d.ts.map +1 -0
- package/dist/lib/__tests__/write-queue-manager.test.js +291 -0
- package/dist/lib/__tests__/write-queue-manager.test.js.map +1 -0
- package/dist/lib/cache-manager.d.ts +35 -6
- package/dist/lib/cache-manager.d.ts.map +1 -1
- package/dist/lib/cache-manager.js +154 -41
- package/dist/lib/cache-manager.js.map +1 -1
- package/dist/lib/connection-manager.d.ts.map +1 -1
- package/dist/lib/connection-manager.js +4 -1
- package/dist/lib/connection-manager.js.map +1 -1
- package/dist/lib/proxy-server.d.ts +6 -0
- package/dist/lib/proxy-server.d.ts.map +1 -1
- package/dist/lib/proxy-server.js +182 -87
- package/dist/lib/proxy-server.js.map +1 -1
- package/dist/lib/qwickbrain-client.d.ts +4 -0
- package/dist/lib/qwickbrain-client.d.ts.map +1 -1
- package/dist/lib/qwickbrain-client.js +133 -0
- package/dist/lib/qwickbrain-client.js.map +1 -1
- package/dist/lib/sse-invalidation-listener.d.ts +27 -0
- package/dist/lib/sse-invalidation-listener.d.ts.map +1 -0
- package/dist/lib/sse-invalidation-listener.js +145 -0
- package/dist/lib/sse-invalidation-listener.js.map +1 -0
- package/dist/lib/tools.d.ts +21 -0
- package/dist/lib/tools.d.ts.map +1 -0
- package/dist/lib/tools.js +488 -0
- package/dist/lib/tools.js.map +1 -0
- package/dist/lib/write-queue-manager.d.ts +88 -0
- package/dist/lib/write-queue-manager.d.ts.map +1 -0
- package/dist/lib/write-queue-manager.js +191 -0
- package/dist/lib/write-queue-manager.js.map +1 -0
- package/dist/types/config.d.ts +7 -42
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +1 -6
- package/dist/types/config.js.map +1 -1
- package/drizzle/0002_lru_cache_migration.sql +94 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +6 -2
- package/scripts/rebuild-sqlite.sh +26 -0
- package/src/db/schema.ts +17 -2
- package/src/lib/__tests__/cache-manager.test.ts +180 -90
- package/src/lib/__tests__/proxy-server.test.ts +16 -51
- package/src/lib/__tests__/sse-invalidation-listener.test.ts +326 -0
- package/src/lib/__tests__/write-queue-manager.test.ts +383 -0
- package/src/lib/cache-manager.ts +198 -46
- package/src/lib/connection-manager.ts +4 -1
- package/src/lib/proxy-server.ts +222 -90
- package/src/lib/qwickbrain-client.ts +145 -1
- package/src/lib/sse-invalidation-listener.ts +171 -0
- package/src/lib/tools.ts +500 -0
- package/src/lib/write-queue-manager.ts +271 -0
- package/src/types/config.ts +1 -6
|
@@ -44,12 +44,7 @@ describe('ProxyServer', () => {
|
|
|
44
44
|
},
|
|
45
45
|
cache: {
|
|
46
46
|
dir: tmpDir,
|
|
47
|
-
|
|
48
|
-
workflows: 3600,
|
|
49
|
-
rules: 3600,
|
|
50
|
-
documents: 1800,
|
|
51
|
-
memories: 900,
|
|
52
|
-
},
|
|
47
|
+
maxCacheSizeBytes: 100 * 1024 * 1024, // 100MB
|
|
53
48
|
preload: [],
|
|
54
49
|
},
|
|
55
50
|
connection: {
|
|
@@ -87,50 +82,27 @@ describe('ProxyServer', () => {
|
|
|
87
82
|
expect(setRequestHandlerMock.mock.calls.length).toBeGreaterThanOrEqual(2);
|
|
88
83
|
});
|
|
89
84
|
});
|
|
90
|
-
describe('cache
|
|
91
|
-
it('should
|
|
92
|
-
//
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
workflows: 0,
|
|
96
|
-
rules: 0,
|
|
97
|
-
documents: 0,
|
|
98
|
-
memories: 0,
|
|
99
|
-
};
|
|
100
|
-
const tempServer = new ProxyServer(db, shortTTLConfig);
|
|
101
|
-
await tempServer['cacheManager'].setDocument('workflow', 'test', 'content');
|
|
85
|
+
describe('cache behavior', () => {
|
|
86
|
+
it('should use LRU cache with no expiration', async () => {
|
|
87
|
+
// With LRU cache, items never expire by time
|
|
88
|
+
await server['cacheManager'].setDocument('workflow', 'test', 'content');
|
|
89
|
+
// Wait some time
|
|
102
90
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
103
|
-
//
|
|
104
|
-
const
|
|
105
|
-
expect(
|
|
106
|
-
|
|
107
|
-
// Entry should be removed after cleanup
|
|
108
|
-
const afterCleanup = await tempServer['cacheManager'].getDocument('workflow', 'test');
|
|
109
|
-
expect(afterCleanup).toBeNull();
|
|
110
|
-
await tempServer.stop();
|
|
91
|
+
// Entry should still be present (no TTL expiration)
|
|
92
|
+
const cached = await server['cacheManager'].getDocument('workflow', 'test');
|
|
93
|
+
expect(cached).not.toBeNull();
|
|
94
|
+
expect(cached?.data.content).toBe('content');
|
|
111
95
|
});
|
|
112
96
|
});
|
|
113
97
|
describe('graceful degradation', () => {
|
|
114
|
-
it('should serve
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
shortTTLConfig.cache.ttl = {
|
|
118
|
-
workflows: 0,
|
|
119
|
-
rules: 0,
|
|
120
|
-
documents: 0,
|
|
121
|
-
memories: 0,
|
|
122
|
-
};
|
|
123
|
-
const tempServer = new ProxyServer(db, shortTTLConfig);
|
|
124
|
-
// Add item to cache
|
|
125
|
-
await tempServer['cacheManager'].setDocument('workflow', 'test', 'cached content');
|
|
126
|
-
// Wait for cache to expire
|
|
127
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
98
|
+
it('should serve cached data when disconnected', async () => {
|
|
99
|
+
// LRU cache always serves cached data (no staleness - always fresh)
|
|
100
|
+
await server['cacheManager'].setDocument('workflow', 'test', 'cached content');
|
|
128
101
|
// Simulate disconnected state
|
|
129
|
-
|
|
130
|
-
const result = await
|
|
102
|
+
server['connectionManager']['state'] = 'disconnected';
|
|
103
|
+
const result = await server['handleGetDocument']('workflow', 'test');
|
|
131
104
|
expect(result.data.content).toBe('cached content');
|
|
132
|
-
expect(result._metadata.source).toBe('
|
|
133
|
-
await tempServer.stop();
|
|
105
|
+
expect(result._metadata.source).toBe('cache'); // Fresh cache, not stale
|
|
134
106
|
});
|
|
135
107
|
it('should return error when no cache available and disconnected', async () => {
|
|
136
108
|
// Simulate disconnected state with no cache
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-server.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/proxy-server.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,eAAe;AACf,EAAE,CAAC,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC7C,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC3C,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;QACjB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;KACpD,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,iBAAiB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC1B,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC7C,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC5C,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,2CAA2C,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC9B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxD,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC5B,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,MAAc,CAAC;IACnB,IAAI,MAAc,CAAC;IACnB,IAAI,EAA2C,CAAC;IAChD,IAAI,MAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACxC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;QAEjB,kCAAkC;QAClC,aAAa,CAAC,EAAE,CAAC,CAAC;QAElB,MAAM,GAAG;YACP,UAAU,EAAE;gBACV,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,wBAAwB;aAC9B;YACD,KAAK,EAAE;gBACL,GAAG,EAAE,MAAM;gBACX,
|
|
1
|
+
{"version":3,"file":"proxy-server.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/proxy-server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-invalidation-listener.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/sse-invalidation-listener.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { mkdtempSync, rmSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { createDatabase, runMigrations } from '../../db/client.js';
|
|
6
|
+
import { CacheManager } from '../cache-manager.js';
|
|
7
|
+
import { SSEInvalidationListener } from '../sse-invalidation-listener.js';
|
|
8
|
+
import { EventSource } from 'eventsource';
|
|
9
|
+
// Mock EventSource
|
|
10
|
+
vi.mock('eventsource', () => {
|
|
11
|
+
const EventSourceMock = vi.fn();
|
|
12
|
+
return { EventSource: EventSourceMock };
|
|
13
|
+
});
|
|
14
|
+
describe('SSEInvalidationListener', () => {
|
|
15
|
+
let tmpDir;
|
|
16
|
+
let cacheManager;
|
|
17
|
+
let listener;
|
|
18
|
+
let db;
|
|
19
|
+
let mockEventSource;
|
|
20
|
+
let eventListeners;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
// Create temporary directory for test database
|
|
23
|
+
tmpDir = mkdtempSync(join(tmpdir(), 'sse-test-'));
|
|
24
|
+
const dbResult = createDatabase(tmpDir);
|
|
25
|
+
db = dbResult.db;
|
|
26
|
+
// Run migrations to create tables
|
|
27
|
+
runMigrations(db);
|
|
28
|
+
const config = {
|
|
29
|
+
dir: tmpDir,
|
|
30
|
+
maxCacheSizeBytes: 100 * 1024 * 1024,
|
|
31
|
+
preload: [],
|
|
32
|
+
};
|
|
33
|
+
cacheManager = new CacheManager(db, config);
|
|
34
|
+
// Setup EventSource mock
|
|
35
|
+
eventListeners = new Map();
|
|
36
|
+
mockEventSource = {
|
|
37
|
+
readyState: 1, // OPEN
|
|
38
|
+
addEventListener: vi.fn((event, handler) => {
|
|
39
|
+
if (!eventListeners.has(event)) {
|
|
40
|
+
eventListeners.set(event, []);
|
|
41
|
+
}
|
|
42
|
+
eventListeners.get(event).push(handler);
|
|
43
|
+
}),
|
|
44
|
+
close: vi.fn(),
|
|
45
|
+
onopen: null,
|
|
46
|
+
onerror: null,
|
|
47
|
+
};
|
|
48
|
+
EventSource.mockImplementation(() => mockEventSource);
|
|
49
|
+
EventSource.OPEN = 1;
|
|
50
|
+
EventSource.CLOSED = 2;
|
|
51
|
+
listener = new SSEInvalidationListener('http://test.local:3000', cacheManager, 'test-api-key');
|
|
52
|
+
});
|
|
53
|
+
afterEach(() => {
|
|
54
|
+
listener.stop();
|
|
55
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
56
|
+
vi.clearAllMocks();
|
|
57
|
+
});
|
|
58
|
+
describe('start', () => {
|
|
59
|
+
it('should connect to SSE endpoint', async () => {
|
|
60
|
+
await listener.start();
|
|
61
|
+
expect(EventSource).toHaveBeenCalledWith('http://test.local:3000/sse/cache-invalidation', expect.objectContaining({
|
|
62
|
+
headers: expect.objectContaining({
|
|
63
|
+
Authorization: 'Bearer test-api-key',
|
|
64
|
+
}),
|
|
65
|
+
}));
|
|
66
|
+
});
|
|
67
|
+
it('should register event listeners', async () => {
|
|
68
|
+
await listener.start();
|
|
69
|
+
expect(mockEventSource.addEventListener).toHaveBeenCalledWith('document:invalidate', expect.any(Function));
|
|
70
|
+
expect(mockEventSource.addEventListener).toHaveBeenCalledWith('memory:invalidate', expect.any(Function));
|
|
71
|
+
expect(mockEventSource.addEventListener).toHaveBeenCalledWith('cache:invalidate:batch', expect.any(Function));
|
|
72
|
+
});
|
|
73
|
+
it('should call onopen handler', async () => {
|
|
74
|
+
await listener.start();
|
|
75
|
+
// Trigger onopen
|
|
76
|
+
mockEventSource.onopen?.();
|
|
77
|
+
// Should be listening
|
|
78
|
+
expect(listener.isListening()).toBe(true);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('document invalidation', () => {
|
|
82
|
+
it('should invalidate document cache on event', async () => {
|
|
83
|
+
// Pre-populate cache
|
|
84
|
+
await cacheManager.setDocument('workflow', 'test-workflow', 'content');
|
|
85
|
+
const cached1 = await cacheManager.getDocument('workflow', 'test-workflow');
|
|
86
|
+
expect(cached1).not.toBeNull();
|
|
87
|
+
// Start listener
|
|
88
|
+
await listener.start();
|
|
89
|
+
// Trigger invalidation event
|
|
90
|
+
const handlers = eventListeners.get('document:invalidate') || [];
|
|
91
|
+
const invalidationEvent = {
|
|
92
|
+
data: JSON.stringify({
|
|
93
|
+
type: 'document',
|
|
94
|
+
docType: 'workflow',
|
|
95
|
+
name: 'test-workflow',
|
|
96
|
+
}),
|
|
97
|
+
};
|
|
98
|
+
for (const handler of handlers) {
|
|
99
|
+
await handler(invalidationEvent);
|
|
100
|
+
}
|
|
101
|
+
// Cache should be invalidated
|
|
102
|
+
const cached2 = await cacheManager.getDocument('workflow', 'test-workflow');
|
|
103
|
+
expect(cached2).toBeNull();
|
|
104
|
+
});
|
|
105
|
+
it('should invalidate project-scoped document', async () => {
|
|
106
|
+
await cacheManager.setDocument('rule', 'test-rule', 'content', 'my-project');
|
|
107
|
+
const cached1 = await cacheManager.getDocument('rule', 'test-rule', 'my-project');
|
|
108
|
+
expect(cached1).not.toBeNull();
|
|
109
|
+
await listener.start();
|
|
110
|
+
const handlers = eventListeners.get('document:invalidate') || [];
|
|
111
|
+
const invalidationEvent = {
|
|
112
|
+
data: JSON.stringify({
|
|
113
|
+
type: 'document',
|
|
114
|
+
docType: 'rule',
|
|
115
|
+
name: 'test-rule',
|
|
116
|
+
project: 'my-project',
|
|
117
|
+
}),
|
|
118
|
+
};
|
|
119
|
+
for (const handler of handlers) {
|
|
120
|
+
await handler(invalidationEvent);
|
|
121
|
+
}
|
|
122
|
+
const cached2 = await cacheManager.getDocument('rule', 'test-rule', 'my-project');
|
|
123
|
+
expect(cached2).toBeNull();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('memory invalidation', () => {
|
|
127
|
+
it('should invalidate memory cache on event', async () => {
|
|
128
|
+
await cacheManager.setMemory('test-memory', 'content');
|
|
129
|
+
const cached1 = await cacheManager.getMemory('test-memory');
|
|
130
|
+
expect(cached1).not.toBeNull();
|
|
131
|
+
await listener.start();
|
|
132
|
+
const handlers = eventListeners.get('memory:invalidate') || [];
|
|
133
|
+
const invalidationEvent = {
|
|
134
|
+
data: JSON.stringify({
|
|
135
|
+
type: 'memory',
|
|
136
|
+
name: 'test-memory',
|
|
137
|
+
}),
|
|
138
|
+
};
|
|
139
|
+
for (const handler of handlers) {
|
|
140
|
+
await handler(invalidationEvent);
|
|
141
|
+
}
|
|
142
|
+
const cached2 = await cacheManager.getMemory('test-memory');
|
|
143
|
+
expect(cached2).toBeNull();
|
|
144
|
+
});
|
|
145
|
+
it('should invalidate project-scoped memory', async () => {
|
|
146
|
+
await cacheManager.setMemory('test-memory', 'content', 'my-project');
|
|
147
|
+
const cached1 = await cacheManager.getMemory('test-memory', 'my-project');
|
|
148
|
+
expect(cached1).not.toBeNull();
|
|
149
|
+
await listener.start();
|
|
150
|
+
const handlers = eventListeners.get('memory:invalidate') || [];
|
|
151
|
+
const invalidationEvent = {
|
|
152
|
+
data: JSON.stringify({
|
|
153
|
+
type: 'memory',
|
|
154
|
+
name: 'test-memory',
|
|
155
|
+
project: 'my-project',
|
|
156
|
+
}),
|
|
157
|
+
};
|
|
158
|
+
for (const handler of handlers) {
|
|
159
|
+
await handler(invalidationEvent);
|
|
160
|
+
}
|
|
161
|
+
const cached2 = await cacheManager.getMemory('test-memory', 'my-project');
|
|
162
|
+
expect(cached2).toBeNull();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe('batch invalidation', () => {
|
|
166
|
+
it('should invalidate multiple items in batch', async () => {
|
|
167
|
+
// Pre-populate cache
|
|
168
|
+
await cacheManager.setDocument('workflow', 'wf1', 'content');
|
|
169
|
+
await cacheManager.setDocument('rule', 'rule1', 'content');
|
|
170
|
+
await cacheManager.setMemory('mem1', 'content');
|
|
171
|
+
await listener.start();
|
|
172
|
+
const handlers = eventListeners.get('cache:invalidate:batch') || [];
|
|
173
|
+
const batchEvent = {
|
|
174
|
+
data: JSON.stringify([
|
|
175
|
+
{ type: 'document', docType: 'workflow', name: 'wf1' },
|
|
176
|
+
{ type: 'document', docType: 'rule', name: 'rule1' },
|
|
177
|
+
{ type: 'memory', name: 'mem1' },
|
|
178
|
+
]),
|
|
179
|
+
};
|
|
180
|
+
for (const handler of handlers) {
|
|
181
|
+
await handler(batchEvent);
|
|
182
|
+
}
|
|
183
|
+
// All should be invalidated
|
|
184
|
+
const wf1 = await cacheManager.getDocument('workflow', 'wf1');
|
|
185
|
+
const rule1 = await cacheManager.getDocument('rule', 'rule1');
|
|
186
|
+
const mem1 = await cacheManager.getMemory('mem1');
|
|
187
|
+
expect(wf1).toBeNull();
|
|
188
|
+
expect(rule1).toBeNull();
|
|
189
|
+
expect(mem1).toBeNull();
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
describe('error handling', () => {
|
|
193
|
+
it('should handle malformed invalidation events', async () => {
|
|
194
|
+
await listener.start();
|
|
195
|
+
const handlers = eventListeners.get('document:invalidate') || [];
|
|
196
|
+
// Should not throw on malformed JSON
|
|
197
|
+
expect(() => {
|
|
198
|
+
for (const handler of handlers) {
|
|
199
|
+
handler({ data: 'invalid json' });
|
|
200
|
+
}
|
|
201
|
+
}).not.toThrow();
|
|
202
|
+
});
|
|
203
|
+
it('should handle missing docType in document event', async () => {
|
|
204
|
+
await cacheManager.setDocument('workflow', 'test', 'content');
|
|
205
|
+
await listener.start();
|
|
206
|
+
const handlers = eventListeners.get('document:invalidate') || [];
|
|
207
|
+
const invalidEvent = {
|
|
208
|
+
data: JSON.stringify({
|
|
209
|
+
type: 'document',
|
|
210
|
+
name: 'test',
|
|
211
|
+
// Missing docType
|
|
212
|
+
}),
|
|
213
|
+
};
|
|
214
|
+
// Should not throw
|
|
215
|
+
expect(() => {
|
|
216
|
+
for (const handler of handlers) {
|
|
217
|
+
handler(invalidEvent);
|
|
218
|
+
}
|
|
219
|
+
}).not.toThrow();
|
|
220
|
+
// Cache should still be present (invalidation skipped)
|
|
221
|
+
const cached = await cacheManager.getDocument('workflow', 'test');
|
|
222
|
+
expect(cached).not.toBeNull();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
describe('stop', () => {
|
|
226
|
+
it('should close EventSource and stop listening', async () => {
|
|
227
|
+
await listener.start();
|
|
228
|
+
expect(listener.isListening()).toBe(true);
|
|
229
|
+
listener.stop();
|
|
230
|
+
expect(mockEventSource.close).toHaveBeenCalled();
|
|
231
|
+
expect(listener.isListening()).toBe(false);
|
|
232
|
+
});
|
|
233
|
+
it('should prevent reconnection after stop', async () => {
|
|
234
|
+
await listener.start();
|
|
235
|
+
listener.stop();
|
|
236
|
+
// Trigger error (would normally trigger reconnect)
|
|
237
|
+
mockEventSource.onerror?.(new Error('Connection lost'));
|
|
238
|
+
// Wait a bit
|
|
239
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
240
|
+
// Should not have tried to reconnect
|
|
241
|
+
expect(EventSource).toHaveBeenCalledTimes(1);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
//# sourceMappingURL=sse-invalidation-listener.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-invalidation-listener.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/sse-invalidation-listener.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-queue-manager.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/write-queue-manager.test.ts"],"names":[],"mappings":""}
|