UNPKG

@fails-components/webtransport

Version:

A component to add webtransport support (server and client) to node.js using libquiche

135 lines (112 loc) 3.79 kB
// Copyright (c) 2022 Marten Richter or other contributers (see commit). All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // this file runs various tests import { generateWebTransportCertificate } from '../../test/fixtures/certificate.js' import { Http3Server, Http2Server, WebTransport, quicheLoaded } from '../lib/index.node.js' import { echoTestsConnection, runEchoServer } from './testsuite.js' let http2 = false if (process.argv.some((el) => el === 'http2')) { http2 = true } async function run() { if ( process.env.USE_HTTP2 !== 'true' && process.env.USE_PONYFILL !== 'true' && process.env.USE_POLYFILL !== 'true' ) { await quicheLoaded } console.log('try connecting to server that does not exist') const badClient = new WebTransport('https://127.0.0.1:49823/echo', { serverCertificateHashes: [ { algorithm: 'sha-256', value: Buffer.from( 'a589bf4f98a0158aa890328d5d3f519b9e2a5b1e61b09eb10b7a9be0e79bf148', 'hex' ) } ] }) await Promise.all([badClient.ready, badClient.closed]) .then(() => { console.error('Successfully connected to a non-running server?!') process.exit(1) }) .catch(() => { console.log('Did not connect to non-running server') }) console.log('start generating self signed certificate') const attrs = [ { shortName: 'C', value: 'DE' }, { shortName: 'ST', value: 'Berlin' }, { shortName: 'L', value: 'Berlin' }, { shortName: 'O', value: 'WebTransport Test Server' }, { shortName: 'CN', value: '127.0.0.1' } ] const certificate = await generateWebTransportCertificate(attrs, { days: 13 }) if (certificate == null) { throw new Error('Certificate generation failed') } console.log('start HttpServer and startup echo tests') // now ramp up the server let httpserver if (!http2) { httpserver = new Http3Server({ port: 8080, host: '127.0.0.1', secret: 'mysecret', cert: certificate.cert, // unclear if it is the correct format privKey: certificate.private }) } else { httpserver = new Http2Server({ port: 8080, host: '127.0.0.1', secret: 'mysecret', cert: certificate.cert, // unclear if it is the correct format privKey: certificate.private }) } httpserver.startServer() // you can call destroy to remove the server runEchoServer(httpserver) console.log('server started now wait 2 seconds') await new Promise((resolve) => setTimeout(resolve, 2000)) console.log('now startup client') const url = 'https://127.0.0.1:8080/echo' /** @type {import('../lib/dom').WebTransport | null} */ let client = new WebTransport(url, { serverCertificateHashes: [{ algorithm: 'sha-256', value: certificate.hash }] }) client.closed .then(() => { console.log('The HTTP connection to ', url, 'closed gracefully.') }) .catch((error) => { console.error('The HTTP connection to', url, 'closed due to ', error, '.') }) console.log('wait for client to be ready') await client.ready console.log('client is ready') await echoTestsConnection(client) console.log('Test if getStats works') console.log('getStats returned', await client.getStats()) console.log('client test finished, now close the client but wait 2 seconds') await new Promise((resolve) => setTimeout(resolve, 2000)) client.close({ closeCode: 0, reason: 'tests finished' }) client = null console.log('client closes now wait 2 seconds') await new Promise((resolve) => setTimeout(resolve, 2000)) console.log('now stop server') httpserver.stopServer() console.log('tests finished!') } run()