11cb0ef41Sopenharmony_ci// Flags: --no-warnings 21cb0ef41Sopenharmony_ci'use strict'; 31cb0ef41Sopenharmony_ci 41cb0ef41Sopenharmony_ciconst common = require('../common'); 51cb0ef41Sopenharmony_ciif (!common.hasCrypto) 61cb0ef41Sopenharmony_ci common.skip('missing crypto'); 71cb0ef41Sopenharmony_ciconst assert = require('assert'); 81cb0ef41Sopenharmony_ciconst h2 = require('http2'); 91cb0ef41Sopenharmony_ci 101cb0ef41Sopenharmony_ciconst { PerformanceObserver } = require('perf_hooks'); 111cb0ef41Sopenharmony_ci 121cb0ef41Sopenharmony_ciconst obs = new PerformanceObserver(common.mustCallAtLeast((items) => { 131cb0ef41Sopenharmony_ci const entry = items.getEntries()[0]; 141cb0ef41Sopenharmony_ci assert.strictEqual(entry.entryType, 'http2'); 151cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.startTime, 'number'); 161cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.duration, 'number'); 171cb0ef41Sopenharmony_ci switch (entry.name) { 181cb0ef41Sopenharmony_ci case 'Http2Session': 191cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.pingRTT, 'number'); 201cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.streamAverageDuration, 'number'); 211cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.streamCount, 'number'); 221cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.framesReceived, 'number'); 231cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.framesSent, 'number'); 241cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.bytesWritten, 'number'); 251cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.bytesRead, 'number'); 261cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.maxConcurrentStreams, 'number'); 271cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.pingRTT, 'number'); 281cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.streamAverageDuration, 'number'); 291cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.streamCount, 'number'); 301cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.framesReceived, 'number'); 311cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.framesSent, 'number'); 321cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.bytesWritten, 'number'); 331cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.bytesRead, 'number'); 341cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.maxConcurrentStreams, 'number'); 351cb0ef41Sopenharmony_ci switch (entry.type) { 361cb0ef41Sopenharmony_ci case 'server': 371cb0ef41Sopenharmony_ci assert.strictEqual(entry.detail.streamCount, 1); 381cb0ef41Sopenharmony_ci assert(entry.detail.framesReceived >= 3); 391cb0ef41Sopenharmony_ci break; 401cb0ef41Sopenharmony_ci case 'client': 411cb0ef41Sopenharmony_ci assert.strictEqual(entry.detail.streamCount, 1); 421cb0ef41Sopenharmony_ci assert.strictEqual(entry.detail.framesReceived, 7); 431cb0ef41Sopenharmony_ci break; 441cb0ef41Sopenharmony_ci default: 451cb0ef41Sopenharmony_ci assert.fail('invalid Http2Session type'); 461cb0ef41Sopenharmony_ci } 471cb0ef41Sopenharmony_ci break; 481cb0ef41Sopenharmony_ci case 'Http2Stream': 491cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.timeToFirstByte, 'number'); 501cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.timeToFirstByteSent, 'number'); 511cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.timeToFirstHeader, 'number'); 521cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.bytesWritten, 'number'); 531cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.bytesRead, 'number'); 541cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.timeToFirstByte, 'number'); 551cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.timeToFirstByteSent, 'number'); 561cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.timeToFirstHeader, 'number'); 571cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.bytesWritten, 'number'); 581cb0ef41Sopenharmony_ci assert.strictEqual(typeof entry.detail.bytesRead, 'number'); 591cb0ef41Sopenharmony_ci break; 601cb0ef41Sopenharmony_ci default: 611cb0ef41Sopenharmony_ci assert.fail('invalid entry name'); 621cb0ef41Sopenharmony_ci } 631cb0ef41Sopenharmony_ci})); 641cb0ef41Sopenharmony_ci 651cb0ef41Sopenharmony_ciobs.observe({ type: 'http2' }); 661cb0ef41Sopenharmony_ci 671cb0ef41Sopenharmony_ciconst body = 681cb0ef41Sopenharmony_ci '<html><head></head><body><h1>this is some data</h2></body></html>'; 691cb0ef41Sopenharmony_ci 701cb0ef41Sopenharmony_ciconst server = h2.createServer(); 711cb0ef41Sopenharmony_ci 721cb0ef41Sopenharmony_ci// We use the lower-level API here 731cb0ef41Sopenharmony_ciserver.on('stream', common.mustCall(onStream)); 741cb0ef41Sopenharmony_ci 751cb0ef41Sopenharmony_cifunction onStream(stream, headers, flags) { 761cb0ef41Sopenharmony_ci assert.strictEqual(headers[':scheme'], 'http'); 771cb0ef41Sopenharmony_ci assert.ok(headers[':authority']); 781cb0ef41Sopenharmony_ci assert.strictEqual(headers[':method'], 'GET'); 791cb0ef41Sopenharmony_ci assert.strictEqual(flags, 5); 801cb0ef41Sopenharmony_ci stream.respond({ 811cb0ef41Sopenharmony_ci 'content-type': 'text/html', 821cb0ef41Sopenharmony_ci ':status': 200 831cb0ef41Sopenharmony_ci }); 841cb0ef41Sopenharmony_ci stream.write(body.slice(0, 20)); 851cb0ef41Sopenharmony_ci stream.end(body.slice(20)); 861cb0ef41Sopenharmony_ci} 871cb0ef41Sopenharmony_ci 881cb0ef41Sopenharmony_ciserver.on('session', common.mustCall((session) => { 891cb0ef41Sopenharmony_ci session.ping(common.mustCall()); 901cb0ef41Sopenharmony_ci})); 911cb0ef41Sopenharmony_ci 921cb0ef41Sopenharmony_ciserver.listen(0); 931cb0ef41Sopenharmony_ci 941cb0ef41Sopenharmony_ciserver.on('listening', common.mustCall(() => { 951cb0ef41Sopenharmony_ci 961cb0ef41Sopenharmony_ci const client = h2.connect(`http://localhost:${server.address().port}`); 971cb0ef41Sopenharmony_ci 981cb0ef41Sopenharmony_ci client.on('connect', common.mustCall(() => { 991cb0ef41Sopenharmony_ci client.ping(common.mustCall()); 1001cb0ef41Sopenharmony_ci })); 1011cb0ef41Sopenharmony_ci 1021cb0ef41Sopenharmony_ci const req = client.request(); 1031cb0ef41Sopenharmony_ci 1041cb0ef41Sopenharmony_ci req.on('response', common.mustCall()); 1051cb0ef41Sopenharmony_ci 1061cb0ef41Sopenharmony_ci let data = ''; 1071cb0ef41Sopenharmony_ci req.setEncoding('utf8'); 1081cb0ef41Sopenharmony_ci req.on('data', (d) => data += d); 1091cb0ef41Sopenharmony_ci req.on('end', common.mustCall(() => { 1101cb0ef41Sopenharmony_ci assert.strictEqual(body, data); 1111cb0ef41Sopenharmony_ci })); 1121cb0ef41Sopenharmony_ci req.on('close', common.mustCall(() => { 1131cb0ef41Sopenharmony_ci client.close(); 1141cb0ef41Sopenharmony_ci server.close(); 1151cb0ef41Sopenharmony_ci })); 1161cb0ef41Sopenharmony_ci 1171cb0ef41Sopenharmony_ci})); 118