test: add a unit test for the ws transport (#12550)

This commit is contained in:
Alex Rudenko 2024-06-07 13:39:47 +02:00 committed by GitHub
parent 38fb2cdb3f
commit 2e3e1e5aea
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 68 additions and 10 deletions

View File

@ -0,0 +1,60 @@
/**
* @license
* Copyright 2024 Google Inc.
* SPDX-License-Identifier: Apache-2.0
*/
import {describe, it, beforeEach, afterEach} from 'node:test';
import expect from 'expect';
import type {WebSocket} from 'ws';
import {WebSocketServer} from 'ws';
import {NodeWebSocketTransport} from './NodeWebSocketTransport.js';
describe('NodeWebSocketTransport', () => {
let wss: WebSocketServer;
let transport: NodeWebSocketTransport;
let connection: WebSocket;
beforeEach(async () => {
wss = new WebSocketServer({port: 8080});
wss.on('connection', c => {
connection = c;
});
transport = await NodeWebSocketTransport.create('ws://127.0.0.1:8080');
});
afterEach(() => {
transport.close();
wss.close();
});
it('should dispatch messages in order handling microtasks for each message first', async () => {
const log: string[] = [];
const result = new Promise<void>(resolve => {
transport.onmessage = message => {
log.push('message received ' + message);
return Promise.resolve().then(() => {
log.push('microtask1 ' + message);
return Promise.resolve().then(() => {
log.push('microtask2 ' + message);
if (log.length === 6) {
resolve();
}
});
});
};
});
connection.send('m1');
connection.send('m2');
await result;
expect(log).toEqual([
'message received m1',
'microtask1 m1',
'microtask2 m1',
'message received m2',
'microtask1 m2',
'microtask2 m2',
]);
});
});

View File

@ -20,6 +20,8 @@ export class NodeWebSocketTransport implements ConnectionTransport {
const ws = new NodeWebSocket(url, [], { const ws = new NodeWebSocket(url, [], {
followRedirects: true, followRedirects: true,
perMessageDeflate: false, perMessageDeflate: false,
// @ts-expect-error https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketaddress-protocols-options
allowSynchronousEvents: false,
maxPayload: 256 * 1024 * 1024, // 256Mb maxPayload: 256 * 1024 * 1024, // 256Mb
headers: { headers: {
'User-Agent': `Puppeteer ${packageVersion}`, 'User-Agent': `Puppeteer ${packageVersion}`,
@ -41,18 +43,14 @@ export class NodeWebSocketTransport implements ConnectionTransport {
constructor(ws: NodeWebSocket) { constructor(ws: NodeWebSocket) {
this.#ws = ws; this.#ws = ws;
this.#ws.addEventListener('message', event => { this.#ws.addEventListener('message', event => {
setImmediate(() => { if (this.onmessage) {
if (this.onmessage) { this.onmessage.call(null, event.data);
this.onmessage.call(null, event.data); }
}
});
}); });
this.#ws.addEventListener('close', () => { this.#ws.addEventListener('close', () => {
setImmediate(() => { if (this.onclose) {
if (this.onclose) { this.onclose.call(null);
this.onclose.call(null); }
}
});
}); });
// Silently ignore all errors - we don't know what to do with them. // Silently ignore all errors - we don't know what to do with them.
this.#ws.addEventListener('error', () => {}); this.#ws.addEventListener('error', () => {});