ug-js-sdk 3.0.51 → 3.0.57

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 (71) hide show
  1. package/README.md +3 -3
  2. package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.d.ts +7 -0
  3. package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.js +16 -0
  4. package/dist/ug-core/__tests__/__mocks__/ErrorRetryHandler.js.map +1 -0
  5. package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.d.ts +10 -0
  6. package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.js +16 -0
  7. package/dist/ug-core/__tests__/__mocks__/mpg123-decoder.js.map +1 -0
  8. package/dist/ug-core/__tests__/__mocks__/uuid.d.ts +2 -0
  9. package/dist/ug-core/__tests__/__mocks__/uuid.js +11 -0
  10. package/dist/ug-core/__tests__/__mocks__/uuid.js.map +1 -0
  11. package/dist/ug-core/__tests__/__mocks__/vad-web.d.ts +11 -0
  12. package/dist/ug-core/__tests__/__mocks__/vad-web.js +19 -0
  13. package/dist/ug-core/__tests__/__mocks__/vad-web.js.map +1 -0
  14. package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.d.ts +1 -0
  15. package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.js +67 -0
  16. package/dist/ug-core/__tests__/conversation-manager/ConversationCommands.test.js.map +1 -0
  17. package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.d.ts +1 -0
  18. package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.js +185 -0
  19. package/dist/ug-core/__tests__/conversation-manager/ConversationManager.test.js.map +1 -0
  20. package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.d.ts +1 -0
  21. package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.js +168 -0
  22. package/dist/ug-core/__tests__/conversation-manager/ErrorRetryHandler.test.js.map +1 -0
  23. package/dist/ug-core/__tests__/core/EventEmitter.test.d.ts +1 -0
  24. package/dist/ug-core/__tests__/core/EventEmitter.test.js +211 -0
  25. package/dist/ug-core/__tests__/core/EventEmitter.test.js.map +1 -0
  26. package/dist/ug-core/__tests__/core/Logger.test.d.ts +1 -0
  27. package/dist/ug-core/__tests__/core/Logger.test.js +162 -0
  28. package/dist/ug-core/__tests__/core/Logger.test.js.map +1 -0
  29. package/dist/ug-core/__tests__/core/localStorage.test.d.ts +1 -0
  30. package/dist/ug-core/__tests__/core/localStorage.test.js +172 -0
  31. package/dist/ug-core/__tests__/core/localStorage.test.js.map +1 -0
  32. package/dist/ug-core/__tests__/e2e/replicate-test.e2e.d.ts +15 -0
  33. package/dist/ug-core/__tests__/e2e/replicate-test.e2e.js +224 -0
  34. package/dist/ug-core/__tests__/e2e/replicate-test.e2e.js.map +1 -0
  35. package/dist/ug-core/__tests__/network/WebSocketConnection.test.d.ts +1 -0
  36. package/dist/ug-core/__tests__/network/WebSocketConnection.test.js +193 -0
  37. package/dist/ug-core/__tests__/network/WebSocketConnection.test.js.map +1 -0
  38. package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.d.ts +1 -0
  39. package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.js +228 -0
  40. package/dist/ug-core/__tests__/playback-manager/SubtitleManager.test.js.map +1 -0
  41. package/dist/ug-core/__tests__/setup.d.ts +4 -0
  42. package/dist/ug-core/__tests__/setup.js +8 -0
  43. package/dist/ug-core/__tests__/setup.js.map +1 -0
  44. package/dist/ug-core/conversation-manager/ConversationManager.js +18 -0
  45. package/dist/ug-core/conversation-manager/ConversationManager.js.map +1 -1
  46. package/dist/ug-core/conversation-manager/ErrorRetryHandler.d.ts +1 -0
  47. package/dist/ug-core/conversation-manager/ErrorRetryHandler.js +3 -0
  48. package/dist/ug-core/conversation-manager/ErrorRetryHandler.js.map +1 -1
  49. package/dist/ug-core/conversation-manager/types.d.ts +51 -6
  50. package/dist/ug-core/network/ConversationNetwork.js +12 -6
  51. package/dist/ug-core/network/ConversationNetwork.js.map +1 -1
  52. package/dist/ug-core/playback-manager/PlaybackManager.d.ts +104 -0
  53. package/dist/ug-core/playback-manager/PlaybackManager.js +121 -4
  54. package/dist/ug-core/playback-manager/PlaybackManager.js.map +1 -1
  55. package/dist/ug-core/playback-manager/audio-player/AudioPlayer.d.ts +156 -0
  56. package/dist/ug-core/playback-manager/audio-player/AudioPlayer.js +156 -0
  57. package/dist/ug-core/playback-manager/audio-player/AudioPlayer.js.map +1 -1
  58. package/dist/ug-core/playback-manager/subtitle-manager/SubtitleManager.js +3 -1
  59. package/dist/ug-core/playback-manager/subtitle-manager/SubtitleManager.js.map +1 -1
  60. package/dist/ug-core/types/index.d.ts +34 -3
  61. package/dist/ug-core/user-input-manager/AudioRecorder.d.ts +49 -0
  62. package/dist/ug-core/user-input-manager/AudioRecorder.js +39 -1
  63. package/dist/ug-core/user-input-manager/AudioRecorder.js.map +1 -1
  64. package/dist/ug-core/user-input-manager/UserInputManager.d.ts +82 -6
  65. package/dist/ug-core/user-input-manager/UserInputManager.js +82 -6
  66. package/dist/ug-core/user-input-manager/UserInputManager.js.map +1 -1
  67. package/dist/ug-core/user-input-manager/VADManager.d.ts +62 -0
  68. package/dist/ug-core/user-input-manager/VADManager.js +99 -8
  69. package/dist/ug-core/user-input-manager/VADManager.js.map +1 -1
  70. package/dist/ug-js-sdk.mjs +1 -1
  71. package/package.json +1 -1
