-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathtest-message-queue.js
More file actions
108 lines (86 loc) · 3.24 KB
/
Copy pathtest-message-queue.js
File metadata and controls
108 lines (86 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
* Test script for WebSocket message queue functionality
*
* This script tests the scenario where:
* 1. A message is sent when no clients are connected (should be queued)
* 2. A client connects later (should receive the queued message)
*/
const WebSocket = require('ws')
const fs = require('fs')
const path = require('path')
const os = require('os')
// Read the WebSocket key
const WS_KEY_FILE = path.join(os.homedir(), '.keyboard-mcp', '.keyboard-mcp-ws-key')
async function getWebSocketKey() {
try {
const keyData = fs.readFileSync(WS_KEY_FILE, 'utf8')
const parsedData = JSON.parse(keyData)
return parsedData.key
} catch (error) {
console.error('❌ Error reading WebSocket key:', error.message)
console.log('💡 Make sure the WebSocket server is running first')
process.exit(1)
}
}
async function testMessageQueue() {
console.log('🧪 Testing WebSocket Message Queue\n')
const key = await getWebSocketKey()
const wsUrl = `ws://127.0.0.1:4002?key=${key}`
// Test 1: Connect a client and send a message to trigger queuing
console.log('📋 Test 1: Sending message with only one client connected')
console.log(' (Message should be queued for other clients)\n')
const client1 = new WebSocket(wsUrl)
await new Promise((resolve) => {
client1.on('open', () => {
console.log('✅ Client 1 connected')
// Send a test message - this will be queued for future clients
const testMessage = {
type: 'request-provider-token',
providerId: 'test-provider',
requestId: 'test-request-123',
timestamp: Date.now()
}
console.log('📤 Client 1 sending message:', JSON.stringify(testMessage, null, 2))
client1.send(JSON.stringify(testMessage))
// Wait a moment for the message to be processed
setTimeout(resolve, 1000)
})
})
// Test 2: Connect a second client after a delay
console.log('\n📋 Test 2: Connecting second client after 2 seconds')
console.log(' (Should receive queued messages)\n')
await new Promise((resolve) => setTimeout(resolve, 2000))
const client2 = new WebSocket(wsUrl)
let receivedMessages = []
client2.on('message', (data) => {
const message = JSON.parse(data.toString())
receivedMessages.push(message)
console.log('📨 Client 2 received queued message:', JSON.stringify(message, null, 2))
})
await new Promise((resolve) => {
client2.on('open', () => {
console.log('✅ Client 2 connected')
// Wait a bit to receive any queued messages
setTimeout(() => {
console.log(`\n📊 Client 2 received ${receivedMessages.length} queued message(s)`)
if (receivedMessages.length > 0) {
console.log('✅ SUCCESS: Message queue is working!')
console.log(' Messages were queued and delivered to the late-connecting client')
} else {
console.log('⚠️ WARNING: No messages received')
console.log(' This might mean the queue TTL expired or messages weren\'t queued')
}
resolve()
}, 2000)
})
})
// Cleanup
client1.close()
client2.close()
console.log('\n🧪 Test completed\n')
}
// Run the test
testMessageQueue().catch((error) => {
console.error('❌ Test failed:', error)
process.exit(1)
})