// Flags: --expose-internals 'use strict'; const common = require('../common'); const { recordState } = require('../common/heap'); if (!common.hasCrypto) common.skip('missing crypto'); const http2 = require('http2'); { const state = recordState(); state.validateSnapshotNodes('Node / Http2Session', []); state.validateSnapshotNodes('Node / Http2Stream', []); } const server = http2.createServer(); server.on('stream', (stream) => { stream.respondWithFile(__filename); }); server.listen(0, () => { const client = http2.connect(`http://localhost:${server.address().port}`); const req = client.request(); req.on('response', common.mustCall(() => { const state = recordState(); // `Node / Http2Stream` (C++) -> Http2Stream (JS) state.validateSnapshotNodes('Node / Http2Stream', [ { children: [ // current_headers and/or queue could be empty { node_name: 'Http2Stream', edge_name: 'wrapped' } ] }, ], { loose: true }); // `Node / FileHandle` (C++) -> FileHandle (JS) state.validateSnapshotNodes('Node / FileHandle', [ { children: [ { node_name: 'FileHandle', edge_name: 'wrapped' } // current_headers could be empty ] } ], { loose: true }); state.validateSnapshotNodes('Node / TCPSocketWrap', [ { children: [ { node_name: 'TCP', edge_name: 'wrapped' } ] } ], { loose: true }); state.validateSnapshotNodes('Node / TCPServerWrap', [ { children: [ { node_name: 'TCP', edge_name: 'wrapped' } ] } ], { loose: true }); // `Node / StreamPipe` (C++) -> StreamPipe (JS) state.validateSnapshotNodes('Node / StreamPipe', [ { children: [ { node_name: 'StreamPipe', edge_name: 'wrapped' } ] } ]); // `Node / Http2Session` (C++) -> Http2Session (JS) state.validateSnapshotNodes('Node / Http2Session', [ { children: [ { node_name: 'Http2Session', edge_name: 'wrapped' }, { node_name: 'Node / streams', edge_name: 'streams' } // outstanding_pings, outgoing_buffers, outgoing_storage, // pending_rst_streams could be empty ] } ], { loose: true }); })); req.resume(); req.on('end', common.mustCall(() => { client.close(); server.close(); })); req.end(); });