EverydayTech Platform - Developer Reference
Complete Source Code Documentation - All Applications
Loading...
Searching...
No Matches
test-phase2-detailed.js
Go to the documentation of this file.
1#!/usr/bin/env node
2/**
3 * Detailed Phase 2 Test - Canvas Desktop Endpoint
4 * Tests screen streaming integration with desktop multiplexor
5 */
6
7const WebSocket = require('ws');
8
9const [,, token, nodeId] = process.argv;
10
11if (!token || !nodeId) {
12 console.error('Usage: node test-phase2-detailed.js <token> <nodeId>');
13 process.exit(1);
14}
15
16// URL encode the nodeId to handle slashes
17const encodedNodeId = encodeURIComponent(nodeId);
18const url = `wss://rmm-psa-meshcentral-aq48h.ondigitalocean.app/api/canvas-desktop/${encodedNodeId}?token=${token}`;
19
20console.log('========================================');
21console.log('Phase 2 Canvas Desktop Endpoint Test');
22console.log('========================================');
23console.log('Configuration:');
24console.log(` Node ID: ${nodeId}`);
25console.log(` Token: ${token.substring(0, 20)}...`);
26console.log(` URL: ${url.replace(/\?token=.*/, '?token=***')}`);
27console.log('Connecting...');
28console.log('Test running... (press Ctrl+C to stop)');
29console.log('');
30
31let messageCount = 0;
32let connectedPhase = null;
33let capabilities = [];
34
35const ws = new WebSocket(url, {
36 rejectUnauthorized: false
37});
38
39ws.on('open', () => {
40 console.log('āœ… WebSocket connection OPENED');
41 console.log('');
42
43 // Send a ping to test Phase 1 functionality
44 console.log('šŸ“¤ Sending ping...');
45 ws.send(JSON.stringify({ type: 'ping' }));
46});
47
48ws.on('message', (data) => {
49 messageCount++;
50
51 try {
52 // Try to parse as JSON first (control messages)
53 const msg = JSON.parse(data.toString());
54 console.log(`šŸ“Ø Message ${messageCount} received (JSON):`);
55 console.log(JSON.stringify(msg, null, 2));
56 console.log('');
57
58 // Extract key info from connected message
59 if (msg.type === 'connected') {
60 connectedPhase = msg.phase;
61 capabilities = msg.capabilities || [];
62 console.log(`šŸŽÆ Phase ${connectedPhase} detected`);
63 console.log(`šŸ”§ Capabilities: ${capabilities.join(', ')}`);
64 console.log('');
65 }
66
67 if (msg.type === 'pong') {
68 console.log('šŸ“ Pong received - connection is alive');
69 console.log('');
70 }
71
72 } catch (e) {
73 // Binary data (screen frames from Phase 2)
74 if (Buffer.isBuffer(data)) {
75 console.log(`šŸ“ŗ Binary frame received: ${data.length} bytes`);
76 console.log(` First 20 bytes: ${data.slice(0, 20).toString('hex')}`);
77 console.log(' ⚔ This is screen data from the agent!');
78 console.log('');
79 } else {
80 console.log(`šŸ“Ø Message ${messageCount} received:`, data.toString().substring(0, 100));
81 console.log('');
82 }
83 }
84});
85
86ws.on('close', (code, reason) => {
87 console.log('šŸ”Œ WebSocket CLOSED');
88 console.log(` Code: ${code}`);
89 console.log(` Reason: ${reason || '(none)'}`);
90 console.log('');
91 console.log(`Total messages received: ${messageCount}`);
92 console.log('');
93
94 if (messageCount === 0) {
95 console.log('āŒ No messages received - connection may have failed');
96 } else if (connectedPhase === 2 && capabilities.includes('screen')) {
97 console.log('āœ… Phase 2 screen streaming ready!');
98 if (messageCount === 2) {
99 console.log('ā„¹ļø No screen frames received (agent not connected or no display)');
100 } else if (messageCount > 2) {
101 console.log(`āœ… Received ${messageCount - 2} screen frames from agent!`);
102 }
103 } else if (connectedPhase === 1) {
104 console.log('āš ļø Phase 1 only - screen streaming not yet active');
105 } else {
106 console.log('āœ… Normal closure (successful test)');
107 }
108
109 process.exit(code === 1000 ? 0 : 1);
110});
111
112ws.on('error', (err) => {
113 console.error('āŒ WebSocket ERROR:', err.message);
114 process.exit(1);
115});
116
117// Handle Ctrl+C gracefully
118process.on('SIGINT', () => {
119 console.log('\nāš ļø Interrupted by user');
120 console.log('Closing connection...');
121 ws.close();
122});
123
124// Auto-close after 10 seconds
125setTimeout(() => {
126 console.log('ā° Test timeout reached (10 seconds)');
127 console.log('Closing connection...');
128 ws.close();
129}, 10000);