@ytspar/sweetlink 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/browser/SweetlinkBridge.d.ts.map +1 -1
  2. package/dist/browser/SweetlinkBridge.js +9 -1
  3. package/dist/browser/SweetlinkBridge.js.map +1 -1
  4. package/dist/browser/commands/a11y.d.ts +12 -0
  5. package/dist/browser/commands/a11y.d.ts.map +1 -0
  6. package/dist/browser/commands/a11y.js +77 -0
  7. package/dist/browser/commands/a11y.js.map +1 -0
  8. package/dist/browser/commands/index.d.ts +4 -0
  9. package/dist/browser/commands/index.d.ts.map +1 -1
  10. package/dist/browser/commands/index.js +4 -0
  11. package/dist/browser/commands/index.js.map +1 -1
  12. package/dist/browser/commands/outline.d.ts +19 -0
  13. package/dist/browser/commands/outline.d.ts.map +1 -0
  14. package/dist/browser/commands/outline.js +276 -0
  15. package/dist/browser/commands/outline.js.map +1 -0
  16. package/dist/browser/commands/schema.d.ts +29 -0
  17. package/dist/browser/commands/schema.d.ts.map +1 -0
  18. package/dist/browser/commands/schema.js +211 -0
  19. package/dist/browser/commands/schema.js.map +1 -0
  20. package/dist/browser/commands/vitals.d.ts +11 -0
  21. package/dist/browser/commands/vitals.d.ts.map +1 -0
  22. package/dist/browser/commands/vitals.js +124 -0
  23. package/dist/browser/commands/vitals.js.map +1 -0
  24. package/dist/cdp.js +6 -6
  25. package/dist/cdp.js.map +1 -1
  26. package/dist/cli/sweetlink-dev.js +0 -0
  27. package/dist/cli/sweetlink.js +273 -3
  28. package/dist/cli/sweetlink.js.map +1 -1
  29. package/dist/index.d.ts +0 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +0 -4
  32. package/dist/index.js.map +1 -1
  33. package/dist/server/handlers/a11y.d.ts +18 -0
  34. package/dist/server/handlers/a11y.d.ts.map +1 -0
  35. package/dist/server/handlers/a11y.js +20 -0
  36. package/dist/server/handlers/a11y.js.map +1 -0
  37. package/dist/server/handlers/index.d.ts +1 -0
  38. package/dist/server/handlers/index.d.ts.map +1 -1
  39. package/dist/server/handlers/index.js +1 -0
  40. package/dist/server/handlers/index.js.map +1 -1
  41. package/dist/server/index.d.ts.map +1 -1
  42. package/dist/server/index.js +22 -2
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/types.d.ts +96 -27
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/types.js +23 -36
  47. package/dist/types.js.map +1 -1
  48. package/package.json +21 -4
  49. package/dist/browser/commands/commands.test.d.ts +0 -2
  50. package/dist/browser/commands/commands.test.d.ts.map +0 -1
  51. package/dist/browser/commands/commands.test.js +0 -207
  52. package/dist/browser/commands/commands.test.js.map +0 -1
  53. package/dist/browser/consoleCapture.test.d.ts +0 -2
  54. package/dist/browser/consoleCapture.test.d.ts.map +0 -1
  55. package/dist/browser/consoleCapture.test.js +0 -249
  56. package/dist/browser/consoleCapture.test.js.map +0 -1
  57. package/dist/browser/screenshotUtils.test.d.ts +0 -2
  58. package/dist/browser/screenshotUtils.test.d.ts.map +0 -1
  59. package/dist/browser/screenshotUtils.test.js +0 -198
  60. package/dist/browser/screenshotUtils.test.js.map +0 -1
  61. package/dist/server/anthropic.test.d.ts +0 -2
  62. package/dist/server/anthropic.test.d.ts.map +0 -1
  63. package/dist/server/anthropic.test.js +0 -27
  64. package/dist/server/anthropic.test.js.map +0 -1
  65. package/dist/server/constants.test.d.ts +0 -2
  66. package/dist/server/constants.test.d.ts.map +0 -1
  67. package/dist/server/constants.test.js +0 -25
  68. package/dist/server/constants.test.js.map +0 -1
  69. package/dist/server/subscriptions.test.d.ts +0 -2
  70. package/dist/server/subscriptions.test.d.ts.map +0 -1
  71. package/dist/server/subscriptions.test.js +0 -100
  72. package/dist/server/subscriptions.test.js.map +0 -1
