test_websocket-server.html (2674B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Mozilla Bug</title> 6 <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> 7 <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"> 8 </head> 9 <body> 10 <script> 11 "use strict"; 12 13 window.onload = function() { 14 const { require } = ChromeUtils.importESModule("resource://devtools/shared/loader/Loader.sys.mjs"); 15 const WebSocketServer = require("devtools/server/socket/websocket-server"); 16 17 const ServerSocket = Components.Constructor("@mozilla.org/network/server-socket;1", 18 "nsIServerSocket", "init"); 19 20 add_task(async function() { 21 // Create a TCP server on auto-assigned port 22 const server = new ServerSocket(-1, true, -1); 23 ok(server, `Launched WebSocket server on port ${server.port}`); 24 25 let input, output; 26 27 server.asyncListen({ 28 async onSocketAccepted(socket, transport) { 29 info("Accepted incoming connection"); 30 input = transport.openInputStream(0, 0, 0); 31 output = transport.openOutputStream(0, 0, 0); 32 33 // Perform the WebSocket handshake 34 const webSocket = await WebSocketServer.accept(transport, input, output); 35 36 // Echo the received message back to the sender 37 webSocket.onmessage = ({ data }) => { 38 info("Server received message, echoing back"); 39 webSocket.send(data); 40 }; 41 }, 42 43 onStopListening(socket, status) { 44 info(`Server stopped listening with status: ${status}`); 45 }, 46 }); 47 48 SimpleTest.registerCleanupFunction(() => { 49 server.close(); 50 }); 51 52 // Create client connection 53 const client = await new Promise((resolve, reject) => { 54 const socket = new WebSocket(`ws://localhost:${server.port}`); 55 socket.onopen = () => resolve(socket); 56 socket.onerror = reject; 57 }); 58 ok(client, `Created WebSocket connection to port ${server.port}`); 59 60 // Create a promise that resolves when the WebSocket closes 61 const closed = new Promise(resolve => { 62 client.onclose = resolve; 63 }); 64 65 // Send a message 66 const message = "hello there"; 67 client.send(message); 68 info("Sent a message to server"); 69 // Check that it was echoed 70 const echoedMessage = await new Promise((resolve, reject) => { 71 client.onmessage = ({ data }) => resolve(data); 72 client.onerror = reject; 73 }); 74 75 is(echoedMessage, message, "Echoed message matches"); 76 77 // Close the connection 78 client.close(); 79 await closed; 80 81 // Prevent leaking the streams by closing them before test ends 82 input.close(); 83 output.close(); 84 }); 85 }; 86 </script> 87 </body> 88 </html>