@@ -0,0 +1,224 @@
1
+ /**
2
+ * E2E Test for Replicate Image Generation
3
+ *
4
+ * Tests all 3 generation methods:
5
+ * 1. Text-to-image (prompt only)
6
+ * 2. Kontext-Pro (reference image + prompt)
7
+ * 3. Redux (reference image + prompt + model: 'redux')
8
+ *
9
+ * Run with:
10
+ * UG_API_URL="https://pug.dev.uglabs.app" \
11
+ * UG_API_KEY="your-key" \
12
+ * UG_FEDERATED_ID="your-id" \
13
+ * npx tsx src/ug-core/__tests__/e2e/replicate-test.e2e.ts
14
+ */
15
+ import axios from 'axios';
16
+ import * as fs from 'fs';
17
+ import * as path from 'path';
18
+ const API_URL = process.env.UG_API_URL;
19
+ const API_KEY = process.env.UG_API_KEY;
20
+ const FEDERATED_ID = process.env.UG_FEDERATED_ID || 'e2e-test-user';
21
+ const OUTPUT_DIR = path.join(__dirname, 'output');
22
+ if (!API_URL || !API_KEY) {
23
+ console.error('❌ Missing credentials. Set UG_API_URL and UG_API_KEY');
24
+ process.exit(1);
25
+ }
26
+ // Create a simple white PNG for reference image tests
27
+ function createWhitePNG() {
28
+ const zlib = require('zlib');
29
+ const width = 64, height = 64;
30
+ const signature = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
31
+ const ihdrData = Buffer.alloc(13);
32
+ ihdrData.writeUInt32BE(width, 0);
33
+ ihdrData.writeUInt32BE(height, 4);
34
+ ihdrData.writeUInt8(8, 8);
35
+ ihdrData.writeUInt8(2, 9);
36
+ ihdrData.writeUInt8(0, 10);
37
+ ihdrData.writeUInt8(0, 11);
38
+ ihdrData.writeUInt8(0, 12);
39
+ const rawData = [];
40
+ for (let y = 0; y < height; y++) {
41
+ rawData.push(0);
42
+ for (let x = 0; x < width; x++) {
43
+ rawData.push(255, 255, 255);
44
+ }
45
+ }
46
+ const compressed = zlib.deflateSync(Buffer.from(rawData));
47
+ const chunk = (type, data) => {
48
+ const len = Buffer.alloc(4);
49
+ len.writeUInt32BE(data.length, 0);
50
+ const t = Buffer.from(type, 'ascii');
51
+ const crcData = Buffer.concat([t, data]);
52
+ let crc = 0xffffffff;
53
+ const table = [];
54
+ for (let n = 0; n < 256; n++) {
55
+ let c = n;
56
+ for (let k = 0; k < 8; k++)
57
+ c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
58
+ table[n] = c;
59
+ }
60
+ for (let i = 0; i < crcData.length; i++)
61
+ crc = (crc >>> 8) ^ table[(crc ^ crcData[i]) & 0xff];
62
+ crc ^= 0xffffffff;
63
+ const crcBuf = Buffer.alloc(4);
64
+ crcBuf.writeUInt32BE(crc >>> 0, 0);
65
+ return Buffer.concat([len, t, data, crcBuf]);
66
+ };
67
+ return Buffer.concat([signature, chunk('IHDR', ihdrData), chunk('IDAT', compressed), chunk('IEND', Buffer.alloc(0))]).toString('base64');
68
+ }
69
+ function saveImage(base64, filename) {
70
+ if (!fs.existsSync(OUTPUT_DIR))
71
+ fs.mkdirSync(OUTPUT_DIR, { recursive: true });
72
+ fs.writeFileSync(path.join(OUTPUT_DIR, filename), Buffer.from(base64, 'base64'));
73
+ console.log(` 📁 Saved: output/${filename}`);
74
+ }
75
+ async function main() {
76
+ console.log('╔═══════════════════════════════════════════════════════════╗');
77
+ console.log('║ Replicate Image Generation E2E Test ║');
78
+ console.log('╚═══════════════════════════════════════════════════════════╝');
79
+ console.log('');
80
+ // Authenticate
81
+ console.log('🔐 Authenticating...');
82
+ const authResp = await axios.post(`${API_URL}/api/auth/login`, {
83
+ api_key: API_KEY,
84
+ federated_id: FEDERATED_ID
85
+ });
86
+ const token = authResp.data.access_token;
87
+ console.log('✅ Authenticated');
88
+ console.log('');
89
+ const results = [];
90
+ // ==========================================================================
91
+ // TEST 1: Text-to-Image (prompt only)
92
+ // ==========================================================================
93
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
94
+ console.log('TEST 1: Text-to-Image (prompt only)');
95
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
96
+ console.log(' Prompt: "a solid blue square"');
97
+ console.log(' ⏳ Generating...');
98
+ let start = Date.now();
99
+ try {
100
+ const resp = await axios.post(`${API_URL}/api/images/generate/replicate`, {
101
+ prompt: 'a solid blue square, simple, minimal',
102
+ aspect_ratio: '1:1',
103
+ inference_steps: 4,
104
+ }, { headers: { Authorization: `Bearer ${token}` }, timeout: 120000 });
105
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
106
+ if (resp.data.image) {
107
+ console.log(` ✅ PASSED (${elapsed}s)`);
108
+ saveImage(resp.data.image, '1-text-to-image.png');
109
+ results.push({ name: 'Text-to-Image', passed: true });
110
+ }
111
+ else {
112
+ console.log(` ❌ FAILED: No image in response (${elapsed}s)`);
113
+ results.push({ name: 'Text-to-Image', passed: false });
114
+ }
115
+ }
116
+ catch (error) {
117
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
118
+ console.log(` ❌ FAILED: ${error.message} (${elapsed}s)`);
119
+ results.push({ name: 'Text-to-Image', passed: false });
120
+ }
121
+ console.log('');
122
+ // ==========================================================================
123
+ // TEST 2: Kontext-Pro (reference image + prompt, default)
124
+ // ==========================================================================
125
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
126
+ console.log('TEST 2: Kontext-Pro (reference image + prompt)');
127
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
128
+ const whiteImage = createWhitePNG();
129
+ saveImage(whiteImage, '2-kontext-input-white.png');
130
+ console.log(' Input: white square (64x64)');
131
+ console.log(' Prompt: "change the color to blue"');
132
+ console.log(' Model: Kontext-Pro (default)');
133
+ console.log(' ⏳ Processing...');
134
+ start = Date.now();
135
+ try {
136
+ const resp = await axios.post(`${API_URL}/api/images/generate/replicate`, {
137
+ prompt: 'change the color to blue, keep it as a solid color square',
138
+ image: whiteImage,
139
+ }, { headers: { Authorization: `Bearer ${token}` }, timeout: 120000 });
140
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
141
+ if (resp.data.image) {
142
+ console.log(` ✅ PASSED (${elapsed}s)`);
143
+ saveImage(resp.data.image, '2-kontext-output.png');
144
+ results.push({ name: 'Kontext-Pro', passed: true });
145
+ }
146
+ else {
147
+ console.log(` ❌ FAILED: No image in response (${elapsed}s)`);
148
+ results.push({ name: 'Kontext-Pro', passed: false });
149
+ }
150
+ }
151
+ catch (error) {
152
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
153
+ console.log(` ❌ FAILED: ${error.message} (${elapsed}s)`);
154
+ results.push({ name: 'Kontext-Pro', passed: false });
155
+ }
156
+ console.log('');
157
+ // ==========================================================================
158
+ // TEST 3: Redux (reference image + prompt + model: 'redux')
159
+ // ==========================================================================
160
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
161
+ console.log('TEST 3: Redux (reference image + prompt + model)');
162
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
163
+ saveImage(whiteImage, '3-redux-input-white.png');
164
+ console.log(' Input: white square (64x64)');
165
+ console.log(' Prompt: "a green square"');
166
+ console.log(' Model: redux');
167
+ console.log(' Strength: 0.8');
168
+ console.log(' ⏳ Processing...');
169
+ start = Date.now();
170
+ try {
171
+ const resp = await axios.post(`${API_URL}/api/images/generate/replicate`, {
172
+ prompt: 'a green square',
173
+ image: whiteImage,
174
+ model: 'redux',
175
+ strength: 0.8,
176
+ guidance_scale: 3.5,
177
+ inference_steps: 4,
178
+ }, { headers: { Authorization: `Bearer ${token}` }, timeout: 120000 });
179
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
180
+ if (resp.data.image) {
181
+ console.log(` ✅ PASSED (${elapsed}s)`);
182
+ saveImage(resp.data.image, '3-redux-output.png');
183
+ results.push({ name: 'Redux', passed: true });
184
+ }
185
+ else {
186
+ console.log(` ❌ FAILED: No image in response (${elapsed}s)`);
187
+ results.push({ name: 'Redux', passed: false });
188
+ }
189
+ }
190
+ catch (error) {
191
+ const elapsed = ((Date.now() - start) / 1000).toFixed(1);
192
+ console.log(` ❌ FAILED: ${error.message} (${elapsed}s)`);
193
+ results.push({ name: 'Redux', passed: false });
194
+ }
195
+ // ==========================================================================
196
+ // Summary
197
+ // ==========================================================================
198
+ console.log('');
199
+ console.log('╔═══════════════════════════════════════════════════════════╗');
200
+ console.log('║ Results ║');
201
+ console.log('╚═══════════════════════════════════════════════════════════╝');
202
+ let passed = 0;
203
+ for (const r of results) {
204
+ const icon = r.passed ? '✅' : '❌';
205
+ console.log(` ${icon} ${r.name}`);
206
+ if (r.passed)
207
+ passed++;
208
+ }
209
+ console.log('');
210
+ console.log(` ${passed}/${results.length} tests passed`);
211
+ console.log('');
212
+ if (passed === results.length) {
213
+ console.log('🎉 All tests passed!');
214
+ }
215
+ else {
216
+ console.log('⚠️ Some tests failed');
217
+ process.exit(1);
218
+ }
219
+ }
220
+ main().catch(err => {
221
+ console.error('Error:', err.message);
222
+ process.exit(1);
223
+ });
224
+ //# sourceMappingURL=replicate-test.e2e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replicate-test.e2e.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/e2e/replicate-test.e2e.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,193 @@
1
+ import { WebSocketConnection } from '@/ug-core/network/WebSocketConnection';
2
+ // Mock WebSocket constants
3
+ const WS_CONNECTING = 0;
4
+ const WS_OPEN = 1;
5
+ const WS_CLOSING = 2;
6
+ const WS_CLOSED = 3;
7
+ // Mock WebSocket
8
+ class MockWebSocket {
9
+ url;
10
+ static CONNECTING = WS_CONNECTING;
11
+ static OPEN = WS_OPEN;
12
+ static CLOSING = WS_CLOSING;
13
+ static CLOSED = WS_CLOSED;
14
+ readyState = WS_CONNECTING;
15
+ onopen = null;
16
+ onmessage = null;
17
+ onerror = null;
18
+ onclose = null;
19
+ constructor(url) {
20
+ this.url = url;
21
+ }
22
+ send = jest.fn();
23
+ close = jest.fn();
24
+ // Helper to simulate connection open
25
+ simulateOpen() {
26
+ this.readyState = WS_OPEN;
27
+ this.onopen?.();
28
+ }
29
+ // Helper to simulate message
30
+ simulateMessage(data) {
31
+ this.onmessage?.({ data: JSON.stringify(data) });
32
+ }
33
+ // Helper to simulate error
34
+ simulateError(error) {
35
+ this.onerror?.(error);
36
+ }
37
+ // Helper to simulate close
38
+ simulateClose() {
39
+ this.readyState = WS_CLOSED;
40
+ this.onclose?.();
41
+ }
42
+ }
43
+ describe('WebSocketConnection', () => {
44
+ let connection;
45
+ let handlers;
46
+ let mockWebSocket;
47
+ let originalWebSocket;
48
+ beforeEach(() => {
49
+ handlers = {
50
+ onOpen: jest.fn(),
51
+ onMessage: jest.fn(),
52
+ onError: jest.fn(),
53
+ onClose: jest.fn(),
54
+ };
55
+ // Store original and mock WebSocket
56
+ originalWebSocket = global.WebSocket;
57
+ // Create mock WebSocket constructor with static constants
58
+ const MockWebSocketConstructor = jest.fn().mockImplementation((url) => {
59
+ mockWebSocket = new MockWebSocket(url);
60
+ return mockWebSocket;
61
+ });
62
+ MockWebSocketConstructor.CONNECTING = WS_CONNECTING;
63
+ MockWebSocketConstructor.OPEN = WS_OPEN;
64
+ MockWebSocketConstructor.CLOSING = WS_CLOSING;
65
+ MockWebSocketConstructor.CLOSED = WS_CLOSED;
66
+ global.WebSocket = MockWebSocketConstructor;
67
+ connection = new WebSocketConnection('wss://test.server.com', handlers);
68
+ });
69
+ afterEach(() => {
70
+ global.WebSocket = originalWebSocket;
71
+ });
72
+ describe('connect()', () => {
73
+ it('should create WebSocket with correct URL', () => {
74
+ connection.connect();
75
+ expect(global.WebSocket).toHaveBeenCalledWith('wss://test.server.com');
76
+ });
77
+ it('should call onOpen handler when connection opens', () => {
78
+ connection.connect();
79
+ mockWebSocket.simulateOpen();
80
+ expect(handlers.onOpen).toHaveBeenCalled();
81
+ });
82
+ it('should call onMessage handler when message received', () => {
83
+ connection.connect();
84
+ mockWebSocket.simulateOpen();
85
+ const testMessage = { type: 'test', data: 'hello' };
86
+ mockWebSocket.simulateMessage(testMessage);
87
+ expect(handlers.onMessage).toHaveBeenCalledWith(testMessage);
88
+ });
89
+ it('should call onError handler when error occurs', () => {
90
+ connection.connect();
91
+ const error = new Error('Connection failed');
92
+ mockWebSocket.simulateError(error);
93
+ expect(handlers.onError).toHaveBeenCalledWith(error);
94
+ });
95
+ it('should call onClose handler when connection closes', () => {
96
+ connection.connect();
97
+ mockWebSocket.simulateOpen();
98
+ mockWebSocket.simulateClose();
99
+ expect(handlers.onClose).toHaveBeenCalled();
100
+ });
101
+ });
102
+ describe('disconnect()', () => {
103
+ it('should close WebSocket with code 1000', () => {
104
+ connection.connect();
105
+ mockWebSocket.simulateOpen();
106
+ connection.disconnect();
107
+ expect(mockWebSocket.close).toHaveBeenCalledWith(1000, 'Client initiated disconnect');
108
+ });
109
+ it('should clear all handlers before closing', () => {
110
+ connection.connect();
111
+ mockWebSocket.simulateOpen();
112
+ connection.disconnect();
113
+ expect(mockWebSocket.onmessage).toBeNull();
114
+ expect(mockWebSocket.onerror).toBeNull();
115
+ expect(mockWebSocket.onclose).toBeNull();
116
+ });
117
+ it('should handle disconnect when not connected', () => {
118
+ // Should not throw when websocket is null
119
+ expect(() => connection.disconnect()).not.toThrow();
120
+ });
121
+ });
122
+ describe('send()', () => {
123
+ it('should send JSON stringified data when connected', () => {
124
+ connection.connect();
125
+ mockWebSocket.simulateOpen();
126
+ const data = { type: 'message', text: 'hello' };
127
+ connection.send(data);
128
+ expect(mockWebSocket.send).toHaveBeenCalledWith(JSON.stringify(data));
129
+ });
130
+ it('should throw error when WebSocket is not open', () => {
131
+ connection.connect();
132
+ // Don't simulate open, so readyState is still CONNECTING
133
+ expect(() => connection.send({ test: 'data' })).toThrow('Cant send. WebSocket is not open');
134
+ });
135
+ it('should throw error when WebSocket is not connected', () => {
136
+ // Don't call connect()
137
+ expect(() => connection.send({ test: 'data' })).toThrow('Cant send. WebSocket is not open');
138
+ });
139
+ });
140
+ describe('isReady()', () => {
141
+ it('should return false when not connected', () => {
142
+ expect(connection.isReady()).toBe(false);
143
+ });
144
+ it('should return false when connecting', () => {
145
+ connection.connect();
146
+ // readyState is CONNECTING by default
147
+ expect(connection.isReady()).toBe(false);
148
+ });
149
+ it('should return true when connected', () => {
150
+ connection.connect();
151
+ mockWebSocket.simulateOpen();
152
+ expect(connection.isReady()).toBe(true);
153
+ });
154
+ it('should return false after disconnect', () => {
155
+ connection.connect();
156
+ mockWebSocket.simulateOpen();
157
+ connection.disconnect();
158
+ expect(connection.isReady()).toBe(false);
159
+ });
160
+ });
161
+ describe('handler edge cases', () => {
162
+ it('should handle missing onOpen handler', () => {
163
+ const partialHandlers = {
164
+ onMessage: jest.fn(),
165
+ };
166
+ const conn = new WebSocketConnection('wss://test.com', partialHandlers);
167
+ conn.connect();
168
+ expect(() => mockWebSocket.simulateOpen()).not.toThrow();
169
+ });
170
+ it('should handle missing onMessage handler', () => {
171
+ const partialHandlers = {
172
+ onOpen: jest.fn(),
173
+ };
174
+ const conn = new WebSocketConnection('wss://test.com', partialHandlers);
175
+ conn.connect();
176
+ mockWebSocket.simulateOpen();
177
+ expect(() => mockWebSocket.simulateMessage({ test: 'data' })).not.toThrow();
178
+ });
179
+ it('should handle missing onError handler', () => {
180
+ const partialHandlers = {};
181
+ const conn = new WebSocketConnection('wss://test.com', partialHandlers);
182
+ conn.connect();
183
+ expect(() => mockWebSocket.simulateError(new Error('test'))).not.toThrow();
184
+ });
185
+ it('should handle missing onClose handler', () => {
186
+ const partialHandlers = {};
187
+ const conn = new WebSocketConnection('wss://test.com', partialHandlers);
188
+ conn.connect();
189
+ expect(() => mockWebSocket.simulateClose()).not.toThrow();
190
+ });
191
+ });
192
+ });
193
+ //# sourceMappingURL=WebSocketConnection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketConnection.test.js","sourceRoot":"","sources":["../../../../src/ug-core/__tests__/network/WebSocketConnection.test.ts"],"names":[],"mappings":"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"}