@@ -1,198 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import { DEFAULT_SCREENSHOT_SCALE, DEFAULT_SCREENSHOT_QUALITY, DESIGN_REVIEW_SCALE, DEVBAR_SCREENSHOT_QUALITY, scaleCanvas, canvasToDataUrl, extractBase64FromDataUrl, getMediaTypeFromDataUrl, prepareForCapture, delay, gatherScreenshotMetadata, } from './screenshotUtils.js';
3
- describe('Constants', () => {
4
- it('has valid default scale', () => {
5
- expect(DEFAULT_SCREENSHOT_SCALE).toBeGreaterThan(0);
6
- expect(DEFAULT_SCREENSHOT_SCALE).toBeLessThanOrEqual(1);
7
- });
8
- it('has valid default quality', () => {
9
- expect(DEFAULT_SCREENSHOT_QUALITY).toBeGreaterThan(0);
10
- expect(DEFAULT_SCREENSHOT_QUALITY).toBeLessThanOrEqual(1);
11
- });
12
- it('has higher quality for design review', () => {
13
- expect(DESIGN_REVIEW_SCALE).toBeGreaterThan(DEFAULT_SCREENSHOT_SCALE);
14
- });
15
- it('has higher quality for devbar screenshots', () => {
16
- expect(DEVBAR_SCREENSHOT_QUALITY).toBeGreaterThanOrEqual(DEFAULT_SCREENSHOT_QUALITY);
17
- });
18
- });
19
- describe('scaleCanvas', () => {
20
- let originalCanvas;
21
- let mockContext;
22
- beforeEach(() => {
23
- mockContext = {
24
- imageSmoothingEnabled: true,
25
- imageSmoothingQuality: 'high',
26
- drawImage: vi.fn(),
27
- };
28
- // Create a mock canvas
29
- originalCanvas = {
30
- width: 1000,
31
- height: 800,
32
- };
33
- // Mock document.createElement to return a canvas with our mock context
34
- vi.spyOn(document, 'createElement').mockImplementation((tagName) => {
35
- if (tagName === 'canvas') {
36
- return {
37
- width: 0,
38
- height: 0,
39
- getContext: () => mockContext,
40
- };
41
- }
42
- return document.createElement(tagName);
43
- });
44
- });
45
- afterEach(() => {
46
- vi.restoreAllMocks();
47
- });
48
- it('scales canvas to specified size', () => {
49
- const scaled = scaleCanvas(originalCanvas, { scale: 0.5 });
50
- expect(scaled.width).toBe(500);
51
- expect(scaled.height).toBe(400);
52
- expect(mockContext.drawImage).toHaveBeenCalledWith(originalCanvas, 0, 0, 500, 400);
53
- });
54
- it('applies image smoothing settings', () => {
55
- scaleCanvas(originalCanvas, {
56
- scale: 0.5,
57
- smoothing: true,
58
- smoothingQuality: 'medium',
59
- });
60
- expect(mockContext.imageSmoothingEnabled).toBe(true);
61
- expect(mockContext.imageSmoothingQuality).toBe('medium');
62
- });
63
- it('can disable smoothing', () => {
64
- scaleCanvas(originalCanvas, {
65
- scale: 0.5,
66
- smoothing: false,
67
- });
68
- expect(mockContext.imageSmoothingEnabled).toBe(false);
69
- });
70
- it('throws when context is null', () => {
71
- vi.spyOn(document, 'createElement').mockImplementation(() => ({
72
- width: 0,
73
- height: 0,
74
- getContext: () => null,
75
- }));
76
- expect(() => scaleCanvas(originalCanvas, { scale: 0.5 })).toThrow('Failed to get canvas 2D context');
77
- });
78
- });
79
- describe('canvasToDataUrl', () => {
80
- let mockCanvas;
81
- beforeEach(() => {
82
- mockCanvas = {
83
- toDataURL: vi.fn((type, quality) => {
84
- if (type === 'image/png') {
85
- return 'data:image/png;base64,abc123';
86
- }
87
- return `data:image/jpeg;base64,quality=${quality}`;
88
- }),
89
- };
90
- });
91
- it('defaults to JPEG with default quality', () => {
92
- const result = canvasToDataUrl(mockCanvas);
93
- expect(result).toContain('image/jpeg');
94
- expect(mockCanvas.toDataURL).toHaveBeenCalledWith('image/jpeg', DEFAULT_SCREENSHOT_QUALITY);
95
- });
96
- it('uses PNG format when specified', () => {
97
- const result = canvasToDataUrl(mockCanvas, { format: 'png' });
98
- expect(result).toBe('data:image/png;base64,abc123');
99
- expect(mockCanvas.toDataURL).toHaveBeenCalledWith('image/png');
100
- });
101
- it('uses custom quality for JPEG', () => {
102
- const result = canvasToDataUrl(mockCanvas, { quality: 0.9 });
103
- expect(result).toContain('quality=0.9');
104
- expect(mockCanvas.toDataURL).toHaveBeenCalledWith('image/jpeg', 0.9);
105
- });
106
- });
107
- describe('extractBase64FromDataUrl', () => {
108
- it('extracts base64 from PNG data URL', () => {
109
- const dataUrl = 'data:image/png;base64,abc123';
110
- expect(extractBase64FromDataUrl(dataUrl)).toBe('abc123');
111
- });
112
- it('extracts base64 from JPEG data URL', () => {
113
- const dataUrl = 'data:image/jpeg;base64,xyz789';
114
- expect(extractBase64FromDataUrl(dataUrl)).toBe('xyz789');
115
- });
116
- });
117
- describe('getMediaTypeFromDataUrl', () => {
118
- it('returns image/png for PNG data URL', () => {
119
- const dataUrl = 'data:image/png;base64,abc123';
120
- expect(getMediaTypeFromDataUrl(dataUrl)).toBe('image/png');
121
- });
122
- it('returns image/jpeg for JPEG data URL', () => {
123
- const dataUrl = 'data:image/jpeg;base64,xyz789';
124
- expect(getMediaTypeFromDataUrl(dataUrl)).toBe('image/jpeg');
125
- });
126
- it('returns image/jpeg for unknown format', () => {
127
- const dataUrl = 'data:something/else;base64,test';
128
- expect(getMediaTypeFromDataUrl(dataUrl)).toBe('image/jpeg');
129
- });
130
- });
131
- describe('prepareForCapture', () => {
132
- beforeEach(() => {
133
- document.body.classList.remove('devbar-capturing');
134
- });
135
- afterEach(() => {
136
- document.body.classList.remove('devbar-capturing');
137
- });
138
- it('adds devbar-capturing class to body', () => {
139
- prepareForCapture();
140
- expect(document.body.classList.contains('devbar-capturing')).toBe(true);
141
- });
142
- it('returns cleanup function that removes the class', () => {
143
- const cleanup = prepareForCapture();
144
- expect(document.body.classList.contains('devbar-capturing')).toBe(true);
145
- cleanup();
146
- expect(document.body.classList.contains('devbar-capturing')).toBe(false);
147
- });
148
- it('blurs the active element', () => {
149
- const input = document.createElement('input');
150
- document.body.appendChild(input);
151
- input.focus();
152
- expect(document.activeElement).toBe(input);
153
- prepareForCapture();
154
- expect(document.activeElement).not.toBe(input);
155
- document.body.removeChild(input);
156
- });
157
- });
158
- describe('delay', () => {
159
- it('resolves after specified milliseconds', async () => {
160
- vi.useFakeTimers();
161
- const promise = delay(100);
162
- expect(vi.getTimerCount()).toBe(1);
163
- vi.advanceTimersByTime(100);
164
- await promise;
165
- vi.useRealTimers();
166
- });
167
- });
168
- describe('gatherScreenshotMetadata', () => {
169
- let mockCanvas;
170
- beforeEach(() => {
171
- mockCanvas = {
172
- width: 800,
173
- height: 600,
174
- };
175
- });
176
- it('captures basic metadata', () => {
177
- const metadata = gatherScreenshotMetadata(mockCanvas);
178
- expect(metadata.width).toBe(800);
179
- expect(metadata.height).toBe(600);
180
- expect(metadata.timestamp).toBeGreaterThan(0);
181
- expect(metadata.url).toBeDefined();
182
- });
183
- it('captures viewport dimensions', () => {
184
- const metadata = gatherScreenshotMetadata(mockCanvas);
185
- expect(metadata.viewport).toBeDefined();
186
- expect(metadata.viewport.width).toBe(window.innerWidth);
187
- expect(metadata.viewport.height).toBe(window.innerHeight);
188
- });
189
- it('uses default selector when not provided', () => {
190
- const metadata = gatherScreenshotMetadata(mockCanvas);
191
- expect(metadata.selector).toBe('body');
192
- });
193
- it('uses custom selector when provided', () => {
194
- const metadata = gatherScreenshotMetadata(mockCanvas, '#main-content');
195
- expect(metadata.selector).toBe('#main-content');
196
- });
197
- });
198
- //# sourceMappingURL=screenshotUtils.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"screenshotUtils.test.js","sourceRoot":"","sources":["../../src/browser/screenshotUtils.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=anthropic.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.test.d.ts","sourceRoot":"","sources":["../../src/server/anthropic.test.ts"],"names":[],"mappings":""}
@@ -1,27 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { CLAUDE_MODEL, CLAUDE_MAX_TOKENS, CLAUDE_PRICING } from './anthropic.js';
3
- describe('CLAUDE_MODEL', () => {
4
- it('is a valid Claude model ID', () => {
5
- expect(CLAUDE_MODEL).toMatch(/^claude-/);
6
- });
7
- });
8
- describe('CLAUDE_MAX_TOKENS', () => {
9
- it('has a reasonable value', () => {
10
- expect(CLAUDE_MAX_TOKENS).toBeGreaterThan(0);
11
- expect(CLAUDE_MAX_TOKENS).toBeLessThanOrEqual(4096);
12
- });
13
- });
14
- describe('CLAUDE_PRICING', () => {
15
- it('has input and output prices', () => {
16
- expect(CLAUDE_PRICING.input).toBeDefined();
17
- expect(CLAUDE_PRICING.output).toBeDefined();
18
- });
19
- it('has positive prices', () => {
20
- expect(CLAUDE_PRICING.input).toBeGreaterThan(0);
21
- expect(CLAUDE_PRICING.output).toBeGreaterThan(0);
22
- });
23
- it('output is more expensive than input', () => {
24
- expect(CLAUDE_PRICING.output).toBeGreaterThan(CLAUDE_PRICING.input);
25
- });
26
- });
27
- //# sourceMappingURL=anthropic.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"anthropic.test.js","sourceRoot":"","sources":["../../src/server/anthropic.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,iBAAiB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=constants.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.test.d.ts","sourceRoot":"","sources":["../../src/server/constants.test.ts"],"names":[],"mappings":""}
@@ -1,25 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { PACKAGE_INFO, SCREENSHOT_REQUEST_TIMEOUT_MS } from './constants.js';
3
- describe('PACKAGE_INFO', () => {
4
- it('has required fields', () => {
5
- expect(PACKAGE_INFO.name).toBeDefined();
6
- expect(PACKAGE_INFO.version).toBeDefined();
7
- expect(PACKAGE_INFO.description).toBeDefined();
8
- });
9
- it('has correct package name', () => {
10
- expect(PACKAGE_INFO.name).toBe('@ytspar/sweetlink');
11
- });
12
- it('has version string', () => {
13
- expect(PACKAGE_INFO.version).toMatch(/^\d+\.\d+\.\d+$/);
14
- });
15
- it('has protocol type', () => {
16
- expect(PACKAGE_INFO.protocol).toBe('WebSocket');
17
- });
18
- });
19
- describe('SCREENSHOT_REQUEST_TIMEOUT_MS', () => {
20
- it('has reasonable timeout value', () => {
21
- expect(SCREENSHOT_REQUEST_TIMEOUT_MS).toBeGreaterThan(1000);
22
- expect(SCREENSHOT_REQUEST_TIMEOUT_MS).toBeLessThan(60000);
23
- });
24
- });
25
- //# sourceMappingURL=constants.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.test.js","sourceRoot":"","sources":["../../src/server/constants.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAE7E,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,6BAA6B,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,6BAA6B,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=subscriptions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscriptions.test.d.ts","sourceRoot":"","sources":["../../src/server/subscriptions.test.ts"],"names":[],"mappings":""}
@@ -1,100 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { logSubscriptions, channelSubscriptions, pendingScreenshotRequests, cleanupClientSubscriptions, } from './subscriptions.js';
3
- // Create mock WebSocket
4
- function createMockWs() {
5
- return {
6
- readyState: 1,
7
- send: vi.fn(),
8
- };
9
- }
10
- describe('cleanupClientSubscriptions', () => {
11
- beforeEach(() => {
12
- // Clear all maps before each test
13
- logSubscriptions.clear();
14
- channelSubscriptions.clear();
15
- pendingScreenshotRequests.clear();
16
- });
17
- it('removes client from channel subscriptions', () => {
18
- const ws1 = createMockWs();
19
- const ws2 = createMockWs();
20
- const channelSubs = [
21
- { clientWs: ws1, channel: 'test' },
22
- { clientWs: ws2, channel: 'test' },
23
- ];
24
- channelSubscriptions.set('test', channelSubs);
25
- cleanupClientSubscriptions(ws1);
26
- const remaining = channelSubscriptions.get('test');
27
- expect(remaining?.length).toBe(1);
28
- expect(remaining?.[0].clientWs).toBe(ws2);
29
- });
30
- it('removes log subscriptions for client', () => {
31
- const ws1 = createMockWs();
32
- const ws2 = createMockWs();
33
- logSubscriptions.set('log1', {
34
- clientWs: ws1,
35
- subscriptionId: 'log1',
36
- filter: '',
37
- });
38
- logSubscriptions.set('log2', {
39
- clientWs: ws2,
40
- subscriptionId: 'log2',
41
- filter: '',
42
- });
43
- cleanupClientSubscriptions(ws1);
44
- expect(logSubscriptions.has('log1')).toBe(false);
45
- expect(logSubscriptions.has('log2')).toBe(true);
46
- });
47
- it('clears pending screenshot requests for client', () => {
48
- const ws1 = createMockWs();
49
- const ws2 = createMockWs();
50
- const timeout1 = setTimeout(() => { }, 10000);
51
- const timeout2 = setTimeout(() => { }, 10000);
52
- pendingScreenshotRequests.set('req1', {
53
- clientWs: ws1,
54
- requestId: 'req1',
55
- timeout: timeout1,
56
- });
57
- pendingScreenshotRequests.set('req2', {
58
- clientWs: ws2,
59
- requestId: 'req2',
60
- timeout: timeout2,
61
- });
62
- vi.spyOn(global, 'clearTimeout');
63
- cleanupClientSubscriptions(ws1);
64
- expect(pendingScreenshotRequests.has('req1')).toBe(false);
65
- expect(pendingScreenshotRequests.has('req2')).toBe(true);
66
- expect(clearTimeout).toHaveBeenCalled();
67
- clearTimeout(timeout2);
68
- });
69
- it('handles empty subscriptions gracefully', () => {
70
- const ws = createMockWs();
71
- // Should not throw
72
- expect(() => cleanupClientSubscriptions(ws)).not.toThrow();
73
- });
74
- it('removes client from multiple channels', () => {
75
- const ws = createMockWs();
76
- channelSubscriptions.set('channel1', [{
77
- clientWs: ws,
78
- channel: 'channel1',
79
- }]);
80
- channelSubscriptions.set('channel2', [{
81
- clientWs: ws,
82
- channel: 'channel2',
83
- }]);
84
- cleanupClientSubscriptions(ws);
85
- expect(channelSubscriptions.get('channel1')?.length).toBe(0);
86
- expect(channelSubscriptions.get('channel2')?.length).toBe(0);
87
- });
88
- });
89
- describe('subscription maps', () => {
90
- it('logSubscriptions is a Map', () => {
91
- expect(logSubscriptions instanceof Map).toBe(true);
92
- });
93
- it('channelSubscriptions is a Map', () => {
94
- expect(channelSubscriptions instanceof Map).toBe(true);
95
- });
96
- it('pendingScreenshotRequests is a Map', () => {
97
- expect(pendingScreenshotRequests instanceof Map).toBe(true);
98
- });
99
- });
100
- //# sourceMappingURL=subscriptions.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscriptions.test.js","sourceRoot":"","sources":["../../src/server/subscriptions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,GAI3B,MAAM,oBAAoB,CAAC;AAE5B,wBAAwB;AACxB,SAAS,YAAY;IACnB,OAAO;QACL,UAAU,EAAE,CAAC;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;KACU,CAAC;AAC5B,CAAC;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,UAAU,CAAC,GAAG,EAAE;QACd,kCAAkC;QAClC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACzB,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAC7B,yBAAyB,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAE3B,MAAM,WAAW,GAAkC;YACjD,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;YAClC,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;SACnC,CAAC;QACF,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE9C,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAEhC,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAE3B,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE;YAC3B,QAAQ,EAAE,GAAG;YACb,cAAc,EAAE,MAAM;YACtB,MAAM,EAAE,EAAE;SACgB,CAAC,CAAC;QAC9B,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE;YAC3B,QAAQ,EAAE,GAAG;YACb,cAAc,EAAE,MAAM;YACtB,MAAM,EAAE,EAAE;SACgB,CAAC,CAAC;QAE9B,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAEhC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAE3B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAE7C,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE;YACpC,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,QAAQ;SACU,CAAC,CAAC;QAC/B,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE;YACpC,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,QAAQ;SACU,CAAC,CAAC;QAE/B,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAEjC,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAEhC,MAAM,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAExC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;QAE1B,mBAAmB;QACnB,MAAM,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;QAE1B,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;gBACpC,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC,CAAC;QACJ,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;gBACpC,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC,CAAC;QAEJ,0BAA0B,CAAC,EAAE,CAAC,CAAC;QAE/B,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,gBAAgB,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,oBAAoB,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,yBAAyB,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}