Tengo problemas para ejecutar un websocket K6 durante más de 15 segundos en 1 VU.
El código es de la documentación:
const socketUrl = `${resBody.url.replace('https', 'wss')}&id=${connectionId}`; res = ws.connect(socketUrl, params, function (socket) { socket.on('open', function() { console.log('connected'); socket.setInterval(function timeout() { socket.ping(); }, 1000); var payload = JSON.stringify({ 'protocol': 'json', 'version': 1 }); socket.send(payload); }); socket.on('message', (data) => console.log('Message received: ', data)); socket.on('close', () => console.log('disconnected')); socket.on('error', (e) => console.log('Error: ', e.error())); socket.on('ping', function() { console.log('ping'); socket.pong(); }); socket.on('pong', () => console.log('pong')); socket.on('priceupdates', (data) => console.log('PriceUpdates: ', data)); socket.setTimeout(function () { console.log('Timeout'); socket.close(); }, 1000 * 60 * 100); }); check(res, { 'status is 101': (r) => r && r.status === 101 });Ejecutar comando:
k6 ejecutar --vus 1 --iteraciones 1 --duración 1m --min-iteración-duración 30s live_prices.js
Y la salida:
Encontré que necesitamos enviar un mensaje de apretón de manos justo después de que se establezca la conexión
var payload = JSON.stringify({ 'protocol': 'json', 'version': 1 });pero con Record Ending char (ASCII char 30) al final.
Así que terminé enviando:
const endOfRecord = String.fromCharCode(30); var payload = JSON.stringify({ 'protocol': 'json', 'version': 1 }) + endOfRecord;Después de eso todo comenzó a funcionar correctamente.